aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deymo <deymo@google.com>2018-01-08 20:43:13 +0000
committerandroid-build-merger <android-build-merger@google.com>2018-01-08 20:43:13 +0000
commitfb9bb4b2ab398c43e78c91e514b108e0ed83520d (patch)
tree10f2cc17311582d8f1b00ecf3ab0c4af213b839d
parent10454ac0160379de136bacbd7919f97228e906e6 (diff)
parent484d473385b76e888a2f692b4b6ada6d594868fe (diff)
downloadandroid_external_curl-fb9bb4b2ab398c43e78c91e514b108e0ed83520d.tar.gz
android_external_curl-fb9bb4b2ab398c43e78c91e514b108e0ed83520d.tar.bz2
android_external_curl-fb9bb4b2ab398c43e78c91e514b108e0ed83520d.zip
Merge "Update from 7.55.1 to 7.57.0" am: 96660a18c5
am: 484d473385 Change-Id: I32e13d89b042b3e0f824bd2cc1f1da4b65140f0b
-rw-r--r--Android.bp6
-rw-r--r--CHANGES5984
-rw-r--r--CMake/Macros.cmake29
-rw-r--r--CMake/curl-config.cmake59
-rw-r--r--CMakeLists.txt146
-rw-r--r--Makefile.am12
-rw-r--r--README.version4
-rw-r--r--RELEASE-NOTES207
-rwxr-xr-x[-rw-r--r--]acinclude.m4325
-rwxr-xr-xconfigure1962
-rwxr-xr-x[-rw-r--r--]configure.ac318
-rw-r--r--docs/BUGS8
-rw-r--r--docs/CODE_OF_CONDUCT.md4
-rw-r--r--docs/FAQ2
-rw-r--r--docs/HELP-US.md70
-rw-r--r--docs/HISTORY.md18
-rw-r--r--docs/INSTALL.md3
-rw-r--r--docs/INTERNALS.md70
-rw-r--r--docs/KNOWN_BUGS16
-rw-r--r--docs/MAIL-ETIQUETTE31
-rw-r--r--docs/Makefile.am5
-rw-r--r--docs/RELEASE-PROCEDURE9
-rw-r--r--docs/RESOURCES2
-rw-r--r--docs/ROADMAP.md94
-rw-r--r--docs/THANKS61
-rw-r--r--docs/TODO84
-rw-r--r--docs/cmdline-opts/Makefile.inc3
-rw-r--r--docs/cmdline-opts/cacert.d2
-rw-r--r--docs/cmdline-opts/compressed-ssh.d7
-rw-r--r--docs/cmdline-opts/form-string.d4
-rw-r--r--docs/cmdline-opts/form.d94
-rw-r--r--docs/cmdline-opts/interface.d4
-rw-r--r--docs/cmdline-opts/request-target.d1
-rw-r--r--docs/cmdline-opts/resolve.d2
-rw-r--r--docs/cmdline-opts/tlsv1.3.d3
-rw-r--r--docs/curl-config.12
-rw-r--r--docs/curl.1112
-rw-r--r--docs/examples/10-at-a-time.c8
-rw-r--r--docs/examples/Makefile.inc10
-rw-r--r--docs/examples/anyauthput.c4
-rw-r--r--docs/examples/cacertinmem.c44
-rw-r--r--docs/examples/chkspeed.c4
-rw-r--r--docs/examples/curlx.c74
-rw-r--r--docs/examples/debug.c24
-rw-r--r--docs/examples/evhiperfifo.c24
-rw-r--r--docs/examples/fopen.c81
-rw-r--r--docs/examples/ftpget.c8
-rw-r--r--docs/examples/ftpsget.c8
-rw-r--r--docs/examples/ftpupload.c4
-rw-r--r--docs/examples/ftpuploadresume.c36
-rw-r--r--docs/examples/ghiper.c44
-rw-r--r--docs/examples/hiperfifo.c22
-rw-r--r--docs/examples/htmltidy.c6
-rw-r--r--docs/examples/http2-download.c30
-rw-r--r--docs/examples/http2-serverpush.c28
-rw-r--r--docs/examples/http2-upload.c30
-rw-r--r--docs/examples/httpput.c4
-rw-r--r--docs/examples/imap-multi.c4
-rw-r--r--docs/examples/multi-app.c12
-rw-r--r--docs/examples/multi-debugcallback.c26
-rw-r--r--docs/examples/multi-double.c4
-rw-r--r--docs/examples/multi-formadd.c171
-rw-r--r--docs/examples/multi-post.c62
-rw-r--r--docs/examples/multithread.c4
-rw-r--r--docs/examples/opensslthreadlock.c4
-rw-r--r--docs/examples/pop3-multi.c4
-rw-r--r--docs/examples/post-callback.c55
-rw-r--r--docs/examples/postinmemory.c4
-rw-r--r--docs/examples/postit2-formadd.c107
-rw-r--r--docs/examples/postit2.c56
-rw-r--r--docs/examples/rtsp.c3
-rw-r--r--docs/examples/sendrecv.c4
-rw-r--r--docs/examples/sftpget.c8
-rw-r--r--docs/examples/shared-connection-cache.c85
-rw-r--r--docs/examples/simplepost.c4
-rw-r--r--docs/examples/simplessl.c4
-rw-r--r--docs/examples/smooth-gtk-thread.c6
-rw-r--r--docs/examples/smtp-mail.c4
-rw-r--r--docs/examples/smtp-mime.c162
-rw-r--r--docs/examples/smtp-multi.c8
-rw-r--r--docs/examples/smtp-ssl.c4
-rw-r--r--docs/examples/smtp-tls.c4
-rw-r--r--docs/examples/sslbackend.c77
-rw-r--r--docs/examples/synctime.c10
-rw-r--r--docs/examples/threaded-ssl.c18
-rw-r--r--docs/examples/usercertinmem.c4
-rw-r--r--docs/libcurl/Makefile.inc6
-rw-r--r--docs/libcurl/curl_easy_cleanup.32
-rw-r--r--docs/libcurl/curl_easy_duphandle.32
-rw-r--r--docs/libcurl/curl_easy_escape.32
-rw-r--r--docs/libcurl/curl_easy_getinfo.32
-rw-r--r--docs/libcurl/curl_easy_init.32
-rw-r--r--docs/libcurl/curl_easy_pause.32
-rw-r--r--docs/libcurl/curl_easy_perform.32
-rw-r--r--docs/libcurl/curl_easy_recv.32
-rw-r--r--docs/libcurl/curl_easy_reset.32
-rw-r--r--docs/libcurl/curl_easy_send.32
-rw-r--r--docs/libcurl/curl_easy_setopt.36
-rw-r--r--docs/libcurl/curl_easy_strerror.32
-rw-r--r--docs/libcurl/curl_easy_unescape.32
-rw-r--r--docs/libcurl/curl_escape.32
-rw-r--r--docs/libcurl/curl_formadd.328
-rw-r--r--docs/libcurl/curl_formfree.310
-rw-r--r--docs/libcurl/curl_formget.39
-rw-r--r--docs/libcurl/curl_free.32
-rw-r--r--docs/libcurl/curl_getdate.32
-rw-r--r--docs/libcurl/curl_getenv.32
-rw-r--r--docs/libcurl/curl_global_cleanup.32
-rw-r--r--docs/libcurl/curl_global_init.38
-rw-r--r--docs/libcurl/curl_global_init_mem.32
-rw-r--r--docs/libcurl/curl_global_sslset.398
-rw-r--r--docs/libcurl/curl_mime_addpart.367
-rw-r--r--docs/libcurl/curl_mime_data.370
-rw-r--r--docs/libcurl/curl_mime_data_cb.3161
-rw-r--r--docs/libcurl/curl_mime_encoder.398
-rw-r--r--docs/libcurl/curl_mime_filedata.382
-rw-r--r--docs/libcurl/curl_mime_filename.373
-rw-r--r--docs/libcurl/curl_mime_free.349
-rw-r--r--docs/libcurl/curl_mime_headers.366
-rw-r--r--docs/libcurl/curl_mime_init.370
-rw-r--r--docs/libcurl/curl_mime_name.364
-rw-r--r--docs/libcurl/curl_mime_subparts.354
-rw-r--r--docs/libcurl/curl_mime_type.384
-rw-r--r--docs/libcurl/curl_mprintf.32
-rw-r--r--docs/libcurl/curl_multi_add_handle.32
-rw-r--r--docs/libcurl/curl_multi_assign.32
-rw-r--r--docs/libcurl/curl_multi_cleanup.32
-rw-r--r--docs/libcurl/curl_multi_fdset.311
-rw-r--r--docs/libcurl/curl_multi_info_read.32
-rw-r--r--docs/libcurl/curl_multi_init.32
-rw-r--r--docs/libcurl/curl_multi_perform.32
-rw-r--r--docs/libcurl/curl_multi_remove_handle.32
-rw-r--r--docs/libcurl/curl_multi_setopt.32
-rw-r--r--docs/libcurl/curl_multi_socket.32
-rw-r--r--docs/libcurl/curl_multi_socket_action.32
-rw-r--r--docs/libcurl/curl_multi_strerror.32
-rw-r--r--docs/libcurl/curl_multi_timeout.32
-rw-r--r--docs/libcurl/curl_multi_wait.32
-rw-r--r--docs/libcurl/curl_share_cleanup.32
-rw-r--r--docs/libcurl/curl_share_init.32
-rw-r--r--docs/libcurl/curl_share_setopt.311
-rw-r--r--docs/libcurl/curl_share_strerror.32
-rw-r--r--docs/libcurl/curl_slist_append.32
-rw-r--r--docs/libcurl/curl_slist_free_all.32
-rw-r--r--docs/libcurl/curl_strequal.32
-rw-r--r--docs/libcurl/curl_unescape.32
-rw-r--r--docs/libcurl/curl_version.32
-rw-r--r--docs/libcurl/curl_version_info.316
-rw-r--r--docs/libcurl/libcurl-easy.32
-rw-r--r--docs/libcurl/libcurl-errors.32
-rw-r--r--docs/libcurl/libcurl-multi.32
-rw-r--r--docs/libcurl/libcurl-share.311
-rw-r--r--docs/libcurl/libcurl-symbols.350
-rw-r--r--docs/libcurl/libcurl-thread.32
-rw-r--r--docs/libcurl/libcurl-tutorial.3268
-rw-r--r--docs/libcurl/libcurl.36
-rw-r--r--docs/libcurl/opts/CURLINFO_ACTIVESOCKET.32
-rw-r--r--docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CERTINFO.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONDITION_UNMET.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONNECT_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_TYPE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_COOKIELIST.32
-rw-r--r--docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.32
-rw-r--r--docs/libcurl/opts/CURLINFO_FILETIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HEADER_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.35
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_VERSION.32
-rw-r--r--docs/libcurl/opts/CURLINFO_LASTSOCKET.32
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_IP.32
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_PORT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_NUM_CONNECTS.32
-rw-r--r--docs/libcurl/opts/CURLINFO_OS_ERRNO.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_IP.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_PORT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIVATE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PROTOCOL.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.35
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_URL.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REQUEST_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RESPONSE_CODE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SCHEME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_ENGINES.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SESSION.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TOTAL_TIME.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAXCONNECTS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_APPEND.32
-rw-r--r--docs/libcurl/opts/CURLOPT_AUTOREFERER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_BUFFERSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CAINFO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CAPATH.37
-rw-r--r--docs/libcurl/opts/CURLOPT_CERTINFO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.311
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.36
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_ONLY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_TO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEJAR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIELIST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIESESSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLF.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DIRLISTONLY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_INTERFACE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_SERVERS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_EGDSOCKET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ERRORBUFFER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FAILONERROR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FILETIME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FORBID_REUSE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FRESH_CONNECT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPSSLAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.36
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_PRET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADEROPT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP200ALIASES.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPGET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPHEADER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPOST.313
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_VERSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERFACE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.39
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.310
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IPRESOLVE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ISSUERCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_KEYPASSWD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_KRBLEVEL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_AUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_FROM.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_RCPT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXCONNECTS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXREDIRS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MIMEPOST.353
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC_FILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOBODY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROGRESS.312
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROXY.37
-rw-r--r--docs/libcurl/opts/CURLOPT_NOSIGNAL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PATH_AS_IS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PIPEWAIT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTQUOTE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTREDIR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PREQUOTE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PRE_PROXY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PRIVATE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROTOCOLS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY.35
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYHEADER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERPWD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAINFO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAPATH.37
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PUT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_QUOTE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RANDOM_FILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RANGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_READDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_READFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_REFERER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_REQUEST_TARGET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_REQUEST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SASL_IR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SERVICE_NAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SHARE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.359
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERTTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLVERSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_FALSESTART.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STDERR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_NODELAY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TELNETOPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMECONDITION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT.39
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEVALUE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFERTEXT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_UPLOAD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_URL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_USERAGENT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_USERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_USERPWD.33
-rw-r--r--docs/libcurl/opts/CURLOPT_USE_SSL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_VERBOSE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_WILDCARDMATCH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFODATA.36
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.32
-rw-r--r--docs/libcurl/opts/Makefile.inc2
-rw-r--r--docs/libcurl/symbols-in-versions66
-rw-r--r--include/README2
-rw-r--r--include/curl/curl.h242
-rw-r--r--include/curl/curlver.h10
-rw-r--r--include/curl/multi.h2
-rw-r--r--include/curl/system.h112
-rw-r--r--include/curl/typecheck-gcc.h6
-rw-r--r--lib/CMakeLists.txt19
-rw-r--r--lib/Makefile.am16
-rw-r--r--lib/Makefile.inc7
-rw-r--r--lib/Makefile.m3278
-rw-r--r--lib/asyn-ares.c28
-rw-r--r--lib/asyn-thread.c24
-rwxr-xr-xlib/checksrc.pl55
-rw-r--r--lib/config-dos.h6
-rw-r--r--lib/config-os400.h10
-rw-r--r--lib/config-tpf.h3
-rw-r--r--lib/config-win32.h8
-rw-r--r--lib/config-win32ce.h3
-rw-r--r--lib/conncache.c141
-rw-r--r--lib/conncache.h10
-rw-r--r--lib/connect.c156
-rw-r--r--lib/connect.h7
-rw-r--r--lib/content_encoding.c739
-rw-r--r--lib/content_encoding.h45
-rw-r--r--lib/cookie.c144
-rw-r--r--lib/cookie.h11
-rw-r--r--lib/curl_addrinfo.c6
-rw-r--r--lib/curl_config.h30
-rw-r--r--lib/curl_config.h.cmake12
-rw-r--r--lib/curl_config.h.in33
-rw-r--r--lib/curl_fnmatch.c32
-rw-r--r--lib/curl_ntlm_core.c117
-rw-r--r--lib/curl_ntlm_core.h14
-rw-r--r--lib/curl_ntlm_wb.c7
-rw-r--r--lib/curl_sasl.c6
-rw-r--r--lib/curl_setup.h20
-rw-r--r--lib/curl_sha256.h32
-rw-r--r--lib/curlx.h12
-rw-r--r--lib/dict.c14
-rw-r--r--lib/dotdot.c30
-rw-r--r--lib/easy.c103
-rw-r--r--lib/escape.c26
-rw-r--r--lib/file.c43
-rw-r--r--lib/formdata.c887
-rw-r--r--lib/formdata.h54
-rw-r--r--lib/ftp.c218
-rw-r--r--lib/ftp.h1
-rw-r--r--lib/ftplistparser.c213
-rw-r--r--lib/getinfo.c32
-rw-r--r--lib/gopher.c10
-rw-r--r--lib/hash.c4
-rw-r--r--lib/hostasyn.c10
-rw-r--r--lib/hostcheck.c14
-rw-r--r--lib/hostip.c29
-rw-r--r--lib/hostip4.c13
-rw-r--r--lib/hostip6.c14
-rw-r--r--lib/hostsyn.c10
-rw-r--r--lib/http.c494
-rw-r--r--lib/http.h6
-rw-r--r--lib/http2.c20
-rw-r--r--lib/http_chunks.c68
-rw-r--r--lib/http_ntlm.c13
-rw-r--r--lib/http_proxy.c32
-rw-r--r--lib/if2ip.c6
-rw-r--r--lib/imap.c145
-rw-r--r--lib/imap.h3
-rw-r--r--lib/inet_ntop.c2
-rw-r--r--lib/ldap.c8
-rw-r--r--lib/libcurl.plist6
-rw-r--r--lib/llist.c6
-rw-r--r--lib/memdebug.c54
-rw-r--r--lib/memdebug.h15
-rw-r--r--lib/mime.c1908
-rw-r--r--lib/mime.h137
-rwxr-xr-xlib/mk-ca-bundle.pl4
-rw-r--r--lib/mprintf.c38
-rw-r--r--lib/multi.c206
-rw-r--r--lib/multihandle.h4
-rw-r--r--lib/netrc.c39
-rw-r--r--lib/non-ascii.c83
-rw-r--r--lib/non-ascii.h4
-rw-r--r--lib/openldap.c16
-rw-r--r--lib/parsedate.c64
-rw-r--r--lib/pingpong.c51
-rw-r--r--lib/pingpong.h4
-rw-r--r--lib/progress.c84
-rw-r--r--lib/progress.h2
-rw-r--r--lib/rand.c2
-rw-r--r--lib/rtsp.c20
-rw-r--r--lib/security.c4
-rw-r--r--lib/select.c12
-rw-r--r--lib/sendf.c60
-rw-r--r--lib/setopt.c2554
-rw-r--r--lib/setopt.h (renamed from src/tool_mfiles.h)29
-rw-r--r--lib/sha256.c262
-rw-r--r--lib/share.c6
-rw-r--r--lib/share.h5
-rw-r--r--lib/smb.c2
-rw-r--r--lib/smtp.c48
-rw-r--r--lib/socks.c26
-rw-r--r--lib/socks_gssapi.c59
-rw-r--r--lib/socks_sspi.c24
-rw-r--r--lib/speedcheck.c2
-rw-r--r--lib/splay.c2
-rw-r--r--lib/splay.h4
-rw-r--r--lib/ssh.c62
-rw-r--r--lib/strcase.c11
-rw-r--r--lib/strdup.c6
-rw-r--r--lib/strtoofft.c66
-rw-r--r--lib/strtoofft.h37
-rw-r--r--lib/telnet.c38
-rw-r--r--lib/tftp.c63
-rw-r--r--lib/timeval.c98
-rw-r--r--lib/timeval.h27
-rw-r--r--lib/transfer.c204
-rw-r--r--lib/transfer.h5
-rw-r--r--lib/url.c2802
-rw-r--r--lib/url.h12
-rw-r--r--lib/urldata.h225
-rw-r--r--lib/vauth/digest.c194
-rw-r--r--lib/vauth/digest.h6
-rw-r--r--lib/vauth/digest_sspi.c4
-rw-r--r--lib/vauth/ntlm.c19
-rw-r--r--lib/vauth/ntlm_sspi.c9
-rw-r--r--lib/vauth/vauth.h5
-rw-r--r--lib/version.c56
-rw-r--r--lib/vtls/axtls.c190
-rw-r--r--lib/vtls/axtls.h39
-rw-r--r--lib/vtls/cyassl.c223
-rw-r--r--lib/vtls/cyassl.h63
-rw-r--r--lib/vtls/darwinssl.c542
-rw-r--r--lib/vtls/darwinssl.h71
-rw-r--r--lib/vtls/gskit.c191
-rw-r--r--lib/vtls/gskit.h38
-rw-r--r--lib/vtls/gtls.c210
-rw-r--r--lib/vtls/gtls.h64
-rw-r--r--lib/vtls/mbedtls.c237
-rw-r--r--lib/vtls/mbedtls.h52
-rw-r--r--lib/vtls/nss.c217
-rw-r--r--lib/vtls/nssg.h71
-rw-r--r--lib/vtls/openssl.c597
-rw-r--r--lib/vtls/openssl.h91
-rw-r--r--lib/vtls/polarssl.c198
-rw-r--r--lib/vtls/polarssl.h52
-rw-r--r--lib/vtls/polarssl_threadlock.c4
-rw-r--r--lib/vtls/schannel.c532
-rw-r--r--lib/vtls/schannel.h89
-rw-r--r--lib/vtls/vtls.c513
-rw-r--r--lib/vtls/vtls.h82
-rw-r--r--lib/warnless.c32
-rw-r--r--local-configure.patch22
-rw-r--r--m4/curl-compilers.m49
-rw-r--r--m4/curl-confopts.m48
-rw-r--r--packages/OS400/README.OS4003
-rw-r--r--packages/OS400/curl.inc.in4
-rw-r--r--packages/OS400/makefile.sh5
-rw-r--r--packages/Symbian/group/libcurl.mmp2
-rw-r--r--projects/Windows/VC10/lib/libcurl.vcxproj6
-rw-r--r--projects/Windows/VC10/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC11/lib/libcurl.vcxproj6
-rw-r--r--projects/Windows/VC11/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC12/lib/libcurl.vcxproj6
-rw-r--r--projects/Windows/VC12/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC14/lib/libcurl.vcxproj6
-rw-r--r--projects/Windows/VC14/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC6/lib/libcurl.dsp24
-rw-r--r--projects/Windows/VC6/src/curl.dsp8
-rw-r--r--projects/Windows/VC7.1/lib/libcurl.vcproj18
-rw-r--r--projects/Windows/VC7.1/src/curl.vcproj6
-rw-r--r--projects/Windows/VC7/lib/libcurl.vcproj18
-rw-r--r--projects/Windows/VC7/src/curl.vcproj6
-rw-r--r--projects/Windows/VC8/lib/libcurl.vcproj24
-rw-r--r--projects/Windows/VC8/src/curl.vcproj8
-rw-r--r--projects/Windows/VC9/lib/libcurl.vcproj24
-rw-r--r--projects/Windows/VC9/src/curl.vcproj8
-rw-r--r--projects/build-openssl.bat11
-rwxr-xr-xscripts/zsh.pl5
-rw-r--r--src/CMakeLists.txt15
-rw-r--r--src/Makefile.inc2
-rw-r--r--src/Makefile.m3265
-rwxr-xr-x[-rw-r--r--]src/mkhelp.pl2
-rw-r--r--src/tool_cb_dbg.c29
-rw-r--r--src/tool_cb_hdr.c17
-rw-r--r--src/tool_cb_prg.c4
-rw-r--r--src/tool_cfgable.c8
-rw-r--r--src/tool_cfgable.h6
-rw-r--r--src/tool_easysrc.c20
-rw-r--r--src/tool_easysrc.h4
-rw-r--r--src/tool_formparse.c832
-rw-r--r--src/tool_formparse.h6
-rw-r--r--src/tool_getparam.c59
-rw-r--r--src/tool_help.c12
-rw-r--r--src/tool_hugehelp.c11650
-rw-r--r--src/tool_main.c9
-rw-r--r--src/tool_metalink.c46
-rw-r--r--src/tool_mfiles.c127
-rw-r--r--src/tool_msgs.c4
-rw-r--r--src/tool_operate.c110
-rw-r--r--src/tool_paramhlp.c36
-rw-r--r--src/tool_parsecfg.c4
-rw-r--r--src/tool_sdecls.h4
-rw-r--r--src/tool_setopt.c303
-rw-r--r--src/tool_setopt.h12
-rw-r--r--src/tool_strdup.c6
-rw-r--r--src/tool_urlglob.c32
-rw-r--r--src/tool_version.h2
-rw-r--r--tests/FILEFORMAT3
-rw-r--r--tests/Makefile.am2
-rwxr-xr-xtests/curl_test_data.py21
-rw-r--r--tests/data/DISABLED2
-rw-r--r--tests/data/Makefile.inc43
-rw-r--r--tests/data/test103425
-rw-r--r--tests/data/test103521
-rw-r--r--tests/data/test10532
-rw-r--r--tests/data/test113314
-rw-r--r--tests/data/test113517
-rw-r--r--tests/data/test114964
-rw-r--r--tests/data/test115055
-rw-r--r--tests/data/test115166
-rw-r--r--tests/data/test115261
-rw-r--r--tests/data/test115361
-rw-r--r--tests/data/test116049
-rw-r--r--tests/data/test116154
-rw-r--r--tests/data/test116252
-rw-r--r--tests/data/test116352
-rw-r--r--tests/data/test126337
-rw-r--r--tests/data/test126436
-rw-r--r--tests/data/test129048
-rw-r--r--tests/data/test129151
-rw-r--r--tests/data/test13154
-rw-r--r--tests/data/test132456
-rw-r--r--tests/data/test14014
-rw-r--r--tests/data/test140467
-rw-r--r--tests/data/test14222
-rw-r--r--tests/data/test144938
-rw-r--r--tests/data/test145338
-rw-r--r--tests/data/test155252
-rw-r--r--tests/data/test155352
-rw-r--r--tests/data/test155477
-rw-r--r--tests/data/test1581
-rw-r--r--tests/data/test1631
-rw-r--r--tests/data/test1661
-rw-r--r--tests/data/test1731
-rw-r--r--tests/data/test1865
-rw-r--r--tests/data/test190479
-rw-r--r--tests/data/test205687
-rw-r--r--tests/data/test2057108
-rw-r--r--tests/data/test2058107
-rw-r--r--tests/data/test2059107
-rw-r--r--tests/data/test2060107
-rw-r--r--tests/data/test206184
-rw-r--r--tests/data/test206284
-rw-r--r--tests/data/test206384
-rw-r--r--tests/data/test206484
-rw-r--r--tests/data/test206584
-rw-r--r--tests/data/test206684
-rw-r--r--tests/data/test206789
-rw-r--r--tests/data/test206889
-rw-r--r--tests/data/test206989
-rw-r--r--tests/data/test207041
-rw-r--r--tests/data/test207141
-rw-r--r--tests/data/test207238
-rw-r--r--tests/data/test2205
-rw-r--r--tests/data/test2215
-rw-r--r--tests/data/test2225
-rw-r--r--tests/data/test2235
-rw-r--r--tests/data/test2245
-rw-r--r--tests/data/test230203
-rw-r--r--tests/data/test2378
-rw-r--r--tests/data/test24454
-rw-r--r--tests/data/test2596
-rw-r--r--tests/data/test2775
-rw-r--r--tests/data/test2982
-rw-r--r--tests/data/test3081
-rw-r--r--tests/data/test314198
-rw-r--r--tests/data/test31591
-rw-r--r--tests/data/test410
-rw-r--r--tests/data/test464
-rw-r--r--tests/data/test50616
-rw-r--r--tests/data/test5548
-rw-r--r--tests/data/test5642
-rw-r--r--tests/data/test57755
-rw-r--r--tests/data/test5874
-rw-r--r--tests/data/test58955
-rw-r--r--tests/data/test64242
-rw-r--r--tests/data/test643131
-rw-r--r--tests/data/test64459
-rw-r--r--tests/data/test645141
-rw-r--r--tests/data/test64698
-rw-r--r--tests/data/test64779
-rw-r--r--tests/data/test64875
-rw-r--r--tests/data/test64972
-rw-r--r--tests/data/test650123
-rw-r--r--tests/data/test65173
-rw-r--r--tests/data/test652358
-rw-r--r--tests/data/test65393
-rw-r--r--tests/data/test711
-rw-r--r--tests/data/test8004
-rw-r--r--tests/data/test84650
-rw-r--r--tests/data/test8563
-rw-r--r--tests/data/test91
-rw-r--r--tests/data/test95043
-rwxr-xr-xtests/ftpserver.pl19
-rw-r--r--tests/fuzz/CMakeLists.txt1
-rw-r--r--tests/fuzz/Makefile.am57
-rw-r--r--tests/fuzz/Makefile.inc19
-rw-r--r--tests/fuzz/README14
-rw-r--r--tests/fuzz/curl_fuzzer.c128
-rw-r--r--tests/libtest/Makefile.am15
-rw-r--r--tests/libtest/Makefile.inc40
-rw-r--r--tests/libtest/first.c14
-rw-r--r--tests/libtest/lib1501.c4
-rw-r--r--tests/libtest/lib1502.c4
-rw-r--r--tests/libtest/lib1506.c12
-rw-r--r--tests/libtest/lib1507.c4
-rw-r--r--tests/libtest/lib1510.c6
-rw-r--r--tests/libtest/lib1512.c6
-rw-r--r--tests/libtest/lib1513.c4
-rw-r--r--tests/libtest/lib1515.c5
-rw-r--r--tests/libtest/lib1517.c4
-rw-r--r--tests/libtest/lib1521.c27
-rw-r--r--tests/libtest/lib1531.c8
-rw-r--r--tests/libtest/lib1538.c7
-rw-r--r--tests/libtest/lib1550.c13
-rw-r--r--tests/libtest/lib1551.c2
-rw-r--r--tests/libtest/lib1552.c93
-rw-r--r--tests/libtest/lib1553.c109
-rw-r--r--tests/libtest/lib1554.c81
-rw-r--r--tests/libtest/lib1900.c14
-rw-r--r--tests/libtest/lib500.c4
-rw-r--r--tests/libtest/lib501.c5
-rw-r--r--tests/libtest/lib502.c4
-rw-r--r--tests/libtest/lib503.c4
-rw-r--r--tests/libtest/lib504.c4
-rw-r--r--tests/libtest/lib505.c4
-rw-r--r--tests/libtest/lib506.c8
-rw-r--r--tests/libtest/lib507.c4
-rw-r--r--tests/libtest/lib508.c4
-rw-r--r--tests/libtest/lib510.c4
-rw-r--r--tests/libtest/lib513.c4
-rw-r--r--tests/libtest/lib514.c4
-rw-r--r--tests/libtest/lib515.c4
-rw-r--r--tests/libtest/lib516.c4
-rw-r--r--tests/libtest/lib517.c4
-rw-r--r--tests/libtest/lib525.c4
-rw-r--r--tests/libtest/lib526.c12
-rw-r--r--tests/libtest/lib530.c10
-rw-r--r--tests/libtest/lib533.c6
-rw-r--r--tests/libtest/lib536.c4
-rw-r--r--tests/libtest/lib540.c10
-rw-r--r--tests/libtest/lib543.c12
-rw-r--r--tests/libtest/lib544.c4
-rw-r--r--tests/libtest/lib547.c4
-rw-r--r--tests/libtest/lib552.c36
-rw-r--r--tests/libtest/lib553.c8
-rw-r--r--tests/libtest/lib554.c17
-rw-r--r--tests/libtest/lib555.c8
-rw-r--r--tests/libtest/lib556.c4
-rw-r--r--tests/libtest/lib557.c93
-rw-r--r--tests/libtest/lib560.c4
-rw-r--r--tests/libtest/lib564.c4
-rw-r--r--tests/libtest/lib567.c4
-rw-r--r--tests/libtest/lib568.c6
-rw-r--r--tests/libtest/lib569.c4
-rw-r--r--tests/libtest/lib570.c4
-rw-r--r--tests/libtest/lib571.c6
-rw-r--r--tests/libtest/lib572.c6
-rw-r--r--tests/libtest/lib573.c4
-rw-r--r--tests/libtest/lib575.c4
-rw-r--r--tests/libtest/lib578.c4
-rw-r--r--tests/libtest/lib579.c4
-rw-r--r--tests/libtest/lib586.c10
-rw-r--r--tests/libtest/lib589.c59
-rw-r--r--tests/libtest/lib591.c4
-rw-r--r--tests/libtest/lib597.c11
-rw-r--r--tests/libtest/lib599.c4
-rw-r--r--tests/libtest/lib643.c297
-rw-r--r--tests/libtest/lib650.c211
-rw-r--r--tests/libtest/lib651.c94
-rw-r--r--tests/libtest/lib652.c128
-rw-r--r--tests/libtest/lib653.c63
-rw-r--r--tests/libtest/libntlmconnect.c4
-rw-r--r--tests/libtest/mk-lib1521.pl12
-rw-r--r--tests/libtest/stub_gssapi.c397
-rw-r--r--tests/libtest/stub_gssapi.h183
-rw-r--r--tests/libtest/testtrace.c22
-rwxr-xr-xtests/memanalyze.pl30
-rw-r--r--tests/runtests.12
-rwxr-xr-xtests/runtests.pl154
-rw-r--r--tests/server/Makefile.inc2
-rw-r--r--tests/server/fake_ntlm.c13
-rw-r--r--tests/server/getpart.c42
-rw-r--r--tests/server/resolve.c6
-rw-r--r--tests/server/rtspd.c42
-rw-r--r--tests/server/sockfilt.c16
-rw-r--r--tests/server/sws.c67
-rw-r--r--tests/server/tftpd.c14
-rw-r--r--tests/server/util.c119
-rw-r--r--tests/server/util.h3
-rw-r--r--tests/testcurl.12
-rw-r--r--tests/unit/unit1300.c2
-rw-r--r--tests/unit/unit1301.c4
-rw-r--r--tests/unit/unit1302.c6
-rw-r--r--tests/unit/unit1303.c8
-rw-r--r--tests/unit/unit1305.c4
-rw-r--r--tests/unit/unit1308.c6
-rw-r--r--tests/unit/unit1309.c18
-rw-r--r--tests/unit/unit1323.c4
-rw-r--r--tests/unit/unit1395.c4
-rw-r--r--tests/unit/unit1396.c12
-rw-r--r--tests/unit/unit1398.c4
-rw-r--r--tests/unit/unit1399.c97
-rw-r--r--tests/unit/unit1600.c8
-rw-r--r--tests/unit/unit1605.c17
-rw-r--r--tests/unit/unit1606.c37
-rw-r--r--winbuild/BUILD.WINDOWS.txt1
-rw-r--r--winbuild/MakefileBuild.vc2
895 files changed, 34217 insertions, 20241 deletions
diff --git a/Android.bp b/Android.bp
index 4938592..ae5a0cc 100644
--- a/Android.bp
+++ b/Android.bp
@@ -34,7 +34,6 @@ cc_defaults {
"-DSIZEOF_LONG_LONG=8",
"-DSIZEOF_SIZE_T=4",
"-DSIZEOF_TIME_T=4",
- "-DSIZEOF_VOIDP=4",
],
},
lib64: {
@@ -43,7 +42,6 @@ cc_defaults {
"-DSIZEOF_LONG_LONG=8",
"-DSIZEOF_SIZE_T=8",
"-DSIZEOF_TIME_T=8",
- "-DSIZEOF_VOIDP=8",
],
},
},
@@ -163,6 +161,9 @@ cc_library {
"lib/curl_endian.c",
"lib/curl_des.c",
"lib/system_win32.c",
+ "lib/mime.c",
+ "lib/sha256.c",
+ "lib/setopt.c",
"lib/vauth/vauth.c",
"lib/vauth/cleartext.c",
"lib/vauth/cram.c",
@@ -229,7 +230,6 @@ cc_binary {
"src/tool_libinfo.c",
"src/tool_main.c",
"src/tool_metalink.c",
- "src/tool_mfiles.c",
"src/tool_msgs.c",
"src/tool_operate.c",
"src/tool_operhlp.c",
diff --git a/CHANGES b/CHANGES
index 142c174..fb02a80 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,3227 @@
Changelog
+Version 7.57.0 (29 Nov 2017)
+
+Daniel Stenberg (29 Nov 2017)
+- RELEASE-NOTES: curl 7.57.0
+
+- THANKS: added contributors from 7.57.0 release
+
+- openssl: fix boringssl build again
+
+ commit d3ab7c5a21e broke the boringssl build since it doesn't have
+ RSA_flags(), so we disable that code block for boringssl builds.
+
+ Reported-by: W. Mark Kubacki
+ Fixes #2117
+
+- curl_ntlm_core.c: use the limits.h's SIZE_T_MAX if provided
+
+- libcurl-share.3: the connection cache is shareable now
+
+- global_init: ignore CURL_GLOBAL_SSL's absense
+
+ This bit is no longer used. It is not clear what it meant for users to
+ "init the TLS" in a world with different TLS backends and since the
+ introduction of multissl, libcurl didn't properly work if inited without
+ this bit set.
+
+ Not a single user responded to the call for users of it:
+ https://curl.haxx.se/mail/lib-2017-11/0072.html
+
+ Reported-by: Evgeny Grin
+ Assisted-by: Jay Satiro
+
+ Fixes #2089
+ Fixes #2083
+ Closes #2107
+
+- ntlm: avoid integer overflow for malloc size
+
+ Reported-by: Alex Nichols
+ Assisted-by: Kamil Dudka and Max Dymond
+
+ CVE-2017-8816
+
+ Bug: https://curl.haxx.se/docs/adv_2017-11e7.html
+
+- wildcardmatch: fix heap buffer overflow in setcharset
+
+ The code would previous read beyond the end of the pattern string if the
+ match pattern ends with an open bracket when the default pattern
+ matching function is used.
+
+ Detected by OSS-Fuzz:
+ https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4161
+
+ CVE-2017-8817
+
+ Bug: https://curl.haxx.se/docs/adv_2017-ae72.html
+
+- [Jay Satiro brought this change]
+
+ url: fix alignment of ssl_backend_data struct
+
+ - Align the array of ssl_backend_data on a max 32 byte boundary.
+
+ 8 is likely to be ok but I went with 32 for posterity should one of
+ the ssl_backend_data structs change to contain a larger sized variable
+ in the future.
+
+ Prior to this change (since dev 70f1db3, release 7.56) the connectdata
+ structure was undersized by 4 bytes in 32-bit builds with ssl enabled
+ because long long * was mistakenly used for alignment instead of
+ long long, with the intention being an 8 byte boundary. Also long long
+ may not be an available type.
+
+ The undersized connectdata could lead to oob read/write past the end in
+ what was expected to be the last 4 bytes of the connection's secondary
+ socket https proxy ssl_backend_data struct (the secondary socket in a
+ connection is used by ftp, others?).
+
+ Closes https://github.com/curl/curl/issues/2093
+
+ CVE-2017-8818
+
+ Bug: https://curl.haxx.se/docs/adv_2017-af0a.html
+
+- ssh: remove check for a NULL pointer (!)
+
+ With this check present, scan-build warns that we might dereference this
+ point in other places where it isn't first checked for NULL. Thus, if it
+ *can* be NULL we have a problem on a few places. However, this pointer
+ should not be possible to be NULL here so I remove the check and thus
+ also three different scan-build warnings.
+
+ Closes #2111
+
+- [Matthew Kerwin brought this change]
+
+ test: add test for bad UNC/SMB path in file: URL
+
+- [Matthew Kerwin brought this change]
+
+ test: add tests to ensure basic file: URLs
+
+- [Matthew Kerwin brought this change]
+
+ URL: update "file:" URL handling
+
+ * LOTS of comment updates
+ * explicit error for SMB shares (e.g. "file:////share/path/file")
+ * more strict handling of authority (i.e. "//localhost/")
+ * now accepts dodgy old "C:|" drive letters
+ * more precise handling of drive letters in and out of Windows
+ (especially recognising both "file:c:/" and "file:/c:/")
+
+ Closes #2110
+
+- metalink: fix memory-leak and NULL pointer dereference
+
+ Reported by scan-build
+
+ Closes #2109
+
+- [Alessandro Ghedini brought this change]
+
+ connect: add support for new TCP Fast Open API on Linux
+
+ The new API added in Linux 4.11 only requires setting a socket option
+ before connecting, without the whole sento() machinery.
+
+ Notably, this makes it possible to use TFO with SSL connections on Linux
+ as well, without the need to mess around with OpenSSL (or whatever other
+ SSL library) internals.
+
+ Closes #2056
+
+- make: fix "make distclean"
+
+ Fixes #2097
+ Closes #2108
+
+- RELEASE-NOTES: synced with 31f18d272
+
+Jay Satiro (23 Nov 2017)
+- connect: improve the bind error message
+
+ eg consider a non-existent interface eth8, curl --interface eth8
+
+ Before: curl: (45) Could not resolve host: eth8
+ After: curl: (45) Couldn't bind to 'eth8'
+
+ Bug: https://github.com/curl/curl/issues/2104
+ Reported-by: Alfonso Martone
+
+Daniel Stenberg (23 Nov 2017)
+- examples/rtsp: clear RANGE again after use
+
+ Fixes #2106
+ Reported-by: youngchopin on github
+
+- [Michael Kaufmann brought this change]
+
+ test1264: verify URL with space in host name being rejected
+
+- url: reject ASCII control characters and space in host names
+
+ Host names like "127.0.0.1 moo" would otherwise be accepted by some
+ getaddrinfo() implementations.
+
+ Updated test 1034 and 1035 accordingly.
+
+ Fixes #2073
+ Closes #2092
+
+- Curl_open: fix OOM return error correctly
+
+ Closes #2098
+
+- http2: fix "Value stored to 'end' is never read" scan-build error
+
+- http2: fix "Value stored to 'hdbuf' is never read" scan-build error
+
+- openssl: fix "Value stored to 'rc' is never read" scan-build error
+
+- mime: fix "Value stored to 'sz' is never read" scan-build error
+
+- Curl_llist_remove: fix potential NULL pointer deref
+
+ Fixes a scan-build warning.
+
+- ntlm: remove unnecessary NULL-check to please scan-build
+
+- BUGS: spellchecked
+
+Jay Satiro (18 Nov 2017)
+- [fmmedeiros brought this change]
+
+ examples/curlx: Fix code style
+
+ - Add braces around multi-line if statement.
+
+ Closes https://github.com/curl/curl/pull/2096
+
+Daniel Stenberg (17 Nov 2017)
+- resolve: allow IP address within [] brackets
+
+ ... so that IPv6 addresses can be passed like they can for connect-to
+ and how they're used in URLs.
+
+ Added test 1324 to verify
+ Reported-by: Alex Malinovich
+
+ Fixes #2087
+ Closes #2091
+
+- [Pavol Markovic brought this change]
+
+ macOS: Fix missing connectx function with Xcode version older than 9.0
+
+ The previous fix https://github.com/curl/curl/pull/1788 worked just for
+ Xcode 9. This commit extends the fix to older Xcode versions effectively
+ by not using connectx function.
+
+ Fixes https://github.com/curl/curl/issues/1330
+ Fixes https://github.com/curl/curl/issues/2080
+ Closes https://github.com/curl/curl/pull/1336
+ Closes #2082
+
+- [Dirk Feytons brought this change]
+
+ openssl: fix too broad use of HAVE_OPAQUE_EVP_PKEY
+
+ Fixes #2079
+ Closes #2081
+
+- TODO: ignore private IP addresses in PASV response
+
+ Closes #1455
+
+- RELEASE-NOTES: synced with ae7369b6d
+
+Michael Kaufmann (14 Nov 2017)
+- URL: return error on malformed URLs with junk after IPv6 bracket
+
+ Follow-up to aadb7c7. Verified by new test 1263.
+
+ Closes #2072
+
+Daniel Stenberg (14 Nov 2017)
+- INTERNALS: we may use libidn2 now, not libidn
+
+Patrick Monnerat (13 Nov 2017)
+- zlib/brotli: only include header files in modules needing them
+
+ There is a conflict on symbol 'free_func' between openssl/crypto.h and
+ zlib.h on AIX. This is an attempt to resolve it.
+
+ Bug: https://curl.haxx.se/mail/lib-2017-11/0032.html
+ Reported-By: Michael Felt
+
+Daniel Stenberg (13 Nov 2017)
+- SMB: fix uninitialized local variable
+
+ Reported-by: Brian Carpenter
+
+- [Orgad Shaneh brought this change]
+
+ connect.c: remove executable bit on file
+
+ Closes #2071
+
+- [hsiao yi brought this change]
+
+ README.md: fixed layout
+
+ Closes #2069
+
+- setopt: split out curl_easy_setopt() to its own file
+
+ ... to make url.c smaller.
+
+ Closes #1944
+
+Jay Satiro (10 Nov 2017)
+- [John Starks brought this change]
+
+ cmake: Add missing setmode check
+
+ Ensure HAVE_SETMODE is set to 1 on OSes that have setmode. Without this,
+ curl will corrupt binary files when writing them to stdout on Windows.
+
+ Closes https://github.com/curl/curl/pull/2067
+
+Daniel Stenberg (10 Nov 2017)
+- curl_share_setopt: va_end was not called if conncache errors
+
+ CID 984459, detected by Coverity
+
+Sergei Nikulov (10 Nov 2017)
+- [John Starks brought this change]
+
+ cmake: Correctly include curl.rc in Windows builds (#2064)
+
+ Update CMakeLists.txt to add curl.rc to the correct list.
+
+Daniel Stenberg (9 Nov 2017)
+- RELEASE-NOTES: synced with 32828cc4f
+
+- [Luca Boccassi brought this change]
+
+ --interface: add support for Linux VRF
+
+ The --interface command (CURLOPT_INTERFACE option) already uses
+ SO_BINDTODEVICE on Linux, but it tries to parse it as an interface or IP
+ address first, which fails in case the user passes a VRF.
+
+ Try to use the socket option immediately and parse it as a fallback
+ instead. Update the documentation to mention this feature, and that it
+ requires the binary to be ran by root or with CAP_NET_RAW capabilities
+ for this to work.
+
+ Closes #2024
+
+- curl_share_setopt.3: document CURL_LOCK_DATA_CONNECT
+
+ Closes #2043
+
+- examples: add shared-connection-cache
+
+- test1554: verify connection cache sharing
+
+- share: add support for sharing the connection cache
+
+- imap: deal with commands case insensitively
+
+ As documented in RFC 3501 section 9:
+ https://tools.ietf.org/html/rfc3501#section-9
+
+ Closes #2061
+
+- connect: store IPv6 connection status after valid connection
+
+ ... previously it would store it already in the happy eyeballs stage
+ which could lead to the IPv6 bit being set for an IPv4 connection,
+ leading to curl not wanting to do EPSV=>PASV for FTP transfers.
+
+ Closes #2053
+
+- curl_multi_fdset.3: emphasize curl_multi_timeout
+
+ ... even when there's no socket to wait for, the timeout can still be
+ very short.
+
+Jay Satiro (9 Nov 2017)
+- content_encoding: fix inflate_stream for no bytes available
+
+ - Don't call zlib's inflate() when avail_in stream bytes is 0.
+
+ This is a follow up to the parent commit 19e66e5. Prior to that change
+ libcurl's inflate_stream could call zlib's inflate even when no bytes
+ were available, causing inflate to return Z_BUF_ERROR, and then
+ inflate_stream would treat that as a hard error and return
+ CURLE_BAD_CONTENT_ENCODING.
+
+ According to the zlib FAQ, Z_BUF_ERROR is not fatal.
+
+ This bug would happen randomly since packet sizes are arbitrary. A test
+ of 10,000 transfers had 55 fail (ie 0.55%).
+
+ Ref: https://zlib.net/zlib_faq.html#faq05
+
+ Closes https://github.com/curl/curl/pull/2060
+
+Patrick Monnerat (7 Nov 2017)
+- content_encoding: do not write 0 length data
+
+Daniel Stenberg (6 Nov 2017)
+- fnmatch: remove dead code
+
+ There was a duplicate check for backslashes in the setcharset()
+ function.
+
+ Coverity CID 1420611
+
+- url: remove unncessary NULL-check
+
+ Since 'conn' won't be NULL in there and we also access the pointer in
+ there without the check.
+
+ Coverity CID 1420610
+
+Viktor Szakats (6 Nov 2017)
+- src/Makefile.m32: fix typo in brotli lib customization
+
+ Ref cc1f4436099decb9d1a7034b2bb773a9f8379d31
+
+- Makefile.m32: allow to customize brotli libs
+
+ It adds the ability to link against static brotli libs.
+
+ Also fix brotli include path.
+
+Patrick Monnerat (5 Nov 2017)
+- travis: add a job with brotli enabled
+
+- [Viktor Szakats brought this change]
+
+ Makefile.m32: add brotli support
+
+- HTTP: implement Brotli content encoding
+
+ This uses the brotli external library (https://github.com/google/brotli).
+ Brotli becomes a feature: additional curl_version_info() bit and
+ structure fields are provided for it and CURLVERSION_NOW bumped.
+
+ Tests 314 and 315 check Brotli content unencoding with correct and
+ erroneous data.
+
+ Some tests are updated to accomodate with the now configuration dependent
+ parameters of the Accept-Encoding header.
+
+- HTTP: support multiple Content-Encodings
+
+ This is implemented as an output streaming stack of unencoders, the last
+ calling the client write procedure.
+
+ New test 230 checks this feature.
+
+ Bug: https://github.com/curl/curl/pull/2002
+ Reported-By: Daniel Bankhead
+
+Jay Satiro (4 Nov 2017)
+- url: remove arg value check from CURLOPT_SSH_AUTH_TYPES
+
+ Since CURLSSH_AUTH_ANY (aka CURLSSH_AUTH_DEFAULT) is ~0 an arg value
+ check on this option is incorrect; we have to accept any value.
+
+ Prior to this change since f121575 (7.56.1+) CURLOPT_SSH_AUTH_TYPES
+ erroneously rejected CURLSSH_AUTH_ANY with CURLE_BAD_FUNCTION_ARGUMENT.
+
+ Bug: https://github.com/curl/curl/commit/f121575#commitcomment-25347120
+
+Daniel Stenberg (4 Nov 2017)
+- ntlm: avoid malloc(0) for zero length passwords
+
+ It triggers an assert() when built with memdebug since malloc(0) may
+ return NULL *or* a valid pointer.
+
+ Detected by OSS-Fuzz: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4054
+
+ Assisted-by: Max Dymond
+ Closes #2054
+
+- RELEASE-NOTES: synced with ee8016b3d
+
+- curl: speed up handling of many URLs
+
+ By properly keeping track of the last entry in the list of URLs/uploads
+ to handle, curl now avoids many meaningless traverses of the list which
+ speeds up many-URL handling *MASSIVELY* (several magnitudes on 100K
+ URLs).
+
+ Added test 1291, to verify that it doesn't take ages - but we don't have
+ any detection of "too slow" command in the test suite.
+
+ Reported-by: arainchik on github
+ Fixes #1959
+ Closes #2052
+
+- curl: pass through [] in URLs instead of calling globbing error
+
+ Assisted-by: Per Lundberg
+ Fixes #2044
+ Closes #2046
+ Closes #2048
+
+- CURLOPT_INFILESIZE: accept -1
+
+ Regression since f121575
+
+ Reported-by: Petr Voytsik
+ Fixes #2047
+
+Jay Satiro (2 Nov 2017)
+- url: fix CURLOPT_DNS_CACHE_TIMEOUT arg value check to allow -1
+
+ Prior to this change since f121575 (7.56.1+) CURLOPT_DNS_CACHE_TIMEOUT
+ erroneously rejected -1 with CURLE_BAD_FUNCTION_ARGUMENT.
+
+Dan Fandrich (1 Nov 2017)
+- http2: Fixed OOM handling in upgrade request
+
+ This caused the torture tests on test 1800 to fail.
+
+- tests: Fixed torture tests on tests 556 and 650
+
+ Test cleanup after OOM wasn't being consistently performed.
+
+Daniel Stenberg (1 Nov 2017)
+- CURLOPT_MAXREDIRS: allow -1 as a value
+
+ ... which is valid according to documentation. Regression since
+ f121575c0b5f.
+
+ Verified now in test 501.
+
+ Reported-by: cbartl on github
+ Fixes #2038
+ Closes #2039
+
+- include: remove conncache.h inclusion from where its not needed
+
+Jay Satiro (1 Nov 2017)
+- url: fix CURLOPT_POSTFIELDSIZE arg value check to allow -1
+
+ .. also add same arg value check to CURLOPT_POSTFIELDSIZE_LARGE.
+
+ Prior to this change since f121575 (7.56.1+) CURLOPT_POSTFIELDSIZE
+ erroneously rejected -1 value with CURLE_BAD_FUNCTION_ARGUMENT.
+
+ Bug: https://curl.haxx.se/mail/lib-2017-11/0000.html
+ Reported-by: Andrew Lambert
+
+Daniel Stenberg (31 Oct 2017)
+- cookie: avoid NULL dereference
+
+ ... when expiring old cookies.
+
+ Reported-by: Pavel Gushchin
+ Fixes #2032
+ Closes #2035
+
+Marcel Raad (30 Oct 2017)
+- memdebug: use send/recv signature for curl_dosend/curl_dorecv
+
+ This avoids build errors and warnings caused by implicit casts.
+
+ Closes https://github.com/curl/curl/pull/2031
+
+Daniel Stenberg (30 Oct 2017)
+- [Juro Bystricky brought this change]
+
+ mkhelp.pl: support reproducible build
+
+ Do not generate line with the current date, such as:
+
+ * Generation time: Tue Oct-24 18:01:41 2017
+
+ This will improve reproducibility. The generated string is only
+ part of a comment, so there should be no adverse consequences.
+
+ Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
+
+ closes #2026
+
+Dan Fandrich (30 Oct 2017)
+- runtests.pl: Fixed typo in message
+
+Daniel Stenberg (30 Oct 2017)
+- curlx: the timeval functions are no longer provided as curlx_*
+
+ Pointed-out-by: Dmitri Tikhonov
+ Bug: #2034
+
+- select: update comments
+
+ s/curlx_tvnow/Curl_now
+
+- INTERNALS: remove curlx_tv* functions no longer provided
+
+- [Dmitri Tikhonov brought this change]
+
+ timeval: use mach time on MacOS
+
+ If clock_gettime() is not supported, use mach_absolute_time() on MacOS.
+
+ closes #2033
+
+monnerat (29 Oct 2017)
+- [Patrick Monnerat brought this change]
+
+ cli tool: improve ";type=" handling in -F option arguments
+
+- [Patrick Monnerat brought this change]
+
+ cli tool: in -F option arg, comma is a delimiter for files only
+
+ Also upgrade test 1133 to cover this case and clarify man page about
+ form data quoting.
+
+ Bug: https://github.com/curl/curl/issues/2022
+ Reported-By: omau on github
+
+Daniel Stenberg (29 Oct 2017)
+- timeleft: made two more users of Curl_timeleft use timediff_t
+
+Jakub Zakrzewski (28 Oct 2017)
+- cmake: Export libcurl and curl targets to use by other cmake projects
+
+ The config files define curl and libcurl targets as imported targets
+ CURL::curl and CURL::libcurl. For backward compatibility with CMake-
+ provided find-module the CURL_INCLUDE_DIRS and CURL_LIBRARIES are
+ also set.
+
+ Closes #1879
+
+Daniel Stenberg (28 Oct 2017)
+- RELEASE-NOTES: synced with f20cbac97
+
+- [Florin brought this change]
+
+ auth: Added test cases for RFC7616
+
+ Updated docs to include support for RFC7616
+
+ Signed-off-by: Florin <petriuc.florin@gmail.com>
+
+ Closes #1934
+
+- [Florin brought this change]
+
+ auth: add support for RFC7616 - HTTP Digest access authentication
+
+ Signed-off-by: Florin <petriuc.florin@gmail.com>
+
+- [Daniel Bankhead brought this change]
+
+ TODO: support multiple Content-Encodings
+
+ Closes #2002
+
+- ROADMAP: cleanup
+
+ Removed done stuff. Removed entries no longer considered for the near
+ term.
+
+- [Magicansk brought this change]
+
+ ROADMAP.md: spelling fixes
+
+ Closes #2028
+
+- Curl_timeleft: change return type to timediff_t
+
+ returning 'time_t' is problematic when that type is unsigned and we
+ return values less than zero to signal "already expired", used in
+ several places in the code.
+
+ Closes #2021
+
+- appveyor: add a win32 build
+
+- setopt: fix CURLOPT_SSH_AUTH_TYPES option read
+
+ Regression since f121575c0b5f
+
+ Reported-by: Rob Cotrone
+
+Marcel Raad (27 Oct 2017)
+- resolvers: only include anything if needed
+
+ This avoids warnings about unused stuff.
+
+ Closes https://github.com/curl/curl/pull/2023
+
+Daniel Stenberg (27 Oct 2017)
+- HELP-US: rename the subtitle too since the label is changed
+
+ "PR-welcome" was the former name.
+
+- curl_setup.h: oops, shorten the too long line
+
+- [Martin Storsjo brought this change]
+
+ curl_setup: Improve detection of CURL_WINDOWS_APP
+
+ If WINAPI_FAMILY is defined, it should be safe to try to include
+ winapifamily.h to check what the define evaluates to.
+
+ This should fix detection of CURL_WINDOWS_APP if building with
+ _WIN32_WINNT set to 0x0600.
+
+ Closes #2025
+
+Jay Satiro (26 Oct 2017)
+- transfer: Fix chunked-encoding upload bug
+
+ - When uploading via chunked-encoding don't compare file size to bytes
+ sent to determine whether the upload has finished.
+
+ Chunked-encoding adds its own overhead which why the bytes sent is not
+ equal to the file size. Prior to this change if a file was uploaded in
+ chunked-encoding and its size was known it was possible that the upload
+ could end prematurely without sending the final few chunks. That would
+ result in a server hang waiting for the remaining data, likely followed
+ by a disconnect.
+
+ The scope of this bug is limited to some arbitrary file sizes which have
+ not been determined. One size that triggers the bug is 475020.
+
+ Bug: https://github.com/curl/curl/issues/2001
+ Reported-by: moohoorama@users.noreply.github.com
+
+ Closes https://github.com/curl/curl/pull/2010
+
+Daniel Stenberg (26 Oct 2017)
+- timeval: make timediff_t also work on 32bit windows
+
+ ... by using curl_off_t for the typedef if time_t is larger than 4
+ bytes.
+
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/commit/b9d25f9a6b3ca791385b80a6a3c3fa5ae113e1e0#co
+ mmitcomment-25205058
+ Closes #2019
+
+- curl_fnmatch: return error on illegal wildcard pattern
+
+ ... instead of doing an infinite loop!
+
+ Added test 1162 to verify.
+
+ Reported-by: Max Dymond
+ Fixes #2015
+ Closes #2017
+
+- [Max Dymond brought this change]
+
+ wildcards: don't use with non-supported protocols
+
+ Fixes timeouts in the fuzzing tests for non-FTP protocols.
+
+ Closes #2016
+
+- [Max Dymond brought this change]
+
+ multi: allow table handle sizes to be overridden
+
+ Allow users to specify their own hash define for
+ CURL_CONNECTION_HASH_SIZE so that both values can be overridden.
+
+ Closes #1982
+
+- time: rename Curl_tvnow to Curl_now
+
+ ... since the 'tv' stood for timeval and this function does not return a
+ timeval struct anymore.
+
+ Also, cleaned up the Curl_timediff*() functions to avoid typecasts and
+ clean up the descriptive comments.
+
+ Closes #2011
+
+- ftplistparser: follow-up cleanup to remove PL_ERROR()
+
+- [Max Dymond brought this change]
+
+ ftplistparser: free off temporary memory always
+
+ When using the FTP list parser, ensure that the memory that's
+ allocated is always freed.
+
+ Detected by OSS-fuzz: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3682
+ Closes #2013
+
+- timediff: return timediff_t from the time diff functions
+
+ ... to cater for systems with unsigned time_t variables.
+
+ - Renamed the functions to curlx_timediff and Curl_timediff_us.
+
+ - Added overflow protection for both of them in either direction for
+ both 32 bit and 64 bit time_ts
+
+ - Reprefixed the curlx_time functions to use Curl_*
+
+ Reported-by: Peter Piekarski
+ Fixes #2004
+ Closes #2005
+
+- [Paul Howarth brought this change]
+
+ libtest: Add required test libraries for lib1552 and lib1553
+
+ They use $(TESTUTIL) and thus should use $(TESTUTIL_LIBS) too.
+
+ This fixes build failures on Fedora 13.
+
+ Closes #2006
+
+- [Alessandro Ghedini brought this change]
+
+ libcurl-tutorial.3: fix typo
+
+ closes #2008
+
+Alessandro Ghedini (23 Oct 2017)
+- curl_mime_filedata.3: fix typos
+
+Daniel Stenberg (23 Oct 2017)
+- RELEASE-NOTES: clean slate towards 7.57.0
+
+- [Max Dymond brought this change]
+
+ travis: exit if any steps fail
+
+ We don't expect any steps to fail in travis. Exit the script if they do.
+
+ Closes #1966
+
+Version 7.56.1 (23 Oct 2017)
+
+Daniel Stenberg (23 Oct 2017)
+- RELEASE-NOTES: 7.56.1
+
+- THANKS: update at 7.56.1 release time
+
+- [Jon DeVree brought this change]
+
+ mk-ca-bundle: Remove URL for aurora
+
+ Aurora is no longer used by Mozilla
+ https://hacks.mozilla.org/2017/04/simplifying-firefox-release-channels/
+
+- [Jon DeVree brought this change]
+
+ mk-ca-bundle: Fix URL for NSS
+
+ The 'tip' is the most recent branch committed to, this should be
+ 'default' like the URLs for the browser are.
+
+ Closes #1998
+
+- imap: if a FETCH response has no size, don't call write callback
+
+ CVE-2017-1000257
+
+ Reported-by: Brian Carpenter and 0xd34db347
+ Also detected by OSS-Fuzz: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3586
+
+- ftp: reject illegal IP/port in PASV 227 response
+
+ ... by using range checks. Among other things, this avoids an undefined
+ behavior for a left shift that could happen on negative or very large
+ values.
+
+ Closes #1997
+
+ Detected by OSS-fuzz: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3694
+
+Patrick Monnerat (20 Oct 2017)
+- test653: check reuse of easy handle after mime data change
+
+ See issue #1999
+
+- mime: do not reuse previously computed multipart size
+
+ The contents might have changed: size must be recomputed.
+
+ Reported-by: moteus on github
+ Fixes #1999
+
+- test308: disable if MultiSSL feature enabled
+
+ Even if OpenSSL is enabled, it might not be the default backend when
+ multi-ssl is enabled, causing the test to fail.
+
+- runtests: support MultiSSL client feature
+
+- vtls: change struct Curl_ssl `close' field name to `close_one'.
+
+ On OS/400, `close' is an ASCII system macro that corrupts the code if
+ not used in a context not targetting the close() system API.
+
+- os400: add missing symbols in config file.
+
+ Also adjust makefile to renamed files and warn about installation dirs mix-up.
+
+- test652: curl_mime_data + base64 encoder with large contents
+
+- mime: limit bas64-encoded lines length to 76 characters
+
+Daniel Stenberg (16 Oct 2017)
+- RELEASE-NOTES: synced with f121575c0
+
+- setopt: range check most long options
+
+ ... filter early instead of risking "funny values" having to be dealt
+ with elsewhere.
+
+- setopt: avoid integer overflows when setting millsecond values
+
+ ... that are multiplied by 1000 when stored.
+
+ For 32 bit long systems, the max value accepted (2147483 seconds) is >
+ 596 hours which is unlikely to ever be set by a legitimate application -
+ and previously it didn't work either, it just caused undefined behavior.
+
+ Also updated the man pages for these timeout options to mention the
+ return code.
+
+ Closes #1938
+
+Viktor Szakats (15 Oct 2017)
+- makefile.m32: allow to override gcc, ar and ranlib
+
+ Allow to ovverride certain build tools, making it possible to
+ use LLVM/Clang to build curl. The default behavior is unchanged.
+ To build with clang (as offered by MSYS2), these settings can
+ be used:
+
+ CURL_CC=clang
+ CURL_AR=llvm-ar
+ CURL_RANLIB=llvm-ranlib
+
+ Closes https://github.com/curl/curl/pull/1993
+
+- ldap: silence clang warning
+
+ Use memset() to initialize a structure to avoid LLVM/Clang warning:
+ ldap.c:193:39: warning: missing field 'UserLength' initializer [-Wmissing-field-initializers]
+
+ Closes https://github.com/curl/curl/pull/1992
+
+Daniel Stenberg (14 Oct 2017)
+- runtests: use valgrind for torture as well
+
+ NOTE: it makes them terribly slow. I recommend only using valgrind for
+ specific torture tests or using lots of patience.
+
+- memdebug: trace send, recv and socket
+
+ ... to allow them to be included in torture tests too.
+
+ closes #1980
+
+- configure: remove the C++ compiler check
+
+ ... we used it only for the fuzzer, which we now have in a separate git
+ repo.
+
+ Closes #1990
+
+Patrick Monnerat (13 Oct 2017)
+- mime: do not call failf() if easy handle is NULL.
+
+Daniel Stenberg (13 Oct 2017)
+- test651: curl_formadd with huge COPYCONTENTS
+
+- mime: fix the content reader to handle >16K data properly
+
+ Reported-by: Jeroen Ooms
+ Closes #1988
+
+Patrick Monnerat (12 Oct 2017)
+- mime: keep "text/plain" content type if user-specified.
+
+ Include test cases in 554, 587, 650.
+
+ Fixes https://github.com/curl/curl/issues/1986
+
+- cli tool: use file2memory() to buffer stdin in -F option.
+
+ Closes PR https://github.com/curl/curl/pull/1985
+
+- cli tool: reimplement stdin buffering in -F option.
+
+ If stdin is not a regular file, its content is memory-buffered to enable
+ a possible data "rewind".
+ In all cases, stdin data size is determined before real use to avoid
+ having an unknown part's size.
+
+ --libcurl generated code is left as an unbuffered stdin fread/fseek callback
+ part with unknown data size.
+
+ Buffering is not supported in deprecated curl_formadd() API.
+
+Daniel Stenberg (12 Oct 2017)
+- winbuild/BUILD.WINDOWS.txt: mention WITH_NGHTTP2
+
+- HELP-US: the label "PR-welcome" is now renamed to "help wanted"
+
+ following the new github "standard"
+
+- RELEASE-NOTES: synced with 5505df7d2
+
+Jay Satiro (11 Oct 2017)
+- [Artak Galoyan brought this change]
+
+ url: Update current connection SSL verify params in setopt
+
+ Now VERIFYHOST, VERIFYPEER and VERIFYSTATUS options change during active
+ connection updates the current connection's (i.e.'connectdata'
+ structure) appropriate ssl_config (and ssl_proxy_config) structures
+ variables, making these options effective for ongoing connection.
+
+ This functionality was available before and was broken by the
+ following change:
+ "proxy: Support HTTPS proxy and SOCKS+HTTP(s)"
+ CommitId: cb4e2be7c6d42ca0780f8e0a747cecf9ba45f151.
+
+ Bug: https://github.com/curl/curl/issues/1941
+
+ Closes https://github.com/curl/curl/pull/1951
+
+Daniel Stenberg (11 Oct 2017)
+- [David Benjamin brought this change]
+
+ openssl: don't use old BORINGSSL_YYYYMM macros
+
+ Those were temporary things we'd add and remove for our own convenience
+ long ago. The last few stayed around for too long as an oversight but
+ have since been removed. These days we have a running
+ BORINGSSL_API_VERSION counter which is bumped when we find it
+ convenient, but 2015-11-19 was quite some time ago, so just check
+ OPENSSL_IS_BORINGSSL.
+
+ Closes #1979
+
+- test950; verify SMTP with custom request
+
+- ftpserver: support case insensitive commands
+
+- smtp_done: free data before returning (on send failure)
+
+ ... as otherwise it could leak that memory.
+
+ Detected by OSS-fuzz:
+ https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3600
+
+ Assisted-by: Max Dymond
+ Closes #1977
+
+- FTP: URL decode path for dir listing in nocwd mode
+
+ Reported-by: Zenju on github
+
+ Test 244 added to verify
+ Fixes #1974
+ Closes #1976
+
+- test298: verify --ftp-method nowcwd with URL encoded path
+
+ Ref: #1974
+
+- CURLOPT_XFERINFODATA.3: fix duplicate see also
+
+- CURLOPT_NOPROGRESS.3: also refer to xferinfofunction
+
+- FAQ: s/CURLOPT_PROGRESSFUNCTION/CURLOPT_XFERINFOFUNCTION
+
+- openssl: enable PKCS12 support for !BoringSSL
+
+ Enable PKCS12 for all non-boringssl builds without relying on configure
+ or cmake checks.
+
+ Bug: https://curl.haxx.se/mail/lib-2017-10/0007.html
+ Reported-by: Christian Schmitz
+ Closes #1948
+
+- [Kristiyan Tsaklev brought this change]
+
+ curl: don't pass semicolons when parsing Content-Disposition
+
+ Test 1422 updated to verify.
+
+ Closes #1964
+
+Patrick Monnerat (9 Oct 2017)
+- mime: properly unbind mime structure in curl_mime_free().
+
+ This allows freeing a mime structure bound to the easy handle before
+ curl_easy_cleanup().
+
+ Fixes #1970.
+
+Daniel Stenberg (9 Oct 2017)
+- RTSP: avoid integer overflow on funny RTSP response
+
+ ... like a very large non-existing RTSP version number.
+
+ Added test 577 to verify.
+
+ Detected by OSS-fuzz.
+ Closes #1969
+
+Patrick Monnerat (8 Oct 2017)
+- ftpserver: properly reset $ftptargetdir.
+
+- test643: verify curl_mime_subparts() rejects cyclic additions.
+
+- mime: refuse to add subparts to one of their own descendants.
+
+ Reported-by: Alexey Melnichuk
+ Fixes #1962
+
+- mime: avoid resetting a part's encoder when part's contents change.
+
+- mime: improve unbinding top multipart from easy handle.
+
+ Also avoid dangling pointers in referencing parts.
+
+Daniel Stenberg (8 Oct 2017)
+- RELEASE-NOTES: synced with a4c1c75da30af1
+
+- curlver.h: next expected release is 7.57.0
+
+Patrick Monnerat (8 Oct 2017)
+- mime: be tolerant about setting twice the same header list in a part.
+
+- docs: clarify form/mime usage of non-regular data files.
+
+Daniel Stenberg (8 Oct 2017)
+- Revert "multi_done: wait for name resolve to finish if still ongoing"
+
+ This reverts commit f3e03f6c0ac52a1bf396e03f7d7e9b5b3b7165fe.
+
+ Caused memory leaks in the fuzzer, needs to be done differently.
+
+ Disable test 1553 for now too, as it causes memory leaks without this
+ commit!
+
+- remove_handle: call multi_done() first, then clear dns cache pointer
+
+ Closes #1960
+
+- multi_done: wait for name resolve to finish if still ongoing
+
+ ... as we must clean up memory.
+
+- pingpong: return error when trying to send without connection
+
+ When imap_done() got called before a connection is setup, it would try
+ to "finish up" and dereffed a NULL pointer.
+
+ Test case 1553 managed to reproduce. I had to actually use a host name
+ to try to resolve to slow it down, as using the normal local server IP
+ will make libcurl get a connection in the first curl_multi_perform()
+ loop and then the bug doesn't trigger.
+
+ Fixes #1953
+ Assisted-by: Max Dymond
+
+Dan Fandrich (6 Oct 2017)
+- tests: added flaky keyword to tests 587 and 644
+
+ These are around 5% flaky in my Linux x86 autobuilds.
+
+Marcel Raad (6 Oct 2017)
+- vtls: fix warnings with --disable-crypto-auth
+
+ When CURL_DISABLE_CRYPTO_AUTH is defined, Curl_none_md5sum's parameters
+ are not used.
+
+Daniel Stenberg (6 Oct 2017)
+- multi_cleanup: call DONE on handles that never got that
+
+ ... fixes a memory leak with at least IMAP when remove_handle is never
+ called and the transfer is abruptly just abandoned early.
+
+ Test 1552 added to verify
+
+ Detected by OSS-fuzz
+ Assisted-by: Max Dymond
+ Closes #1954
+
+- [Benbuck Nason brought this change]
+
+ strtoofft: Remove extraneous null check
+
+ Fixes #1950: curlx_strtoofft() doesn't fully protect against null 'str'
+ argument.
+
+ Closes #1952
+
+- openssl: fix build without HAVE_OPAQUE_EVP_PKEY
+
+ Reported-by: Javier Sixto
+ Fixes #1955
+ Closes #1956
+
+Viktor Szakats (6 Oct 2017)
+- lib/config-win32.h: let SMB/SMBS be enabled with OpenSSL/NSS
+
+ The source code is now prepared to handle the case when both
+ Win32 Crypto and OpenSSL/NSS crypto backends are enabled
+ at the same time, making it now possible to enable `USE_WIN32_CRYPTO`
+ whenever the targeted Windows version supports it. Since this
+ matches the minimum Windows version supported by curl
+ (Windows 2000), enable it unconditionally for the Win32 platform.
+
+ This in turn enables SMB (and SMBS) protocol support whenever
+ Win32 Crypto is available, regardless of what other crypto backends
+ are enabled.
+
+ Ref: https://github.com/curl/curl/pull/1840#issuecomment-325682052
+
+ Closes https://github.com/curl/curl/pull/1943
+
+Daniel Stenberg (5 Oct 2017)
+- build: fix --disable-crypto-auth
+
+ Reported-by: Wyatt O'Day
+ Fixes #1945
+ Closes #1947
+
+Jay Satiro (5 Oct 2017)
+- [Nick Zitzmann brought this change]
+
+ darwinssl: add support for TLSv1.3
+
+ Closes https://github.com/curl/curl/pull/1794
+
+Daniel Stenberg (4 Oct 2017)
+- [Felix Kaiser brought this change]
+
+ docs: fix typo in curl_mime_data_cb man page
+
+ Closes #1946
+
+Viktor Szakats (4 Oct 2017)
+- lib/Makefile.m32: allow customizing dll suffixes
+
+ - New `CURL_DLL_SUFFIX` envvar will add a suffix to the generated
+ libcurl dll name. Useful to add `-x64` to 64-bit builds so that
+ it can live in the same directory as the 32-bit one. By default
+ this is empty.
+
+ - New `CURL_DLL_A_SUFFIX` envvar to customize the suffix of the
+ generated import library (implib) for libcurl .dll. It defaults
+ to `dll`, and it's useful to modify that to `.dll` to have the
+ standard naming scheme for mingw-built .dlls, i.e. `libcurl.dll.a`.
+
+ Closes https://github.com/curl/curl/pull/1942
+
+Daniel Stenberg (4 Oct 2017)
+- [Max Dymond brought this change]
+
+ fuzzer: move to using external curl-fuzzer
+
+ Use the external curl-fuzzer repository for fuzzing.
+
+ Closes #1923
+
+- failf: skip the sprintf() if there are no consumers
+
+ Closes #1936
+
+- ftp: UBsan fixup 'pointer index expression overflowed'
+
+ Closes #1939
+
+- RELEASE-PROCEDURE: update the release schedule
+
+Version 7.56.0 (4 Oct 2017)
+
+Daniel Stenberg (4 Oct 2017)
+- RELEASE-NOTES: curl 7.56.0
+
+- THANKS: added new 7.56.0 contributors
+
+Jay Satiro (4 Oct 2017)
+- build-openssl.bat: Warn OpenSSL 1.1.0 not yet supported
+
+ Ref: https://github.com/curl/curl/issues/1002
+
+Michael Kaufmann (3 Oct 2017)
+- idn: fix source code comment
+
+- vtls: compare and clone ssl configs properly
+
+ Compare these settings in Curl_ssl_config_matches():
+ - verifystatus (CURLOPT_SSL_VERIFYSTATUS)
+ - random_file (CURLOPT_RANDOM_FILE)
+ - egdsocket (CURLOPT_EGDSOCKET)
+
+ Also copy the setting "verifystatus" in Curl_clone_primary_ssl_config(),
+ and copy the setting "sessionid" unconditionally.
+
+ This means that reusing connections that are secured with a client
+ certificate is now possible, and the statement "TLS session resumption
+ is disabled when a client certificate is used" in the old advisory at
+ https://curl.haxx.se/docs/adv_20170419.html is obsolete.
+
+ Reviewed-by: Daniel Stenberg
+
+ Closes #1917
+
+- proxy: read the "no_proxy" variable only if necessary
+
+ Reviewed-by: Daniel Stenberg
+
+ Closes #1919
+
+Patrick Monnerat (3 Oct 2017)
+- libcurl-tutorial: add casts in example to avoid compilation warnings.
+
+Daniel Stenberg (3 Oct 2017)
+- examples: bring back curl_formadd-using examples
+
+ ... now with a -formadd suffix. While the new mime API is introduced in
+ 7.56.0 we must acknowledge that lots of users can't upgrade their curl
+ versions immediately.
+
+- test1153: verify quoted double-qoutes in PWD response
+
+- FTP: zero terminate the entry path even on bad input
+
+ ... a single double quote could leave the entry path buffer without a zero
+ terminating byte. CVE-2017-1000254
+
+ Test 1152 added to verify.
+
+ Reported-by: Max Dymond
+ Bug: https://curl.haxx.se/docs/adv_20171004.html
+
+Jay Satiro (2 Oct 2017)
+- [Sergei Nikulov brought this change]
+
+ cmake: disable tests and man generation if perl/nroff not found
+
+ Fixes https://github.com/curl/curl/issues/1500
+ Reported-by: Jay Satiro
+
+ Fixes https://github.com/curl/curl/pull/1662
+ Assisted-by: Tom Seddon
+ Assisted-by: dpull@users.noreply.github.com
+ Assisted-by: elelel@users.noreply.github.com
+
+ Closes https://github.com/curl/curl/pull/1924
+
+Patrick Monnerat (2 Oct 2017)
+- libcurl-tutorial: fix two typos.
+
+- TODO: remove deprecated form API items.
+
+- libcurl-tutorial: describe MIME API and deprecate form API.
+
+ Include a guide to form/mime API conversion.
+
+Daniel Stenberg (30 Sep 2017)
+- cookie: fix memory leak if path was set twice in header
+
+ ... this will let the second occurance override the first.
+
+ Added test 1161 to verify.
+
+ Reported-by: Max Dymond
+ Fixes #1932
+ Closes #1933
+
+Dan Fandrich (30 Sep 2017)
+- test650: Use variable replacement to set the host address and port
+
+ Otherwise, the test fails when the -b test option is used to set a
+ different test port range.
+
+- Set and use more necessary options when some protocols are disabled
+
+ When curl and libcurl are built with some protocols disabled, they stop
+ setting and receiving some options that don't make sense with those
+ protocols. In particular, when HTTP is disabled many options aren't set
+ that are used only by HTTP. However, some options that appear to be
+ HTTP-only are actually used by other protocols as well (some despite
+ having HTTP in the name) and should be set, but weren't. This change now
+ causes some of these options to be set and used for more (or for all)
+ protocols. In particular, this fixes tests 646 through 649 in an
+ HTTP-disabled build, which use the MIME API in the mail protocols.
+
+Daniel Stenberg (29 Sep 2017)
+- test1160: verifies cookie leak for large cookies
+
+ The fix done in 20ea22ff735
+
+- cookie: fix memory leak on oversized rejection
+
+ Regression brought by 2bc230de63b
+
+ Detected by OSS-fuzz: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3513
+ Assisted-by: Max Dymond
+
+ Closes #1930
+
+- [Anders Bakken brought this change]
+
+ connect: fix race condition with happy eyeballs timeout
+
+ The timer should be started after conn->connecttime is set. Otherwise
+ the timer could expire without this condition being true:
+
+ /* should we try another protocol family? */
+ if(i == 0 && conn->tempaddr[1] == NULL &&
+ curlx_tvdiff(now, conn->connecttime) >= HAPPY_EYEBALLS_TIMEOUT) {
+
+ Ref: #1928
+
+Michael Kaufmann (28 Sep 2017)
+- docs: link CURLOPT_CONNECTTIMEOUT and CURLOPT_CONNECTTIMEOUT_MS
+
+ Closes #1922
+
+- docs: clarify the use of environment variables for proxy
+
+ Closes #1921
+
+- http: add custom empty headers to repeated requests
+
+ Closes #1920
+
+- reuse_conn: don't copy flags that are known to be equal
+
+ A connection can only be reused if the flags "conn_to_host" and
+ "conn_to_port" match. Therefore it is not necessary to copy these flags
+ in reuse_conn().
+
+ Closes #1918
+
+Daniel Stenberg (27 Sep 2017)
+- curl.h: include <sys/select.h> on cygwin too
+
+ When building with -std=c++14 on cygwin, this header won't be
+ automatically included as it otherwise is.
+
+ The <sys/select.h> include decision should ideally be reversed and be
+ avoided where that header file doesn't exist.
+
+ Reported-by: Ian Fette
+ Fixes #1925
+
+- RELEASE-NOTES: synced with d8ab5dc50
+
+Michael Kaufmann (24 Sep 2017)
+- tests: adjust .gitignore for new tests
+
+Jay Satiro (23 Sep 2017)
+- ntlm: move NTLM_NEEDS_NSS_INIT define into core NTLM header
+
+ .. and include the core NTLM header in all NTLM-related source files.
+
+ Follow up to 6f86022. Since then http_ntlm checks NTLM_NEEDS_NSS_INIT
+ but did not include vtls.h where it was defined.
+
+ Closes https://github.com/curl/curl/pull/1911
+
+Daniel Stenberg (23 Sep 2017)
+- file_range: avoid integer overflow when figuring out byte range
+
+ When trying to bump the value with one and the value is already at max,
+ it causes an integer overflow.
+
+ Closes #1908
+ Detected by oss-fuzz:
+ https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3465
+
+ Assisted-by: Max Dymond
+
+Michael Kaufmann (23 Sep 2017)
+- tests: fix a compiler warning in test 643
+
+Jay Satiro (23 Sep 2017)
+- symbols-in-versions: fix CURLSSLSET_NO_BACKENDS entry
+
+ - Use spaces instead of tabs as the delimiter.
+
+ Follow up to 7c52b12 which added the entry. The entry had used tabs but
+ the symbol-scan parser doesn't recognize tabs and would fail the symbol.
+
+Viktor Szakats (22 Sep 2017)
+- metalink: fix NSS issue in MultiSSL builds
+
+ In MultiSSL mode (i.e. when more than one SSL backend is compiled
+ in), we cannot use the compile time flag `USE_NSS` as indicator that
+ the NSS backend is in use. As far as Metalink is concerned, the SSL
+ backend is only used for MD5, SHA-1 and SHA-256 calculations,
+ therefore one of the available SSL backends is selected at compile
+ time, in a strict order of preference.
+
+ Let's introduce a new `HAVE_NSS_CONTEXT` constant that can be used
+ to determine whether the SSL backend used for Metalink is the NSS
+ backend, and use that to guard the code that wants to de-initialize
+ the NSS-specific data structure.
+
+ Ref: https://github.com/curl/curl/pull/1848
+
+- ntlm: use strict order for SSL backend #if branches
+
+ With the recently introduced MultiSSL support multiple SSL backends
+ can be compiled into cURL That means that now the order of the SSL
+
+ One option would be to use the same SSL backend as was configured
+ via `curl_global_sslset()`, however, NTLMv2 support would appear
+ to be available only with some SSL backends. For example, when
+ eb88d778e (ntlm: Use Windows Crypt API, 2014-12-02) introduced
+ support for NTLMv1 using Windows' Crypt API, it specifically did
+ *not* introduce NTLMv2 support using Crypt API at the same time.
+
+ So let's select one specific SSL backend for NTLM support when
+ compiled with multiple SSL backends, using a priority order such
+ that we support NTLMv2 even if only one compiled-in SSL backend can
+ be used for that.
+
+ Ref: https://github.com/curl/curl/pull/1848
+
+Daniel Stenberg (22 Sep 2017)
+- symbols-in-versions: add CURLSSLSET_NO_BACKENDS
+
+ ...fixup from b8e0fe19ec
+
+- imap: quote atoms properly when escaping characters
+
+ Updates test 800 to verify
+
+ Fixes #1902
+ Closes #1903
+
+- tests: make the imap server not verify user+password
+
+ ... as the test cases themselves do that and it makes it easier to add
+ crazy test cases.
+
+ Test 800 updated to use user name + password that need quoting.
+
+ Test 856 updated to trigger an auth fail differently.
+
+ Ref: #1902
+
+- vtls: provide curl_global_sslset() even in non-SSL builds
+
+ ... it just returns error:
+
+ Bug: https://github.com/curl/curl/commit/1328f69d53f2f2e937696ea954c480412b018451#commitcomment-24470367
+ Reported-by: Marcel Raad
+
+ Closes #1906
+
+Patrick Monnerat (22 Sep 2017)
+- form/mime: field names are not allowed to contain zero-valued bytes.
+
+ Also suppress length argument of curl_mime_name() (names are always
+ zero-terminated).
+
+Daniel Stenberg (21 Sep 2017)
+- [Dirk Feytons brought this change]
+
+ openssl: only verify RSA private key if supported
+
+ In some cases the RSA key does not support verifying it because it's
+ located on a smart card, an engine wants to hide it, ...
+ Check the flags on the key before trying to verify it.
+ OpenSSL does the same thing internally; see ssl/ssl_rsa.c
+
+ Closes #1904
+
+Marcel Raad (21 Sep 2017)
+- examples/post-callback: use long for CURLOPT_POSTFIELDSIZE
+
+ Otherwise, typecheck-gcc.h warns on MinGW-w64.
+
+Patrick Monnerat (20 Sep 2017)
+- mime: rephrase the multipart output state machine (#1898) ...
+
+ ... in hope coverity will like it much.
+
+- mime: fix an explicit null dereference (#1899)
+
+Daniel Stenberg (20 Sep 2017)
+- curl: check fseek() return code and bail on error
+
+ Detected by coverity. CID 1418137.
+
+- smtp: fix memory leak in OOM
+
+ Regression since ce0881edee
+
+ Coverity CID 1418139 and CID 1418136 found it, but it was also seen in
+ torture testing.
+
+- RELEASE-NOTES: synced with 5fe85587c
+
+- [Pavel P brought this change]
+
+ cookies: use lock when using CURLINFO_COOKIELIST
+
+ Closes #1896
+
+- [Max Dymond brought this change]
+
+ ossfuzz: changes before merging the generated corpora
+
+ Before merging in the oss-fuzz corpora from Google, there are some changes
+ to the fuzzer.
+ - Add a read corpus script, to display corpus files nicely.
+ - Change the behaviour of the fuzzer so that TLV parse failures all now
+ go down the same execution paths, which should reduce the size of the
+ corpora.
+ - Make unknown TLVs a failure to parse, which should decrease the size
+ of the corpora as well.
+
+ Closes #1881
+
+- mime:escape_string minor clarification change
+
+ ... as it also removes a warning with old gcc versions.
+
+ Bug: https://curl.haxx.se/mail/lib-2017-09/0049.html
+ Reported-by: Ben Greear
+
+- [Max Dymond brought this change]
+
+ ossfuzz: don't write out to stdout
+
+ Don't make the fuzzer write out to stdout - instead write some of the
+ contents to a memory block so we exercise the data output code but
+ quietly.
+
+ Closes #1885
+
+- cookies: reject oversized cookies
+
+ ... instead of truncating them.
+
+ There's no fixed limit for acceptable cookie names in RFC 6265, but the
+ entire cookie is said to be less than 4096 bytes (section 6.1). This is
+ also what browsers seem to implement.
+
+ We now allow max 5000 bytes cookie header. Max 4095 bytes length per
+ cookie name and value. Name + value together may not exceed 4096 bytes.
+
+ Added test 1151 to verify
+
+ Bug: https://curl.haxx.se/mail/lib-2017-09/0062.html
+ Reported-by: Kevin Smith
+
+ Closes #1894
+
+- travis: on mac, don't install openssl or libidn
+
+ - openssl is already installed and causes warnings when trying to
+ install again
+
+ - libidn isn't used these days, and homebrew doesn't seem to have a
+ libidn2 package to replace with easily
+
+ Closes #1895
+
+- curl: make str2udouble not return values on error
+
+ ... previously it would store a return value even when it returned
+ error, which could make the value get used anyway!
+
+ Reported-by: Brian Carpenter
+ Closes #1893
+
+Jay Satiro (18 Sep 2017)
+- socks: fix incorrect port number in SOCKS4 error message
+
+ Prior to this change it appears the SOCKS5 port parsing was erroneously
+ used for the SOCKS4 error message, and as a result an incorrect port
+ would be shown in the error message.
+
+ Bug: https://github.com/curl/curl/issues/1892
+ Reported-by: Jackarain@users.noreply.github.com
+
+- [Marc Aldorasi brought this change]
+
+ schannel: Support partial send for when data is too large
+
+ Schannel can only encrypt a certain amount of data at once. Instead of
+ failing when too much data is to be sent at once, send as much data as
+ we can and let the caller send the remaining data by calling send again.
+
+ Bug: https://curl.haxx.se/mail/lib-2014-07/0033.html
+
+ Closes https://github.com/curl/curl/pull/1890
+
+- [David Benjamin brought this change]
+
+ openssl: add missing includes
+
+ lib/vtls/openssl.c uses OpenSSL APIs from BUF_MEM and BIO APIs. Include
+ their headers directly rather than relying on other OpenSSL headers
+ including things.
+
+ Closes https://github.com/curl/curl/pull/1891
+
+Daniel Stenberg (15 Sep 2017)
+- conversions: fix several compiler warnings
+
+- server/getpart: provide dummy function to build conversion enabled
+
+- non-ascii: use iconv() with 'char **' argument
+
+ Bug: https://curl.haxx.se/mail/lib-2017-09/0031.html
+
+- escape.c: error: pointer targets differ in signedness
+
+- docs: clarify the CURLOPT_INTERLEAVE* options behavior
+
+- [Max Dymond brought this change]
+
+ rtsp: Segfault in rtsp.c when using WRITEDATA
+
+ If the INTERLEAVEFUNCTION is defined, then use that plus the
+ INTERLEAVEDATA information when writing RTP. Otherwise, use
+ WRITEFUNCTION and WRITEDATA.
+
+ Fixes #1880
+ Closes #1884
+
+Marcel Raad (15 Sep 2017)
+- [Isaac Boukris brought this change]
+
+ tests: enable gssapi in travis-ci linux build
+
+ Closes https://github.com/curl/curl/pull/1687
+
+- [Isaac Boukris brought this change]
+
+ tests: add initial gssapi test using stub implementation
+
+ The stub implementation is pre-loaded using LD_PRELOAD
+ and emulates common gssapi uses (only builds if curl is
+ initially built with gssapi support).
+
+ The initial tests are currently disabled for debug builds
+ as LD_PRELOAD is not used then.
+
+ Ref: https://github.com/curl/curl/pull/1687
+
+Daniel Stenberg (15 Sep 2017)
+- test1150: verify same host fetch using different ports over proxy
+
+ Closes #1889
+
+- URL: on connection re-use, still pick the new remote port
+
+ ... as when a proxy connection is being re-used, it can still get a
+ different remote port.
+
+ Fixes #1887
+ Reported-by: Oli Kingshott
+
+- RELEASE-NOTES: synced with 87501e57f
+
+- code style: remove wrong uses of multiple spaces
+
+ Closes #1878
+
+- checksrc: detect and warn for multiple spaces
+
+- code style: use space after semicolon
+
+- checksrc: verify space after semicolons
+
+- code style: use spaces around pluses
+
+- checksrc: detect and warn for lack of spaces next to plus signs
+
+- code style: use spaces around equals signs
+
+- checksrc: verify spaces around equals signs
+
+ ... as the code style mandates.
+
+- Curl_checkheaders: make it available for IMAP and SMTP too
+
+ ... not only HTTP uses this now.
+
+ Closes #1875
+
+- travis: add build without HTTP/SMTP/IMAP
+
+Jay Satiro (10 Sep 2017)
+- mbedtls: enable CA path processing
+
+ CA path processing was implemented when mbedtls.c was added to libcurl
+ in fe7590f, but it was never enabled.
+
+ Bug: https://github.com/curl/curl/issues/1877
+ Reported-by: SBKarr@users.noreply.github.com
+
+Daniel Stenberg (8 Sep 2017)
+- rtsp: do not call fwrite() with NULL pointer FILE *
+
+ If the default write callback is used and no destination has been set, a
+ NULL pointer would be passed to fwrite()'s 4th argument.
+
+ OSS-fuzz bug https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3327
+ (not publicly open yet)
+
+ Detected by OSS-fuzz
+ Closes #1874
+
+- configure: use -Wno-varargs on clang 3.9[.X] debug builds
+
+ ... to avoid a clang bug
+
+- [Max Dymond brought this change]
+
+ ossfuzz: add some more handled CURL options
+
+ Add support for HEADER, COOKIE, RANGE, CUSTOMREQUEST, MAIL_RECIPIENT,
+ MAIL_FROM and uploading data.
+
+- configure: check for C++ compiler after C, to make it non-fatal
+
+ The tests for object file/executable file extensions are presumably only
+ done for the first of these macros in the configure file.
+
+ Bug: https://github.com/curl/curl/pull/1851#issuecomment-327597515
+ Reported-by: Marcel Raad
+ Closes #1873
+
+Patrick Monnerat (7 Sep 2017)
+- form API: add new test 650.
+
+ Now that the form API is deprecated and not used anymore in curl tool,
+ a lot of its features left untested. Test 650 attempts to check all these
+ features not tested elsewhere.
+
+Jay Satiro (7 Sep 2017)
+- configure: fix curl_off_t check's include order
+
+ - Prepend srcdir include path instead of append.
+
+ Prior to this change it was possible that during the check for the size
+ of curl_off_t the include path of a user's already installed curl could
+ come before the include path of the to-be-built curl, resulting in the
+ system.h of the former being incorrectly included for that check.
+
+ Closes https://github.com/curl/curl/pull/1870
+
+Daniel Stenberg (7 Sep 2017)
+- [Jakub Zakrzewski brought this change]
+
+ KNOWN_BUGS: Remove CMake symbol hiding issue
+
+ It has already been fixed in 6140dfc
+
+- http-proxy: when not doing CONNECT, that phase is done immediately
+
+ `conn->connect_state` is NULL when doing a regular non-CONNECT request
+ over the proxy and should therefor be considered complete at once.
+
+ Fixes #1853
+ Closes #1862
+ Reported-by: Lawrence Wagerfield
+
+- [Johannes Schindelin brought this change]
+
+ OpenSSL: fix yet another mistake while encapsulating SSL backend data
+
+ Another mistake in my manual fixups of the largely mechanical
+ search-and-replace ("connssl->" -> "BACKEND->"), just like the previous
+ commit concerning HTTPS proxies (and hence not caught during my
+ earlier testing).
+
+ Fixes #1855
+ Closes #1871
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ OpenSSL: fix erroneous SSL backend encapsulation
+
+ In d65e6cc4f (vtls: prepare the SSL backends for encapsulated private
+ data, 2017-06-21), this developer prepared for a separation of the
+ private data of the SSL backends from the general connection data.
+
+ This conversion was partially automated (search-and-replace) and
+ partially manual (e.g. proxy_ssl's backend data).
+
+ Sadly, there was a crucial error in the manual part, where the wrong
+ handle was used: rather than connecting ssl[sockindex]' BIO to the
+ proxy_ssl[sockindex]', we reconnected proxy_ssl[sockindex]. The reason
+ was an incorrect location to paste "BACKEND->"... d'oh.
+
+ Reported by Jay Satiro in https://github.com/curl/curl/issues/1855.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Jay Satiro brought this change]
+
+ vtls: fix memory corruption
+
+ Ever since 70f1db321 (vtls: encapsulate SSL backend-specific data,
+ 2017-07-28), the code handling HTTPS proxies was broken because the
+ pointer to the SSL backend data was not swapped between
+ conn->ssl[sockindex] and conn->proxy_ssl[sockindex] as intended, but
+ instead set to NULL (causing segmentation faults).
+
+ [jes: provided the commit message, tested and verified the patch]
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- vtls: switch to CURL_SHA256_DIGEST_LENGTH define
+
+ ... instead of the prefix-less version since WolfSSL 3.12 now uses an
+ enum with that name that causes build failures for us.
+
+ Fixes #1865
+ Closes #1867
+ Reported-by: Gisle Vanem
+
+- travis: add c-ares enabled builds linux + osx
+
+ Closes #1868
+
+- HISTORY: added some recent items
+
+Jay Satiro (6 Sep 2017)
+- SSL: fix unused parameter warnings
+
+Patrick Monnerat (6 Sep 2017)
+- mime: drop internal FILE * support.
+
+ - The part kind MIMEKIND_FILE and associated code are suppressed.
+ - Seek data origin offset not used anymore: suppressed.
+ - MIMEKIND_NAMEDFILE renamed MIMEKIND_FILE; associated fields/functions
+ renamed accordingly.
+ - Curl_getformdata() processes stdin via a callback.
+
+Daniel Stenberg (6 Sep 2017)
+- configure: remove --enable-soname-bump and SONAME_BUMP
+
+ Back in 2008, (and commit 3f3d6ebe665f3) we changed the logic in how we
+ determine the native type for `curl_off_t`. To really make sure we
+ didn't break ABI without bumping SONAME, we introduced logic that
+ attempted to detect that it would use a different size and thus not be
+ compatible. We also provided a manual switch that allowed users to tell
+ configure to bump SONAME by force.
+
+ Today, we know of no one who ever got a SONAME bump auto-detected and we
+ don't know of anyone who's using the manual bump feature. The auto-
+ detection is also no longer working since we introduced defining
+ curl_off_t in system.h (7.55.0).
+
+ Finally, this bumping logic is not present in the cmake build.
+
+ Closes #1861
+
+Jay Satiro (6 Sep 2017)
+- [Gisle Vanem brought this change]
+
+ vtls: select ssl backend case-insensitive (follow-up)
+
+ - Do a case-insensitive comparison of CURL_SSL_BACKEND env as well.
+
+ - Change Curl_strcasecompare calls to strcasecompare
+ (maps to the former but shorter).
+
+ Follow-up to c290b8f.
+
+ Bug: https://github.com/curl/curl/commit/c290b8f#commitcomment-24094313
+
+ Co-authored-by: Jay Satiro
+
+- openssl: Integrate Peter Wu's SSLKEYLOGFILE implementation
+
+ This is an adaptation of 2 of Peter Wu's SSLKEYLOGFILE implementations.
+
+ The first one, written for old OpenSSL versions:
+ https://git.lekensteyn.nl/peter/wireshark-notes/tree/src/sslkeylog.c
+
+ The second one, written for BoringSSL and new OpenSSL versions:
+ https://github.com/curl/curl/pull/1346
+
+ Note the first one is GPL licensed but the author gave permission to
+ waive that license for libcurl.
+
+ As of right now this feature is disabled by default, and does not have
+ a configure option to enable it. To enable this feature define
+ ENABLE_SSLKEYLOGFILE when building libcurl and set environment
+ variable SSLKEYLOGFILE to a pathname that will receive the keys.
+
+ And in Wireshark change your preferences to point to that key file:
+ Edit > Preferences > Protocols > SSL > Master-Secret
+
+ Co-authored-by: Peter Wu
+
+ Ref: https://github.com/curl/curl/pull/1030
+ Ref: https://github.com/curl/curl/pull/1346
+
+ Closes https://github.com/curl/curl/pull/1866
+
+Patrick Monnerat (5 Sep 2017)
+- mime: fix a trivial warning.
+
+- mime: replace 'struct Curl_mimepart' by 'curl_mimepart' in encoder code.
+
+ mime_state is now a typedef.
+
+- mime: implement encoders.
+
+ curl_mime_encoder() is operational and documented.
+ curl tool -F option is extended with ";encoder=".
+ curl tool --libcurl option generates calls to curl_mime_encoder().
+ New encoder tests 648 & 649.
+ Test 1404 extended with an encoder specification.
+
+- runtests.pl: support attribute "nonewline" in part verify/upload.
+
+- [Daniel Stenberg brought this change]
+
+ fixup data/test1135
+
+- [Daniel Stenberg brought this change]
+
+ mime: unified to use the typedef'd mime structs everywhere
+
+ ... and slightly edited to follow our code style better.
+
+- [Daniel Stenberg brought this change]
+
+ curl.h: use lower case curl_mime* as for all public symbols
+
+- [Daniel Stenberg brought this change]
+
+ docs/curl_mime_*.3: use correct variable types in examples
+
+Kamil Dudka (5 Sep 2017)
+- openssl: use OpenSSL's default ciphers by default
+
+ Up2date versions of OpenSSL maintain the default reasonably secure
+ without breaking compatibility, so it is better not to override the
+ default by curl. Suggested at https://bugzilla.redhat.com/1483972
+
+ Closes #1846
+
+Viktor Szakats (5 Sep 2017)
+- examples/mime: minor example code fixes
+
+Daniel Stenberg (5 Sep 2017)
+- docs/curl_mime_*.3: added examples
+
+- configure: add MultiSSL to FEATURES when enabled
+
+ ...for curl-config and its corresponding test 1014
+
+- http-proxy: treat all 2xx as CONNECT success
+
+ Added test 1904 to verify.
+
+ Reported-by: Lawrence Wagerfield
+ Fixes #1859
+ Closes #1860
+
+- MAIL-ETIQUETTE: added "1.9 Your emails are public"
+
+- curl.h: fix "unused checksrc ignore", remove dangling reference
+
+ ... to a README file that doesn't exist anymore
+
+Viktor Szakats (4 Sep 2017)
+- docs: Update to secure URL versions
+
+- mime: use CURL_ZERO_TERMINATED in examples
+
+ and some minor whitespace fixes
+
+Daniel Stenberg (4 Sep 2017)
+- schannel: return CURLE_SSL_CACERT on failed verification
+
+ ... not *CACERT_BADFILE as it isn't really because of a bad file.
+
+ Bug: https://curl.haxx.se/mail/lib-2017-09/0002.html
+ Closes #1858
+
+- test1135: fixed after bd8070085f9
+
+- examples/post-callback: stop returning one byte at a time
+
+ ... since people copy and paste code from this example and thus they get
+ an inefficient POST operation without a good reason and sometimes
+ without understanding why.
+
+ Instead this now returns as much data as possible.
+
+- RELEASE-NOTES: fixed the function counter script
+
+- curl.h: make the curl_strequal() protos use the same style
+
+ ... as the other functions. Makes it easier to machine-parse!
+
+- docs: curl_mime_*.3 man page formatting edits
+
+- RELEASE-NOTES: synced with 1ab9e9b50
+
+Patrick Monnerat (4 Sep 2017)
+- lib: bump version info (soname). Adapt and reenable test 1135.
+
+Daniel Stenberg (3 Sep 2017)
+- headers: move the global_sslset() proto from multi.h to curl.h
+
+ As it was added to multi.h simply to not break test 1135, which now has
+ been disabled due to the mime API addition anyway and su we can now move
+ the sslset stuff to where the other curl_global_* prototypes are.
+
+Patrick Monnerat (3 Sep 2017)
+- mime: fix signed/unsigned conversions.
+
+ Use and generate CURL_ZERO_TERMINATED in curl tool and tests.
+
+Jay Satiro (3 Sep 2017)
+- tool_formparse: fix some trivial warnings
+
+Patrick Monnerat (3 Sep 2017)
+- mime: use size_t instead of ssize_t in public API interface.
+
+ To support telling a string is nul-terminated, symbol CURL_ZERO_TERMINATED
+ has been introduced.
+
+ Documentation updated accordingly.
+
+ symbols in versions updated. Added form API symbols deprecation info.
+
+- mime: remove support "-" stdin pseudo-file name in curl_mime_filedata().
+
+ This feature is badly supported in Windows: as a replacement, a caller has
+ to use curl_mime_data_cb() with fread, fseek and possibly fclose
+ callbacks to process opened files.
+
+ The cli tool and documentation are updated accordingly.
+
+ The feature is however kept internally for form API compatibility, with
+ the known caveats it always had.
+
+ As a side effect, stdin size is not determined by the cli tool even if
+ possible and this results in a chunked transfer encoding. Test 173 is
+ updated accordingly.
+
+- mime: fix some implicit curl_off_t --> size_t conversion warnings.
+
+- mime: tests and examples.
+
+ Additional mime-specific tests.
+ Existing tests updated to reflect small differences (Expect: 100-continue,
+ data size change due to empty lines, etc).
+ Option -F headers= keyword added to tests.
+ test1135 disabled until the entry point order change is resolved.
+ New example smtp-mime.
+ Examples postit2 and multi-post converted from form API to mime API.
+
+- mime: use in curl cli tool instead of form API.
+
+ Extended -F option syntax to support multipart mail messages.
+ -F keyword headers= added to include custom headers in parts.
+ Documentation upgraded.
+
+- mime: new MIME API.
+
+ Available in HTTP, SMTP and IMAP.
+ Deprecates the FORM API.
+ See CURLOPT_MIMEPOST.
+ Lib code and associated documentation.
+
+- test564: Add a warning comment about shell profile output.
+
+ Shell profile output makes the SSH server failing and this problem reason
+ is not easy to find when no hint is given.
+
+- checksrc: disable SPACEBEFOREPAREN for case statement.
+
+ The case keyword may be followed by a constant expression and thus should
+ allow it to start with an open parenthesis.
+
+- runtests.pl: allow <file[1-4]> tags in client section.
+
+ This enables tests to create more than one file on the client side.
+
+- runtests.pl: Apply strippart to upload too.
+
+ This will allow substitution of boundaries in mail messages.
+
+- Curl_base64_encode: always call with a real data handle.
+
+ Some calls in different modules were setting the data handle to NULL, causing
+ segmentation faults when using builds that enable character code conversions.
+
+- non-ascii: allow conversion functions to be called with a NULL data handle.
+
+- http: fix a memory leakage in checkrtspprefix().
+
+Daniel Stenberg (2 Sep 2017)
+- [Max Dymond brought this change]
+
+ ossfuzz: Move to C++ for curl_fuzzer.
+
+ Automake gets confused if you want to use C++ static libraries with C
+ code - basically we need to involve the clang++ linker. The easiest way
+ of achieving this is to rename the C code as C++ code. This gets us a
+ bit further along the path and ought to be compatible with Google's
+ version of clang.
+
+- curl_global_sslset: select backend by name case insensitively
+
+ Closes #1849
+
+- [Max Dymond brought this change]
+
+ ossfuzz: additional seed corpora
+
+ Create simple seed corpora for:
+ - FTP
+ - telnet
+ - dict
+ - tftp
+ - imap
+ - pop3
+
+ based off the tests of the same number.
+
+ Closes #1842
+
+- [Max Dymond brought this change]
+
+ ossfuzz: moving towards the ideal integration
+
+ - Start with the basic code from the ossfuzz project.
+ - Rewrite fuzz corpora to be binary files full of Type-Length-Value
+ data, and write a glue layer in the fuzzing function to convert
+ corpora into CURL options.
+ - Have supporting functions to generate corpora from existing tests
+ - Integrate with Makefile.am
+
+- strcase: corrected comment header for Curl_strcasecompare()
+
+- unit1301: fix error message on first test
+
+- curl_global_sslset.3: show the struct and enum too
+
+ ... so that users can actually write code based on the man page alone,
+ not having to read the header file.
+
+Jay Satiro (31 Aug 2017)
+- darwinssl: handle long strings in TLS certs (follow-up)
+
+ - Fix handling certificate subjects that are already UTF-8 encoded.
+
+ Follow-up to b3b75d1 from two days ago. Since then a copy would be
+ skipped if the subject was already UTF-8, possibly resulting in a NULL
+ deref later on.
+
+ Ref: https://github.com/curl/curl/issues/1823
+ Ref: https://github.com/curl/curl/pull/1831
+
+ Closes https://github.com/curl/curl/pull/1836
+
+Daniel Stenberg (31 Aug 2017)
+- cyassl: call it the "WolfSSL" backend
+
+ ... instead of cyassl, as this is the current name for it.
+
+ Closes #1844
+
+- polarssl: fix multissl breakage
+
+ Reported-by: Dan Fandrich
+ Bug: https://curl.haxx.se/mail/lib-2017-08/0121.html
+ Closes #1843
+
+- configure: remove the leading comma from the backends list
+
+ ... when darwinssl is used.
+
+ Reported-by: Viktor Szakats
+ Bug: https://github.com/curl/curl/commit/b0989cd3abaff4f9a0717b4875022fa79e33b481#commitcomment-23943493
+
+ Closes #1845
+
+Kamil Dudka (30 Aug 2017)
+- examples/sslbackend.c: fix failure of 'make checksrc'
+
+ ./sslbackend.c:58:3: warning: else after closing brace on same line (BRACEELSE)
+ } else if(isdigit(*name)) {
+ ^
+ ./sslbackend.c:62:3: warning: else after closing brace on same line (BRACEELSE)
+ } else
+ ^
+
+Viktor Szakats (30 Aug 2017)
+- makefile.m32: add multissl support
+
+ Closes https://github.com/curl/curl/pull/1840
+
+Daniel Stenberg (30 Aug 2017)
+- curl.h: CURLSSLBACKEND_WOLFSSL used wrong value
+
+ The CURLSSLBACKEND_WOLFSSL is supposed to be an alias for
+ CURLSSLBACKEND_CYASSL, but used an erronous value. To reduce the risk
+ for a similar mistake, define the backend aliases to use the enum values
+ instead.
+
+ Reported-by: Gisle Vanem
+ Bug: https://curl.haxx.se/mail/lib-2017-08/0120.html
+
+- curl_global_sslset.3: clarify
+
+ it is a one time *set*, not necessarily a one time use... it can be
+ called again if the first call failed or just listed the alternatives.
+
+ clarify that the available backends are the ones this build supports
+
+ plus add some formatting
+
+ Reported-by: Rich Gray
+ Bug: https://curl.haxx.se/mail/lib-2017-08/0119.html
+
+- curl/multi.h: remove duplicated closing c++ brace
+
+ Regression since 1328f69d53f2f2e93
+
+ Fixes #1841
+ Reported-by: Andrei Karas
+
+- RELEASE-NOTES: synced with 8c33c963a
+
+- HELP-US.md: spelling
+
+- HELP-US.md: "How to get started helping out in the curl project"
+
+ Closes #1837
+
+Dan Fandrich (29 Aug 2017)
+- asyn-thread: Fixed cleanup after OOM
+
+ destroy_async_data() assumes that if the flag "done" is not set yet, the
+ thread itself will clean up once the request is complete. But if an
+ error (generally OOM) occurs before the thread even has a chance to
+ start, it will never get a chance to clean up and memory will be leaked.
+ By clearing "done" only just before starting the thread, the correct
+ cleanup sequence will happen in all cases.
+
+Daniel Stenberg (28 Aug 2017)
+- curl_global_init.3: mention curl_global_sslset(3)
+
+Dan Fandrich (28 Aug 2017)
+- unit1606: Fixed shadowed variable warning
+
+- asyn-thread: Improved cleanup after OOM situations
+
+- asyn-thread: Set errno to the proper value ENOMEM in OOM situation
+
+ This used to be set in some configurations to EAI_MEMORY which is not a
+ valid value for errno and caused Curl_strerror to fail an assertion.
+
+Daniel Stenberg (28 Aug 2017)
+- [Johannes Schindelin brought this change]
+
+ configure: Handle "MultiSSL" specially When versioning symbols
+
+ There is a mode in which libcurl is compiled with versioned symbols,
+ depending on the active SSL backend.
+
+ When multiple SSL backends are active, it does not make sense to favor
+ one over the others, so let's not: introduce a new prefix for the case
+ where multiple SSL backends are compiled into cURL.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ configure: allow setting the default SSL backend
+
+ Previously, we used as default SSL backend whatever was first in the
+ `available_backends` array.
+
+ However, some users may want to override that default without patching
+ the source code.
+
+ Now they can: with the --with-default-ssl-backend=<backend> option of
+ the ./configure script.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: use Curl_ssl_multi pseudo backend only when needed
+
+ When only one SSL backend is configured, it is totally unnecessary to
+ let multissl_init() configure the backend at runtime, we can select the
+ correct backend at build time already.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ version: if built with more than one SSL backend, report all of them
+
+ To discern the active one from the inactive ones, put the latter into
+ parentheses.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ version: add the CURL_VERSION_MULTI_SSL feature flag
+
+ This new feature flag reports When cURL was built with multiple SSL
+ backends.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ metalink: allow compiling with multiple SSL backends
+
+ Previously, the code assumed that at most one of the SSL backends would
+ be compiled in, emulating OpenSSL's functions if the configured backend
+ was not OpenSSL itself.
+
+ However, now we allow building with multiple SSL backends and choosing
+ one at runtime. Therefore, metalink needs to be adjusted to handle this
+ scenario, too.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ docs/examples: demonstrate how to select SSL backends
+
+ The newly-introduced curl_global_sslset() function deserves to be
+ show-cased.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ Add a man page for curl_global_sslset()
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: introduce curl_global_sslset()
+
+ Let's add a compile time safe API to select an SSL backend. This
+ function needs to be called *before* curl_global_init(), and can be
+ called only once.
+
+ Side note: we do not explicitly test that it is called before
+ curl_global_init(), but we do verify that it is not called multiple times
+ (even implicitly).
+
+ If SSL is used before the function was called, it will use whatever the
+ CURL_SSL_BACKEND environment variable says (or default to the first
+ available SSL backend), and if a subsequent call to
+ curl_global_sslset() disagrees with the previous choice, it will fail
+ with CURLSSLSET_TOO_LATE.
+
+ The function also accepts an "avail" parameter to point to a (read-only)
+ NULL-terminated list of available backends. This comes in real handy if
+ an application wants to let the user choose between whatever SSL backends
+ the currently available libcurl has to offer: simply call
+
+ curl_global_sslset(-1, NULL, &avail);
+
+ which will return CURLSSLSET_UNKNOWN_BACKEND and populate the avail
+ variable to point to the relevant information to present to the user.
+
+ Just like with the HTTP/2 push functions, we have to add the function
+ declaration of curl_global_sslset() function to the header file
+ *multi.h* because VMS and OS/400 require a stable order of functions
+ declared in include/curl/*.h (where the header files are sorted
+ alphabetically). This looks a bit funny, but it cannot be helped.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: refactor out essential information about the SSL backends
+
+ There is information about the compiled-in SSL backends that is really
+ no concern of any code other than the SSL backend itself, such as which
+ function (if any) implements SHA-256 summing.
+
+ And there is information that is really interesting to the user, such as
+ the name, or the curl_sslbackend value.
+
+ Let's factor out the latter into a publicly visible struct. This
+ information will be used in the upcoming API to set the SSL backend
+ globally.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: allow selecting which SSL backend to use at runtime
+
+ When building software for the masses, it is sometimes not possible to
+ decide for all users which SSL backend is appropriate.
+
+ Git for Windows, for example, uses cURL to perform clones, fetches and
+ pushes via HTTPS, and some users strongly prefer OpenSSL, while other
+ users really need to use Secure Channel because it offers
+ enterprise-ready tools to manage credentials via Windows' Credential
+ Store.
+
+ The current Git for Windows versions use the ugly work-around of
+ building libcurl once with OpenSSL support and once with Secure Channel
+ support, and switching out the binaries in the installer depending on
+ the user's choice.
+
+ Needless to say, this is a super ugly workaround that actually only
+ works in some cases: Git for Windows also comes in a portable form, and
+ in a form intended for third-party applications requiring Git
+ functionality, in which cases this "swap out libcurl-4.dll" simply is
+ not an option.
+
+ Therefore, the Git for Windows project has a vested interest in teaching
+ cURL to make the SSL backend a *runtime* option.
+
+ This patch makes that possible.
+
+ By running ./configure with multiple --with-<backend> options, cURL will
+ be built with multiple backends.
+
+ For the moment, the backend can be configured using the environment
+ variable CURL_SSL_BACKEND (valid values are e.g. "openssl" and
+ "schannel").
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: fold the backend ID into the Curl_ssl structure
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ curl_ntlm_core: don't complain but #include OpenSSL header if needed
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: encapsulate SSL backend-specific data
+
+ So far, all of the SSL backends' private data has been declared as
+ part of the ssl_connect_data struct, in one big #if .. #elif .. #endif
+ block.
+
+ This can only work as long as the SSL backend is a compile-time option,
+ something we want to change in the next commits.
+
+ Therefore, let's encapsulate the exact data needed by each SSL backend
+ into a private struct, and let's avoid bleeding any SSL backend-specific
+ information into urldata.h. This is also necessary to allow multiple SSL
+ backends to be compiled in at the same time, as e.g. OpenSSL's and
+ CyaSSL's headers cannot be included in the same .c file.
+
+ To avoid too many malloc() calls, we simply append the private structs
+ to the connectdata struct in allocate_conn().
+
+ This requires us to take extra care of alignment issues: struct fields
+ often need to be aligned on certain boundaries e.g. 32-bit values need to
+ be stored at addresses that divide evenly by 4 (= 32 bit / 8
+ bit-per-byte).
+
+ We do that by assuming that no SSL backend's private data contains any
+ fields that need to be aligned on boundaries larger than `long long`
+ (typically 64-bit) would need. Under this assumption, we simply add a
+ dummy field of type `long long` to the `struct connectdata` struct. This
+ field will never be accessed but acts as a placeholder for the four
+ instances of ssl_backend_data instead. the size of each ssl_backend_data
+ struct is stored in the SSL backend-specific metadata, to allow
+ allocate_conn() to know how much extra space to allocate, and how to
+ initialize the ssl[sockindex]->backend and proxy_ssl[sockindex]->backend
+ pointers.
+
+ This would appear to be a little complicated at first, but is really
+ necessary to encapsulate the private data of each SSL backend correctly.
+ And we need to encapsulate thusly if we ever want to allow selecting
+ CyaSSL and OpenSSL at runtime, as their headers cannot be included within
+ the same .c file (there are just too many conflicting definitions and
+ declarations for that).
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: prepare the SSL backends for encapsulated private data
+
+ At the moment, cURL's SSL backend needs to be configured at build time.
+ As such, it is totally okay for them to hard-code their backend-specific
+ data in the ssl_connect_data struct.
+
+ In preparation for making the SSL backend a runtime option, let's make
+ the access of said private data a bit more abstract so that it can be
+ adjusted later in an easy manner.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ urldata.h: move SSPI-specific #include to correct location
+
+ In 86b889485 (sasl_gssapi: Added GSS-API based Kerberos V5 variables,
+ 2014-12-03), an SSPI-specific field was added to the kerberos5data
+ struct without moving the #include "curl_sspi.h" later in the same file.
+
+ This broke the build when SSPI was enabled, unless Secure Channel was
+ used as SSL backend, because it just so happens that Secure Channel also
+ requires "curl_sspi.h" to be #included.
+
+ In f4739f639 (urldata: include curl_sspi.h when Windows SSPI is enabled,
+ 2017-02-21), this bug was fixed incorrectly: Instead of moving the
+ appropriate conditional #include, the Secure Channel-conditional part
+ was now also SSPI-conditional.
+
+ Fix this problem by moving the correct #include instead.
+
+ This is also required for an upcoming patch that moves all the Secure
+ Channel-specific stuff out of urldata.h and encapsulates it properly in
+ vtls/schannel.c instead.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ urldata.h: remove support for obsolete PolarSSL version
+
+ Since 5017d5ada (polarssl: now require 1.3.0+, 2014-03-17), we require
+ a newer PolarSSL version. No need to keep code trying to support any
+ older version.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ getinfo: access SSL internals via Curl_ssl
+
+ In the ongoing endeavor to abstract out all SSL backend-specific
+ functionality, this is the next step: Instead of hard-coding how the
+ different SSL backends access their internal data in getinfo.c, let's
+ implement backend-specific functions to do that task.
+
+ This will also allow for switching SSL backends as a runtime option.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: move SSL backends' private constants out of their header files
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ axtls: use Curl_none_* versions of init() and cleanup()
+
+ There are convenient no-op versions of the init/cleanup functions now,
+ no need to define private ones for axTLS.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: remove obsolete declarations of SSL backend functionality
+
+ These functions are all available via the Curl_ssl struct now, no need
+ to declare them separately anymore.
+
+ As the global declarations are removed, the corresponding function
+ definitions are marked as file-local. The only two exceptions here are
+ Curl_mbedtls_shutdown() and Curl_polarssl_shutdown(): only the
+ declarations were removed, there are no function definitions to mark
+ file-local.
+
+ Please note that Curl_nss_force_init() is *still* declared globally, as
+ the only SSL backend-specific function, because it was introduced
+ specifically for the use case where cURL was compiled with
+ `--without-ssl --with-nss`. For details, see f3b77e561 (http_ntlm: add
+ support for NSS, 2010-06-27).
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ schannel: reorder functions topologically
+
+ The _shutdown() function calls the _session_free() function; While this
+ is not a problem now (because schannel.h declares both functions), a
+ patch looming in the immediate future with make all of these functions
+ file-local.
+
+ So let's just move the _session_free() function's definition before it
+ is called.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ axtls: reorder functions topologically
+
+ The connect_finish() function (like many other functions after it) calls
+ the Curl_axtls_close() function; While this is not a problem now
+ (because axtls.h declares the latter function), a patch looming in the
+ immediate future with make all of these functions file-local.
+
+ So let's just move the Curl_axtls_close() function's definition before
+ it is called.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: move the SUPPORT_HTTPS_PROXY flag into the Curl_ssl struct
+
+ That will allow us to choose the SSL backend at runtime.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: convert the have_curlssl_* constants to runtime flags
+
+ The entire idea of introducing the Curl_ssl struct to describe SSL
+ backends is to prepare for choosing the SSL backend at runtime.
+
+ To that end, convert all the #ifdef have_curlssl_* style conditionals
+ to use bit flags instead.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: move sha256sum into the Curl_ssl struct
+
+ The SHA-256 checksumming is also an SSL backend-specific function.
+ Let's include it in the struct declaring the functionality of SSL
+ backends.
+
+ In contrast to MD5, there is no fall-back code. To indicate this, the
+ respective entries are NULL for those backends that offer no support for
+ SHA-256 checksumming.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: move md5sum into the Curl_ssl struct
+
+ The MD5 summing is also an SSL backend-specific function. So let's
+ include it, offering the previous fall-back code as a separate function
+ now: Curl_none_md5sum(). To allow for that, the signature had to be
+ changed so that an error could be returned from the implementation
+ (Curl_none_md5sum() can run out of memory).
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: use the Curl_ssl struct to access all SSL backends' functionality
+
+ This is the first step to unify the SSL backend handling. Now all the
+ SSL backend-specific functionality is accessed via a global instance of
+ the Curl_ssl struct.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: declare Curl_ssl structs for every SSL backend
+
+ The idea of introducing the Curl_ssl struct was to unify how the SSL
+ backends are declared and called. To this end, we now provide an
+ instance of the Curl_ssl struct for each and every SSL backend.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: introduce a new struct for SSL backends
+
+ This new struct is similar in nature to Curl_handler: it will define the
+ functions and capabilities of all the SSL backends (where Curl_handler
+ defines the functions and capabilities of protocol handlers).
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: make sure every _sha256sum()'s first arg is const
+
+ This patch makes the signature of the _sha256sum() functions consistent
+ among the SSL backends, in preparation for unifying the way all SSL
+ backends are accessed.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: make sure all _data_pending() functions return bool
+
+ This patch makes the signature of the _data_pending() functions
+ consistent among the SSL backends, in preparation for unifying the way
+ all SSL backends are accessed.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: make sure all _cleanup() functions return void
+
+ This patch makes the signature of the _cleanup() functions consistent
+ among the SSL backends, in preparation for unifying the way all SSL
+ backends are accessed.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Johannes Schindelin brought this change]
+
+ vtls: use consistent signature for _random() implementations
+
+ This will make the upcoming multissl backend much easier to implement.
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- strtooff: fix build for systems with long long but no strtoll option
+
+ Closes #1829
+
+ Reported-by: Dan Fandrich
+ Bug: https://github.com/curl/curl/pull/1758#issuecomment-324861615
+
+- darwinssl: handle long strings in TLS certs
+
+ ... as the previous fixed length 128 bytes buffer was sometimes too
+ small.
+
+ Fixes #1823
+ Closes #1831
+
+ Reported-by: Benjamin Sergeant
+ Assisted-by: Bill Pyne, Ray Satiro, Nick Zitzmann
+
+- system.h: include sys/poll.h for AIX
+
+ ... to get the event/revent defines that might be used for the poll
+ struct.
+
+ Reported-by: Michael Smith
+ Fixes #1828
+ Closes #1833
+
+Dan Fandrich (26 Aug 2017)
+- tests: Make sure libtests & unittests call curl_global_cleanup()
+
+ These were missed in commit c468c27b.
+
+Jay Satiro (26 Aug 2017)
+- [theantigod brought this change]
+
+ winbuild: fix embedded manifest option
+
+ Embedded manifest option didn't work due to incorrect path.
+
+ Fixes https://github.com/curl/curl/issues/1832
+
+Daniel Stenberg (25 Aug 2017)
+- fuzz/Makefile.am: remove curlbuild.h leftovers
+
+- examples/threaded-ssl: mention that this is for openssl before 1.1
+
+- imap: use defined names for response codes
+
+ When working on this code I found the previous setup a bit weird while
+ using proper defines increases readability.
+
+ Closes #1824
+
+- CURLOPT_USERPWD.3: see also CURLOPT_PROXYUSERPWD
+
+- imap: support PREAUTH
+
+ It is a defined possible greeting at server startup that means the
+ connection is already authenticated. See
+ https://tools.ietf.org/html/rfc3501#section-7.1.4
+
+ Test 846 added to verify.
+
+ Fixes #1818
+ Closes #1820
+
+Jay Satiro (23 Aug 2017)
+- config-tpf: define SIZEOF_LONG
+
+ Recent changes that replaced CURL_SIZEOF_LONG in the source with
+ SIZEOF_LONG broke builds that use the premade configuration files and
+ don't have SIZEOF_LONG defined.
+
+ Bug: https://github.com/curl/curl/issues/1816
+
+Dan Fandrich (23 Aug 2017)
+- test1453: Fixed <features>
+
+Daniel Stenberg (22 Aug 2017)
+- [Gisle Vanem brought this change]
+
+ config-dos: add missing defines, SIZEOF_* and two others
+
+ Bug: #1816
+
+- curl: shorten and clean up CA cert verification error message
+
+ The previous message was just too long for ordinary people and it was
+ encouraging users to use `--insecure` a little too easy.
+
+ Based-on-work-by: Frank Denis
+
+ Closes #1810
+ Closes #1817
+
+- request-target.d: mention added in 7.55.0
+
+Marcel Raad (22 Aug 2017)
+- tool_main: turn off MinGW CRT's globbing
+
+ By default, the MinGW CRT globs command-line arguments. This prevents
+ getting a single asterisk into an argument as test 1299 does. Turn off
+ globbing by setting the global variable _CRT_glob to 0 for MinGW.
+
+ Fixes https://github.com/curl/curl/issues/1751
+ Closes https://github.com/curl/curl/pull/1813
+
+Viktor Szakats (22 Aug 2017)
+- makefile.m32: add support for libidn2
+
+ libidn was replaced with libidn2 last year in configure.
+ Caveat: libidn2 may depend on a list of further libs.
+ These can be manually specified via CURL_LDFLAG_EXTRAS.
+
+ Closes https://github.com/curl/curl/pull/1815
+
+Jay Satiro (22 Aug 2017)
+- [Viktor Szakats brought this change]
+
+ config-win32: define SIZEOF_LONG
+
+ Recent changes that replaced CURL_SIZEOF_LONG in the source with
+ SIZEOF_LONG broke builds that use the premade configuration files and
+ don't have SIZEOF_LONG defined.
+
+ Closes https://github.com/curl/curl/pull/1814
+
+Daniel Stenberg (20 Aug 2017)
+- cmake: enable picky compiler options with clang and gcc
+
+ closes #1799
+
+- curl/system.h: fix build for hppa
+
+ Reported-by: John David Anglin
+ Bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=872502#10
+
+- [Even Rouault brought this change]
+
+ tftp: fix memory leak on too long filename
+
+ Fixes
+
+ $ valgrind --leak-check=full ~/install-curl-git/bin/curl tftp://localhost/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz
+
+ ==9752== Memcheck, a memory error detector
+ ==9752== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
+ ==9752== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
+ ==9752== Command: /home/even/install-curl-git/bin/curl tftp://localhost/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz
+ ==9752==
+ curl: (71) TFTP file name too long
+
+ ==9752==
+ ==9752== HEAP SUMMARY:
+ ==9752== 505 bytes in 1 blocks are definitely lost in loss record 11 of 11
+ ==9752== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
+ ==9752== by 0x4E61CED: Curl_urldecode (in /home/even/install-curl-git/lib/libcurl.so.4.4.0)
+ ==9752== by 0x4E75868: tftp_state_machine (in /home/even/install-curl-git/lib/libcurl.so.4.4.0)
+ ==9752== by 0x4E761B6: tftp_do (in /home/even/install-curl-git/lib/libcurl.so.4.4.0)
+ ==9752== by 0x4E711B6: multi_runsingle (in /home/even/install-curl-git/lib/libcurl.so.4.4.0)
+ ==9752== by 0x4E71D00: curl_multi_perform (in /home/even/install-curl-git/lib/libcurl.so.4.4.0)
+ ==9752== by 0x4E6950D: curl_easy_perform (in /home/even/install-curl-git/lib/libcurl.so.4.4.0)
+ ==9752== by 0x40E0B7: operate_do (in /home/even/install-curl-git/bin/curl)
+ ==9752== by 0x40E849: operate (in /home/even/install-curl-git/bin/curl)
+ ==9752== by 0x402693: main (in /home/even/install-curl-git/bin/curl)
+
+ Fixes https://oss-fuzz.com/v2/testcase-detail/5232311106797568
+ Credit to OSS Fuzz
+
+ Closes #1808
+
+Dan Fandrich (19 Aug 2017)
+- runtests: fixed case insensitive matching of keywords
+
+ Commit 5c2aac71 didn't work in the case of mixed-case keywords given on
+ the command-line.
+
+- tests: Make sure libtests call curl_global_cleanup()
+
+ This ensures that global data allocations are freed so Valgrind stays
+ happy. This was a problem with at least PolarSSL and mbedTLS.
+
+Daniel Stenberg (18 Aug 2017)
+- RELEASE-NOTES: synced with 8baead425
+
+- scripts/contri*sh: use "git log --use-mailmap"
+
+- mailmap: de-duplify some git authors
+
+- http2_recv: return error better on fatal h2 errors
+
+ Ref #1012
+ Figured-out-by: Tatsuhiro Tsujikawa
+
+- KNOWN_BUGS: HTTP test server 'connection-monitor' problems
+
+ Closes #868
+
+- curl/system.h: check for __ppc__ as well
+
+ ... regression since issue #1774 (commit 10b3df10596a) since obviously
+ some older gcc doesn't know __powerpc__ while some newer doesn't know
+ __ppc__ ...
+
+ Fixes #1797
+ Closes #1798
+ Reported-by: Ryan Schmidt
+
+- [Jan Alexander Steffens (heftig) brought this change]
+
+ http: Don't wait on CONNECT when there is no proxy
+
+ Since curl 7.55.0, NetworkManager almost always failed its connectivity
+ check by timeout. I bisected this to 5113ad04 (http-proxy: do the HTTP
+ CONNECT process entirely non-blocking).
+
+ This patch replaces !Curl_connect_complete with Curl_connect_ongoing,
+ which returns false if the CONNECT state was left uninitialized and lets
+ the connection continue.
+
+ Closes #1803
+ Fixes #1804
+
+ Also-fixed-by: Gergely Nagy
+
+- [Johannes Schindelin brought this change]
+
+ metalink: adjust source code style
+
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- CURL_SIZEOF_LONG: removed, use only SIZEOF_LONG
+
+- lib557: no longer use CURL_SIZEOF_* defines
+
+- config-win32: define SIZEOF_CURL_OFF_T
+
+- cmake: sizeof curl_off_t, remove unused detections
+
+- system.h: remove all CURL_SIZEOF_* defines
+
+ ... as they're not used externally and internally we check for the sizes
+ already in configure etc.
+
+ Closes #1767
+
+- ftp: fix CWD when doing multicwd then nocwd on same connection
+
+ Fixes #1782
+ Closes #1787
+ Reported-by: Peter Lamare
+
+- CURLOPT_SSH_COMPRESSION.3: enable with 1L
+
+ (leaves other values reserved for the future)
+
+- compressed-ssh.d: "Added: 7.56.0"
+
+- curl/system.h: checksrc compliance
+
+Jay Satiro (17 Aug 2017)
+- [Viktor Szakats brought this change]
+
+ ssh: add the ability to enable compression (for SCP/SFTP)
+
+ The required low-level logic was already available as part of
+ `libssh2` (via `LIBSSH2_FLAG_COMPRESS` `libssh2_session_flag()`[1]
+ option.)
+
+ This patch adds the new `libcurl` option `CURLOPT_SSH_COMPRESSION`
+ (boolean) and the new `curl` command-line option `--compressed-ssh`
+ to request this `libssh2` feature. To have compression enabled, it
+ is required that the SSH server supports a (zlib) compatible
+ compression method and that `libssh2` was built with `zlib` support
+ enabled.
+
+ [1] https://www.libssh2.org/libssh2_session_flag.html
+
+ Ref: https://github.com/curl/curl/issues/1732
+ Closes https://github.com/curl/curl/pull/1735
+
+- examples/ftpuploadresume: checksrc compliance
+
+- [Maksim Stsepanenka brought this change]
+
+ http_proxy: fix build error for CURL_DOES_CONVERSIONS
+
+ Closes https://github.com/curl/curl/pull/1793
+
+GitHub (16 Aug 2017)
+- [Nick Zitzmann brought this change]
+
+ configure: check for __builtin_available() availability (#1788)
+
+ This change does two things:
+ 1. It un-breaks the build in Xcode 9.0. (Xcode 9.0 is currently
+ failing trying to compile connectx() in lib/connect.c.)
+ 2. It finally weak-links the connectx() function, and falls back on
+ connect() when run on older operating systems.
+
+Daniel Stenberg (16 Aug 2017)
+- travis: add metalink to some osx builds
+
+ Closes #1790
+
+- [Max Dymond brought this change]
+
+ coverage: Use two coveralls commands to get lib/vtls results
+
+ closes #1747
+
+- darwinssi: fix error: variable length array used
+
+- m4/curl-compilers.m4: use proper quotes around string, not backticks
+
+ ... when setting clang version to assume 3.7
+
+ Caused a lot of "integer expression expected" warnings by configure.
+
+- [Benbuck Nason brought this change]
+
+ cmake: remove dead code for DISABLED_THREADSAFE
+
+ Closes #1786
+
+Jay Satiro (15 Aug 2017)
+- [Jakub Zakrzewski brought this change]
+
+ curl-confopts.m4: fix --disable-threaded-resolver
+
+ Closes https://github.com/curl/curl/issues/1784
+
+Daniel Stenberg (15 Aug 2017)
+- [Ryan Winograd brought this change]
+
+ progress: Track total times following redirects
+
+ Update the progress timers `t_nslookup`, `t_connect`, `t_appconnect`,
+ `t_pretransfer`, and `t_starttransfer` to track the total times for
+ these activities when a redirect is followed. Previously, only the times
+ for the most recent request would be tracked.
+
+ Related changes:
+
+ - Rename `Curl_pgrsResetTimesSizes` to `Curl_pgrsResetTransferSizes`
+ now that the function only resets transfer sizes and no longer
+ modifies any of the progress timers.
+
+ - Add a bool to the `Progress` struct that is used to prevent
+ double-counting `t_starttransfer` times.
+
+ Added test case 1399.
+
+ Fixes #522 and Known Bug 1.8
+ Closes #1602
+ Reported-by: joshhe on github
+
+- [Benbuck Nason brought this change]
+
+ cmake: remove dead code for CURL_DISABLE_RTMP
+
+ Closes #1785
+
+Kamil Dudka (15 Aug 2017)
+- zsh.pl: produce a working completion script again
+
+ Commit curl-7_54_0-118-g8b2f22e changed the output format of curl --help
+ to use <file> and <dir> instead of FILE and DIR, which caused zsh.pl to
+ produce a broken completion script:
+
+ % curl --<TAB>
+ _curl:10: no such file or directory: seconds
+
+ Closes #1779
+
+Daniel Stenberg (15 Aug 2017)
+- curlver: toward 7.56.0?
+
+- RELEASE-NOTES: synced with 91c46dc44
+
+- test1449: FTP download range with an too large size
+
+- strtoofft: reduce integer overflow risks globally
+
+ ... make sure we bail out on overflows.
+
+ Reported-by: Brian Carpenter
+ Closes #1758
+
+- travis: build the examples too
+
+ to make sure they keep building warning-free
+
+ Closes #1777
+
+- runtests: match keywords case insensitively
+
+- examples/ftpuploadresume.c: use portable code
+
+ ... converted from the MS specific _snscanf()
+
Version 7.55.1 (13 Aug 2017)
Daniel Stenberg (13 Aug 2017)
@@ -3622,2766 +6843,3 @@ Daniel Stenberg (4 Apr 2017)
When only a few additional file descriptors are used, avoid the malloc.
Closes #1377
-
-Marcel Raad (3 Apr 2017)
-- tests/server/util: remove in6addr_any for recent MinGW
-
- In ancient MinGW versions, in6addr_any was declared as extern, but not
- defined. Because of that, 22a0c57746ae12506b1ba0f0fafffd26c1907d6a added
- definitions for in6addr_any when compiling with MinGW. The bug was fixed in
- w32api version 3.6 from 2006, so this workaround is not needed anymore for
- recent versions.
-
- This fixes the following MinGW-w64 warnings because the MinGW-w64 version of
- IN6ADDR_ANY_INIT has the two additional braces inside the macro:
- util.c:59:14: warning: braces around scalar initializer
- util.c:59:40: warning: excess elements in scalar initializer
-
- Ref: https://sourceforge.net/p/mingw/mingw-org-wsl/ci/e4803e0da25c57ae1ad0fa75ae2b7182ff7fa339/tree/w32api/ChangeLog
- Closes https://github.com/curl/curl/pull/1379
-
-Daniel Stenberg (3 Apr 2017)
-- docs: added examples for CURLINFO_FILETIME.3 and CURLOPT_FILETIME.3
-
-Jay Satiro (31 Mar 2017)
-- fail-early.d: fix typos
-
-- docs: Explain --fail-early does not imply --fail
-
- Closes https://github.com/curl/curl/pull/1375
-
-Daniel Stenberg (1 Apr 2017)
-- telnet: (win32) fix read callback return variable
-
- telnet.c(1427,21): warning: comparison of constant 268435456 with
- expression of type 'CURLcode' is always false
-
- telnet.c(1433,21): warning: comparison of constant 268435457 with
- expression of type 'CURLcode' is always false
-
- Reviewed-by: Jay Satiro
- Reported-by: Gisle Vanem
- Bug: https://github.com/curl/curl/issues/1225#issuecomment-290340890
-
- Closes #1374
-
-- CTestConfig.cmake: removed, unused
-
-- libcurl.def: removed, unused
-
-- docs/index.html: removed, was not shipped anyway
-
-- dist: add missing files to the tarball
-
-Peter Wu (30 Mar 2017)
-- cmake: fix build with cmake 2.8.12.2
-
- For some reason, CMake 2.8.12.2 did not expand the list argument in a
- single DEPENDS argument. Remove the quotes, so it gets expanded into
- multiple arguments for add_custom_command and add_custom_target.
-
- Fixes https://github.com/curl/curl/issues/1370
- Closes #1372
-
-Marcel Raad (30 Mar 2017)
-- ssh: fix narrowing conversion warning
-
- 'left' is used as time_t but declared as long.
- MinGW complains:
- error: conversion to 'long int' from 'time_t {aka long long int}' may alter
- its value [-Werror=conversion]
- Changed the declaration to time_t.
-
-- http2: silence unused parameter warnings
-
- In release mode, MinGW complains:
- error: unused parameter 'lib_error_code' [-Werror=unused-parameter]
-
-Daniel Stenberg (30 Mar 2017)
-- [Hanno Böck brought this change]
-
- curl: fix callback functions to match prototype
-
- The function tool_debug_cb doesn't match curl_debug_callback in curl.h
- (unsigned vs. signed char* for 3rd param).
-
- Bug: https://curl.haxx.se/mail/lib-2017-03/0120.html
-
-- [Alexis La Goutte brought this change]
-
- gcc7: fix ‘*’ in boolean context, suggest ‘&&’ instead [-Wint-in-bool-context]
-
- Closes #1371
-
-Marcel Raad (30 Mar 2017)
-- schannel: fix unused variable warning
-
- If CURL_DISABLE_VERBOSE_STRINGS is defined, hostname is not used in
- schannel_connect_step3.
-
-- connect: fix unreferenced parameter warning
-
- When CURL_DISABLE_VERBOSE_STRINGS is defined, the reason parameter in
- Curl_conncontrol is not used as the infof macro expands to nothing.
-
-- select: use correct SIZEOF_ constant
-
- At least under Windows, there is no SIZEOF_LONG, so it evaluates to 0 even
- though sizeof(int) == sizeof(long). This should probably have been
- CURL_SIZEOF_LONG, but the type of timeout_ms changed from long to time_t
- anyway.
- This triggered MSVC warning C4668 about implicitly replacing undefined
- macros with '0'.
-
- Closes https://github.com/curl/curl/pull/1362
-
-Daniel Stenberg (30 Mar 2017)
-- cmake: add cmake file in docs/libcurl/opts/ to dist
-
-- cmake: add more missing files to the dist
-
-- docs/Makefile.am: include CMakeLists.txt in the dist tarball
-
-Marcel Raad (29 Mar 2017)
-- NTLM: check for features with #ifdef instead of #if
-
- Feature defines are normally checked with #ifdef instead of #if in the rest of
- the codebase. Additionally, some compilers warn when a macro is implicitly
- evaluated to 0 because it is not defined, which was the case here.
-
- Ref: https://github.com/curl/curl/pull/1362#discussion_r108605101
- Closes https://github.com/curl/curl/pull/1367
-
-Daniel Stenberg (29 Mar 2017)
-- [Hanno Böck brought this change]
-
- curl: fix callback argument inconsistency
-
- As you can see the callback definition uses a char* for the first
- argument, while the function uses a void*.
-
- URL: https://curl.haxx.se/mail/lib-2017-03/0116.html
-
-- RELEASE-NOTES: synced with 556c51a2df
-
-- [madblobfish brought this change]
-
- KNOWN_BUGS: typo
-
- Closes #1364
-
-- [Maksim Stsepanenka brought this change]
-
- make: use the variable MAKE for recursive calls
-
- Closes #1366
-
-- conncache: make hashkey avoid malloc
-
- ... to make it much faster. Idea developed with primepie on IRC.
-
- Closes #1365
-
-Kamil Dudka (28 Mar 2017)
-- http: do not treat FTPS over CONNECT as HTTPS
-
- If we use FTPS over CONNECT, the TLS handshake for the FTPS control
- connection needs to be initiated in the SENDPROTOCONNECT state, not
- the WAITPROXYCONNECT state. Otherwise, if the TLS handshake completed
- without blocking, the information about the completed TLS handshake
- would be saved to a wrong flag. Consequently, the TLS handshake would
- be initiated in the SENDPROTOCONNECT state once again on the same
- connection, resulting in a failure of the TLS handshake. I was able to
- observe the failure with the NSS backend if curl ran through valgrind.
-
- Note that this commit partially reverts curl-7_21_6-52-ge34131d.
-
-Daniel Stenberg (28 Mar 2017)
-- pause: handle mixed types of data when paused
-
- When receiving chunked encoded data with trailers, and the write
- callback returns PAUSE, there might be both body and header to store to
- resend on unpause. Previously libcurl returned error for that case.
-
- Added test case 1540 to verify.
-
- Reported-by: Stephen Toub
- Fixes #1354
- Closes #1357
-
-Jay Satiro (28 Mar 2017)
-- [Isaac Boukris brought this change]
-
- http: Fix proxy connection reuse with basic-auth
-
- When using basic-auth, connections and proxy connections
- can be re-used with different Authorization headers since
- it does not authenticate the connection (like NTLM does).
-
- For instance, the below command should re-use the proxy
- connection, but it currently doesn't:
- curl -v -U alice:a -x http://localhost:8181 http://localhost/
- --next -U bob:b -x http://localhost:8181 http://localhost/
-
- This is a regression since refactoring of ConnectionExists()
- as part of: cb4e2be7c6d42ca0780f8e0a747cecf9ba45f151
-
- Fix the above by removing the username and password compare
- when re-using proxy connection at proxy_info_matches().
-
- However, this fix brings back another bug would make curl
- to re-print the old proxy-authorization header of previous
- proxy basic-auth connection because it wasn't cleared.
-
- For instance, in the below command the second request should
- fail if the proxy requires authentication, but would succeed
- after the above fix (and before aforementioned commit):
- curl -v -U alice:a -x http://localhost:8181 http://localhost/
- --next -x http://localhost:8181 http://localhost/
-
- Fix this by clearing conn->allocptr.proxyuserpwd after use
- unconditionally, same as we do for conn->allocptr.userpwd.
-
- Also fix test 540 to not expect digest auth header to be
- resent when connection is reused.
-
- Signed-off-by: Isaac Boukris <iboukris@gmail.com>
-
- Closes https://github.com/curl/curl/pull/1350
-
-- openssl: exclude DSA code when OPENSSL_NO_DSA is defined
-
- - Fix compile errors that occur in openssl.c when OpenSSL lib was
- built without DSA support.
-
- Bug: https://github.com/curl/curl/issues/1361
- Reported-by: neheb@users.noreply.github.com
-
-- examples/fopen: checksrc compliance
-
-Marcel Raad (28 Mar 2017)
-- schannel: fix variable shadowing warning
-
- No need to redeclare the variable.
-
-- multi: fix MinGW-w64 compiler warnings
-
- error: conversion to 'long int' from 'time_t {aka long long int}' may alter
- its value [-Werror=conversion]
-
-- .gitattributes: turn off CRLF for *.am
-
- If Makefile.am uses CRLF, buildconf in a Windows checkout fails with:
- ".ibtoolize: error: AC_CONFIG_MACRO_DIRS([m4]) conflicts with
- ACLOCAL_AMFLAGS=-I m4"
-
-Daniel Stenberg (26 Mar 2017)
-- [klemens brought this change]
-
- spelling fixes
-
- Closes #1356
-
-- curl: check for end of input in writeout backslash handling
-
- Reported-by: Brian Carpenter
-
- Added test 1442 to verify
-
-Marcel Raad (24 Mar 2017)
-- tests/README: make "Run" section foolproof
-
- curl must be built before building the tests.
-
- Closes https://github.com/curl/curl/pull/1352
-
-Daniel Stenberg (23 Mar 2017)
-- openssl: fix comparison between signed and unsigned integer expressions
-
-Marcel Raad (23 Mar 2017)
-- [Edward Kimmel brought this change]
-
- asiohiper: make sure socket is open in event_cb
-
- Send curl_socket_t to event_cb and make sure it hasn't been closed yet.
-
- Closes https://github.com/curl/curl/pull/1318
-
-Dan Fandrich (23 Mar 2017)
-- openssl: made the error table static const
-
-Jay Satiro (23 Mar 2017)
-- openssl: fall back on SSL_ERROR_* string when no error detail
-
- - If SSL_get_error is called but no extended error detail is available
- then show that SSL_ERROR_* as a string.
-
- Prior to this change there was some inconsistency in that case: the
- SSL_ERROR_* code may or may not have been shown, or may have been shown
- as unknown even if it was known.
-
- Ref: https://github.com/curl/curl/issues/1300
-
- Closes https://github.com/curl/curl/pull/1348
-
-Dan Fandrich (23 Mar 2017)
-- mkhelp: disable compression if the perl gzip module is unavailable
-
- This is nowadays included with the base perl distribution, but wasn't
- prior to about perl 5.14
-
-Daniel Stenberg (23 Mar 2017)
-- [Anders Roxell brought this change]
-
- tests/README: mention nroff for --manual tests
-
- Signed-off-by: Anders Roxell <anders.roxell@gmail.com>
-
- Closes #1342
-
-- CURLINFO_PRIMARY_IP.3: add example
-
-- travis: run tests-nonflaky instead of tests-full
-
-- make: introduce 'test-nonflaky' target
-
- Running this in the root build dir will invoke the test suite to only
- run tests not marked as 'flaky'.
-
-- test2033: flaky
-
-Jay Satiro (21 Mar 2017)
-- [Ales Mlakar brought this change]
-
- mbedtls: add support for CURLOPT_SSL_CTX_FUNCTION
-
- Ref: https://curl.haxx.se/mail/lib-2017-02/0097.html
-
- Closes https://github.com/curl/curl/pull/1272
-
-Peter Wu (21 Mar 2017)
-- cmake: add support for building HTML and PDF docs
-
- Note that for some reason there is this warning (that also exists with
- autotools, added since curl-7_15_1-94-ga718cb05f):
-
- docs/libcurl/curl_multi_socket_all.3:1: can't open `man3/curl_multi_socket.3': No such file or directory
-
- Additionally, adjust the roffit --mandir option to support creating
- links when doing out-of-tree builds.
-
- Ref: https://github.com/curl/curl/pull/1288
-
-- cmake: build manual pages (including curl.1)
-
- Also make Perl mandatory to allow building the docs.
-
- While CMakeLists.txt could probably read the list of manual pages from
- Makefile.am, actually putting those in CMakeLists.txt is cleaner so that
- is what is done here.
-
- Fixes #1230
- Ref: https://github.com/curl/curl/pull/1288
-
-- docs: split file lists into Makefile.inc
-
- For easier sharing with CMake. The contents were reformatted to use
- two-space indent and expanded tabs (matching lib/Makefile.common).
-
- Ref: https://github.com/curl/curl/pull/1288
-
-Daniel Stenberg (21 Mar 2017)
-- examples: comment typos in http2 examples
-
-- RELEASE-NOTES: typo
-
-- RELEASE-NOTES: synced with 6e0f26c8a8c28df
-
-- multi: fix streamclose() crash in debug mode
-
- The code would refer to the wrong data pointer. Only debug builds do
- this - for verbosity.
-
- Reported-by: zelinchen@users.noreply.github.com
- Fixes #1329
-
-- CONTRIBUTE: mention referring to github issues in commit msgs
-
-Dan Fandrich (20 Mar 2017)
-- runtests.pl: fixed display of the Gopher IPv6 port number
-
-- tests: fixed the documented test server port numbers
-
-- test714/5: added HTTP as a required feature
-
- These tests use an HTTP proxy so require that curl be built with HTTP
- support.
-
-- tests: strip more options from non-HTTP --libcurl tests
-
- The CURLOPT_USERAGENT and CURLOPT_MAXREDIRS options are only set if HTTP
- support is available, so ignore them in tests where HTTP is not
- guaranteed.
-
-Jay Satiro (18 Mar 2017)
-- [Palo Markovic brought this change]
-
- darwinssl: fix typo in variable name
-
- Broken a week ago in 6448f98.
-
- Closes https://github.com/curl/curl/pull/1337
-
-- tool_operate: Fix showing HTTPS-Proxy options on CURLE_SSL_CACERT
-
- - Show the HTTPS-proxy options on CURLE_SSL_CACERT if libcurl was built
- with HTTPS-proxy support.
-
- Prior to this change those options were shown only if an HTTPS-proxy was
- specified by --proxy, but that did not take into account environment
- variables such as http_proxy, https_proxy, etc. Follow-up to e1187c4.
-
- Bug: https://github.com/curl/curl/issues/1331
- Reported-by: Nehal J Wani
-
-- CURLINFO_LOCAL_PORT.3: fix typo
-
-Daniel Stenberg (16 Mar 2017)
-- CURLINFO_LOCAL_PORT.3: added example
-
-- SSLCERTS.md: mention HTTPS proxies and their separate options
-
-- BINDINGS: a Delphi binding
-
-- KNOWN_BUGS: remove libidn related issue
-
- ... as we no longer use libidn
-
-Dan Fandrich (14 Mar 2017)
-- build: removed redundant DEPENDENCIES from makefiles
-
-Daniel Stenberg (13 Mar 2017)
-- [Sylvestre Ledru brought this change]
-
- Improve code readbility
-
- ... by removing the else branch after a return, break or continue.
-
- Closes #1310
-
-Jay Satiro (13 Mar 2017)
-- [Anatol Belski brought this change]
-
- winbuild: add basic support for OpenSSL 1.1.x
-
- - Auto-detect OpenSSL 1.1 libs
-
- Closes https://github.com/curl/curl/pull/1322
-
-Daniel Stenberg (13 Mar 2017)
-- RELEASE-NOTES: synced with c25e0761d0fc49c4
-
-- make: regenerate docs/curl.1 by runinng make in docs
-
- ... previously, docs/ was only a dist subdir, now also a build subdir.
-
- Reported-by: Dan Fandrich
- Bug: https://curl.haxx.se/mail/lib-2017-03/0017.html
-
-Dan Fandrich (12 Mar 2017)
-- test1440/1: depend on well-defined file: behaviour
-
- Depend on the known behaviour of URLs for nonexistent files rather than
- the undefined behaviour of URLs for directories (which fails on Windows).
- The test isn't about file: URLs at all, so the URL used doesn't really
- matter.
-
-- tests: clear the SSL_CERT_FILE variable on --libcurl tests
-
- Otherwise, the contents will end up in the output and fail the
- verification.
-
-- test1287: added verbose logs keyword
-
-- tool_writeout: fixed a buffer read overrun on --write-out
-
- If a % ended the statement, the string's trailing NUL would be skipped
- and memory past the end of the buffer would be accessed and potentially
- displayed as part of the --write-out output. Added tests 1440 and 1441
- to check for this kind of condition.
-
- Reported-by: Brian Carpenter
-
-Jay Satiro (12 Mar 2017)
-- [Desmond O. Chang brought this change]
-
- url: add option CURLOPT_SUPPRESS_CONNECT_HEADERS
-
- - Add new option CURLOPT_SUPPRESS_CONNECT_HEADERS to allow suppressing
- proxy CONNECT response headers from the user callback functions
- CURLOPT_HEADERFUNCTION and CURLOPT_WRITEFUNCTION.
-
- - Add new tool option --suppress-connect-headers to expose
- CURLOPT_SUPPRESS_CONNECT_HEADERS and allow suppressing proxy CONNECT
- response headers from --dump-header and --include.
-
- Assisted-by: Jay Satiro
- Assisted-by: CarloCannas@users.noreply.github.com
- Closes https://github.com/curl/curl/pull/783
-
-- http_proxy: Ignore TE and CL in CONNECT 2xx responses
-
- A client MUST ignore any Content-Length or Transfer-Encoding header
- fields received in a successful response to CONNECT.
- "Successful" described as: 2xx (Successful). RFC 7231 4.3.6
-
- Prior to this change such a case would cause an error.
-
- In some ways this bug appears to be a regression since c50b878. Prior to
- that libcurl may have appeared to function correctly in such cases by
- acting on those headers instead of causing an error. But that behavior
- was also incorrect.
-
- Bug: https://github.com/curl/curl/issues/1317
- Reported-by: mkzero@users.noreply.github.com
-
-- [Thomas Glanzmann brought this change]
-
- mbedtls: fix typo in variable name
-
- Broken a few days ago in 6448f98.
-
- Bug: https://curl.haxx.se/mail/lib-2017-03/0015.html
-
-Michael Kaufmann (11 Mar 2017)
-- tests: fix the authretry tests
-
- Do not call curl_easy_reset() between the requests, because the
- auth state must be preserved for these tests.
-
- Follow-up to 0afbcfd
-
-- proxy: skip SSL initialization for closed connections
-
- This prevents a "Descriptor is not a socket" error for WinSSL.
-
- Reported-by: Antony74@users.noreply.github.com
- Reviewed-by: Jay Satiro
-
- Fixes https://github.com/curl/curl/issues/1239
-
-- curl_easy_reset: Also reset the authentication state
-
- Follow-up to 5278462
- See https://github.com/curl/curl/issues/1095
-
-- [Isaac Boukris brought this change]
-
- authneg: clear auth.multi flag at http_done
-
- This flag is meant for the current request based on authentication
- state, once the request is done we can clear the flag.
-
- Also change auth.multi to auth.multipass for better readability.
-
- Fixes https://github.com/curl/curl/issues/1095
- Closes https://github.com/curl/curl/pull/1326
-
- Signed-off-by: Isaac Boukris <iboukris@gmail.com>
- Reported-by: Michael Kaufmann
-
-Dan Fandrich (11 Mar 2017)
-- url: don't compile detect_proxy if HTTP support is disabled
-
-- cmdline-opts: fixed a few typos
-
-Daniel Stenberg (10 Mar 2017)
-- README.md: add coverity and travis badges
-
-- ISSUE_TEMPLATE: for bugs, ask questions on the mailing list
-
- and try to add the top comment within an HTML comment in the hope
- that it might get hidden if the text is kept
-
-- openssl: add two /* FALLTHROUGH */ to satisfy coverity
-
- CID 1402159 and 1402158
-
-- tests: disabled 1903 now
-
- Test 1903 is doing HTTP pipelining, and that is a timing and ordering
- sensitive operation and this fails far too often on the Travis CI
- leading to people more or less ignoring test failures there. Not good.
-
- The end of pipelning is probably coming sooner rather than later
- anyway...
-
-Dan Fandrich (9 Mar 2017)
-- tls-max.d: added to the makefile
-
-- build: fixed making man page in out-of-tree tarball builds
-
- The man page taken from the release package is found in a different
- location than if it's built from source. It must be referenced as $< in
- the rule to get its correct location in the VPATH.
-
-- mkhelp: simplified the gzip code
-
- This eliminates the need for an external gzip program, which wasn't
- working with Busybox's gzip, anyway. It now compresses using perl's
- IO::Compress::Gzip
-
-- polarssl: fixed compile errors introduced in 6448f98c
-
-Daniel Stenberg (8 Mar 2017)
-- bump: next release will be known as 7.54.0
-
- ...due to the newly added CURL_SSLVERSION_MAX_* functionality
-
-- openssl: unbreak the build after 6448f98c1857de
-
- Verified with OpenSSL 1.1.0e and OpenSSL master (1.1.1)
-
-Kamil Dudka (8 Mar 2017)
-- [Jozef Kralik brought this change]
-
- vtls: add options to specify range of enabled TLS versions
-
- This commit introduces the CURL_SSLVERSION_MAX_* constants as well as
- the --tls-max option of the curl tool.
-
- Closes https://github.com/curl/curl/pull/1166
-
-Daniel Stenberg (8 Mar 2017)
-- RELEASE-NOTES: synced with 6888a670aa01
-
-- MANPAGE: clarify the dash situation in meta data
-
-- insecure.d: clarify that this is for server connections
-
- Assisted-by: Ray Satiro
- Bug: https://curl.haxx.se/mail/lib-2017-03/0002.html
-
-Dan Fandrich (8 Mar 2017)
-- test1260: added http as a required feature
-
-Daniel Stenberg (7 Mar 2017)
-- [Steve Brokenshire brought this change]
-
- maketgz: Run updatemanpages.pl to update man pages
-
- maketgz now runs scripts/updatemanpages.pl to update the man pages .TH
- section to use the current date and curl/libcurl version.
-
- (TODO Section 3.1)
-
- Closes #1058
-
-- [Steve Brokenshire brought this change]
-
- gitignore: Ignore man page dist files
-
- Ignore man page dist files generated by scripts/updatemanpages.pl
-
-- [Steve Brokenshire brought this change]
-
- Makefile.am: Remove distribution man pages when running 'make clean'
-
-- [Steve Brokenshire brought this change]
-
- Makefile.am: Added scripts/updatemanpages.pl to EXTRA_DIST
-
-- [Steve Brokenshire brought this change]
-
- updatemanpages.pl: Update man pages to use current date and versions
-
- Added script to update man pages to use the current date and
- curl/libcurl versions.
-
- updatemanpages.pl has three arrays: list of directories to look in,
- list of extensions to process, list of files to exclude from
- processing.
-
- Check man page in git repoistory using the date from the existing man
- page before updating to avoid updating the man page if no change is
- made.
-
- If data is received from the git command then update the man page with
- the current date and version otherwise leave alone.
-
- Applied patch from badger to make the date argument optional, change the
- git command used, added date argument to processfile subroutine and
- print to STDERR if no date is found in a man page.
-
- Added code to process the changed man page into a new man page with
- .dist added to the filename to keep the original source files unchanged.
- Updated POD documentation to reflect that the date argument optional.
-
- Code style is in line with CODE_STYLE.md.
-
- Directories: docs/ docs/libcurl/ docs/libcurl/opts/ tests/
- Extensions: .1 .3
- Excluded files: mk-ca-bundle.1 template.3
-
- (TODO Section 3.1)
-
-- [Tatsuhiro Tsujikawa brought this change]
-
- http2: Fix assertion error on redirect with CL=0
-
- This fixes assertion error which occurs when redirect is done with 0
- length body via HTTP/2, and the easy handle is reused, but new
- connection is established due to hostname change:
-
- curl: http2.c:1572: ssize_t http2_recv(struct connectdata *,
- int, char *, size_t, CURLcode *):
- Assertion `httpc->drain_total >= data->state.drain' failed.
-
- To fix this bug, ensure that http2_handle_stream is called.
-
- Fixes #1286
- Closes #1302
-
-- ares: Curl_resolver_wait_resolv: clear *entry first in function
-
-- ares: better error return on timeouts
-
- Assisted-by: Ray Satiro
-
- Bug: https://curl.haxx.se/mail/lib-2017-03/0009.html
-
-Jay Satiro (6 Mar 2017)
-- KNOWN_BUGS: Add DarwinSSL won't import PKCS#12 without a password
-
- Bug: https://github.com/curl/curl/issues/1308
- Reported-by: Justin Clift
-
-Dan Fandrich (6 Mar 2017)
-- test1260: removed errant XML tag
-
-Daniel Stenberg (6 Mar 2017)
-- URL: return error on malformed URLs with junk after port number
-
- ... because it causes confusion with users. Example URLs:
-
- "http://[127.0.0.1]:11211:80" which a lot of languages' URL parsers will
- parse and claim uses port number 80, while libcurl would use port number
- 11211.
-
- "http://user@example.com:80@localhost" which by the WHATWG URL spec will
- be treated to contain user name 'user@example.com' but according to
- RFC3986 is user name 'user' for the host 'example.com' and then port 80
- is followed by "@localhost"
-
- Both these formats are now rejected, and verified so in test 1260.
-
- Reported-by: Orange Tsai
-
-- BINDINGS: update the Lua-cURL URL
-
-- [Sylvestre Ledru brought this change]
-
- BINDINGS: add Scilab binding
-
- Closes #1312
-
-- BINDINGS: add go-curl and perl6-net-curl
-
- Reported-by: Peter Pentchev
-
-- BINDINGS: add misssing C++ bindings
-
- Reported-by: Giuseppe Persico
-
-- ares: return error at once if timed out before name resolve starts
-
- Pointed-out-by: Ray Satiro
- Bug: https://curl.haxx.se/mail/lib-2017-03/0004.html
-
-Peter Wu (5 Mar 2017)
-- [Michael Maltese brought this change]
-
- CMake: Set at most one SSL library
-
- Ref: https://github.com/curl/curl/pull/1228
-
-- [Michael Maltese brought this change]
-
- CMake: Add mbedTLS support
-
- Ref: https://github.com/curl/curl/pull/1228
-
-- [Michael Maltese brought this change]
-
- CMake: Add DarwinSSL support
-
- Assisted-by: Simon Warta <simon@kullo.net>
- Ref: https://github.com/curl/curl/pull/1228
-
-- [Michael Maltese brought this change]
-
- CMake: Reorganize SSL support, separate WinSSL and SSPI
-
- This is closer to how configure.ac does it
-
- Ref: https://github.com/curl/curl/pull/1228
-
-Jay Satiro (4 Mar 2017)
-- CURLOPT_SSL_CTX_FUNCTION.3: Fix EXAMPLE formatting errors
-
- .. also document that CURLE_NOT_BUILT_IN is a RETURN VALUE.
-
- Ref: https://github.com/curl/curl/pull/1290
-
-Daniel Stenberg (4 Mar 2017)
-- [Andrew Krieger brought this change]
-
- fix potential use of uninitialized variables
-
- MSVC with LTCG detects this at warning level 4.
-
- Closes #1304
-
-Dan Fandrich (4 Mar 2017)
-- [Sylvestre Ledru brought this change]
-
- fix some typos in the doc (#1306)
-
-- tests: fixed a typo in some comments
-
-Jay Satiro (3 Mar 2017)
-- url: split off proxy init and parsing from create_conn
-
- Move the proxy parse/init into helper create_conn_helper_init_proxy to
- mitigate the chances some non-proxy code will be mistakenly added to it.
-
- Ref: https://github.com/curl/curl/issues/1274#issuecomment-281556510
- Ref: https://github.com/curl/curl/pull/1293
-
- Closes https://github.com/curl/curl/pull/1298
-
-- [Alexis La Goutte brought this change]
-
- build: fix gcc7 implicit fallthrough warnings
-
- Mark intended fallthroughs with /* FALLTHROUGH */ so that gcc will know
- it's expected and won't warn on [-Wimplicit-fallthrough=].
-
- Closes https://github.com/curl/curl/pull/1297
-
-- [Greg Rowe brought this change]
-
- configure: fix --with-zlib when a path is specified
-
- Prior to this change if you attempted to configure curl using
- --wtih-zlib and specified a path the path would be ignored if you also
- had pkg-config installed on your system. This situation can easily
- arise when you are cross compiling. This change moves the test for
- detecting zlib settings via pkg-config only if OPT_ZLIB is not set.
-
- Closes https://github.com/curl/curl/pull/1292
-
-- [c4rlo brought this change]
-
- no-keepalive.d: fix typo
-
- Closes https://github.com/curl/curl/pull/1301
-
-- checksrc.bat: Ignore curl_config.h.in, curl_config.h
-
-- configure: fix for --enable-pthreads
-
- Better handle options conflicts that can occur if --enable-pthreads.
-
- Bug: https://github.com/curl/curl/pull/1295
- Reported-by: Marc-Antoine Perennou
-
-- [JDepooter brought this change]
-
- darwinssl: Warn that disabling host verify also disables SNI
-
- In DarwinSSL the SSLSetPeerDomainName function is used to enable both
- sending SNI and verifying the host. When host verification is disabled
- the function cannot be called, therefore SNI is disabled as well.
-
- Closes https://github.com/curl/curl/pull/1240
-
-Marcel Raad (28 Feb 2017)
-- warnless: suppress compiler warning
-
- If size_t is 32 bits, MSVC warns:
- warning C4310: cast truncates constant value
- The warning is harmless as CURL_MASK_SCOFFT gets
- truncated to the maximum value of size_t.
-
-Dan Fandrich (27 Feb 2017)
-- tests: enable HTTP/2 tests to run with non-default port numbers
-
-Marcel Raad (27 Feb 2017)
-- digest_sspi: fix compilation warning
-
- MSVC complains:
- warning C4701: potentially uninitialized local variable 'output_token_len' used
-
-Jay Satiro (26 Feb 2017)
-- cyassl: get library version string at runtime
-
- wolfSSL >= 3.6.0 supports getting its library version string at runtime.
-
-Dan Fandrich (26 Feb 2017)
-- test1139: allow for the possibility that the man page is not rebuilt
-
- This is likely to be the case when building from a tar ball release
- package which includes a prebuilt man page. In that case, test the
- packaged man page instead. This only makes a difference when building
- out-of-tree (in-tree, the location in both cases is identical).
-
-Jay Satiro (25 Feb 2017)
-- [Isaac Boukris brought this change]
-
- url: fix unix-socket support for proxy-disabled builds
-
- Prior to this change if curl was built with Unix Socket support
- (--enable-unix-sockets) and without Proxy support (--disable-proxy) then
- unix socket options would erroneously be ignored.
-
- Regression introduced in:
- 0b8d682f81ee9acb763dd4c9ad805fe08d1227c0
-
- Bug: https://github.com/curl/curl/issues/1274
- Reported-by: mccormickt12@users.noreply.github.com
-
- Closes https://github.com/curl/curl/pull/1289
-
-Dan Fandrich (26 Feb 2017)
-- gopher: fixed detection of an error condition from Curl_urldecode
-
-- ftp: fixed a NULL pointer dereference on OOM
-
-Jay Satiro (25 Feb 2017)
-- [Peter Wu brought this change]
-
- docs: de-duplicate file lists in the Makefiles
-
- Make use of macro substitution of suffix patterns to remove duplication
- of manual names. This approach is portable according to
- http://pubs.opengroup.org/onlinepubs/009695399/utilities/make.html
-
- Closes https://github.com/curl/curl/pull/1287
-
-Dan Fandrich (25 Feb 2017)
-- ftp: removed an erroneous free in an OOM path
-
-- proxy: fixed a memory leak on OOM
-
-- tests: use consistent environment variables for setting charset
-
- The character set in POSIX is set by the locale defined by (in
- decreasing order of precedence) the LC_ALL, LC_CTYPE and LANG
- environment variables (CHARSET was used by libidn but not libidn2).
- LC_ALL is cleared to ensure that LC_CTYPE takes effect, but LC_ALL is
- not used to set the locale to ensure that other parts of the locale
- aren't overridden. Since there doesn't seem to be a cross-platform way
- of specifying a UTF-8 locale, and not all systems may support UTF-8, a
- <precheck> is used to skip the test if UTF-8 can't be verified to be
- available. Test 1035 was also converted to UTF-8 for consistency, as
- the actual character set used there is irrelevant to the test.
-
- This patch uses a different UTF-8 locale than the last attempt, namely
- en_US.UTF-8. This one has been verified on 7 different Linux and BSD
- distributions and is more complete and usable than the locale UTF-8 (on
- at least some systems).
-
-- test557: explicitly use the C locale so the numeric output is as expected
-
-Jay Satiro (25 Feb 2017)
-- [Simon Warta brought this change]
-
- cmake: Replace invalid UTF-8 byte sequence
-
- - Change the encoding of the regex temp placeholder token to UTF-8.
-
- Prior to this change the file contained special chars in a different
- encoding than ASCII or UTF-8 making text editors and Python complain
- when reading the file.
-
- Closes https://github.com/curl/curl/pull/1271
- Closes https://github.com/curl/curl/pull/1275
-
-Daniel Stenberg (24 Feb 2017)
-- bump: work on the next release
-
-Version 7.53.1 (24 Feb 2017)
-
-Daniel Stenberg (24 Feb 2017)
-- release: 7.53.1
-
-- Revert "tests: use consistent environment variables for setting charset"
-
- This reverts commit ecd1d020abdae3c3ce3643ddab3106501e62e7c0.
-
- That commit caused test failures on my Debian Linux machine for all
- changed test cases. We need to reconsider how that should get done.
-
-Dan Fandrich (23 Feb 2017)
-- tests: use consistent environment variables for setting charset
-
- Character set in POSIX is set by the locale defined (in decreasing order
- of precedence) by the LC_ALL, LC_CTYPE and LANG environment variables (I
- believe CHARSET is only historic). LC_ALL is cleared to ensure that
- LC_CTYPE takes effect, but LC_ALL is not used to set the locale to
- ensure that other parts of the locale aren't overriden, if set. Since
- there doesn't seem to be a cross-platform way of specifying a UTF-8
- locale, and not all systems may support UTF-8, a <precheck> is used
- (where relevant) to skip the test if UTF-8 isn't in use. Test 1035 was
- also converted to UTF-8 for consistency, as the actual character set
- used there is irrelevant to the test.
-
-Jay Satiro (23 Feb 2017)
-- url: Default the CA proxy bundle location to CURL_CA_BUNDLE
-
- If the compile-time CURL_CA_BUNDLE location is defined use it as the
- default value for the proxy CA bundle location, which is the same as
- what we already do for the regular CA bundle location.
-
- Ref: https://github.com/curl/curl/pull/1257
-
-Daniel Stenberg (23 Feb 2017)
-- [Sergii Pylypenko brought this change]
-
- rand: added missing #ifdef HAVE_FCNTL_H around fcntl.h header
-
- Closes #1285
-
-- TODO: "OPTIONS *"
-
- Closes #1280
-
-- RELEASE-NOTES: synced with 443e5b03a7d441
-
-- THANKS-filter: shachaf
-
-- [İsmail Dönmez brought this change]
-
- tests: Set CHARSET & LANG to UTF-8 in 1035, 2046 and 2047
-
- Closes #1283
- Fixes #1277
-
-- bump: 7.53.1 coming up
-
- synced with df665f4df0f7a352
-
-- formdata: check for EOF when reading from stdin
-
- Reported-by: shachaf@users.noreply.github.com
-
- Fixes #1281
-
-Jay Satiro (22 Feb 2017)
-- docs: gitignore curl.1
-
- curl.1 is generated by the cmdline-opts script since 4c49b83.
-
-Daniel Stenberg (22 Feb 2017)
-- TODO: HTTP Digest using SHA-256
-
-- TODO: brotli is deployed widely now
-
-Jay Satiro (21 Feb 2017)
-- [Viktor Szakats brought this change]
-
- urldata: include curl_sspi.h when Windows SSPI is enabled
-
- f77dabe broke builds in Windows using Windows SSPI but not Windows SSL.
-
- Bug: https://github.com/curl/curl/issues/1276
- Reported-by: jveazey@users.noreply.github.com
-
-- url: Improve CURLOPT_PROXY_CAPATH error handling
-
- - Change CURLOPT_PROXY_CAPATH to return CURLE_NOT_BUILT_IN if the option
- is not supported, which is the same as what we already do for
- CURLOPT_CAPATH.
-
- - Change the curl tool to handle CURLOPT_PROXY_CAPATH error
- CURLE_NOT_BUILT_IN as a warning instead of as an error, which is the
- same as what we already do for CURLOPT_CAPATH.
-
- - Fix CAPATH docs to show that CURLE_NOT_BUILT_IN is returned when the
- respective CAPATH option is not supported by the SSL library.
-
- Ref: https://github.com/curl/curl/pull/1257
-
-- cyassl: fix typo
-
-Version 7.53.0 (22 Feb 2017)
-
-Daniel Stenberg (22 Feb 2017)
-- release: 7.53.0
-
-- cookie: fix declaration of 'dup' shadows a global declaration
-
-- TLS: make SSL_VERIFYSTATUS work again
-
- The CURLOPT_SSL_VERIFYSTATUS option was not properly handled by libcurl
- and thus even if the status couldn't be verified, the connection would
- be allowed and the user would not be told about the failed verification.
-
- Regression since cb4e2be7c6d42ca
-
- CVE-2017-2629
- Bug: https://curl.haxx.se/docs/adv_20170222.html
-
- Reported-by: Marcus Hoffmann
-
-Jay Satiro (21 Feb 2017)
-- digest_sspi: Handle 'stale=TRUE' directive in HTTP digest
-
- - If the server has provided another challenge use it as the replacement
- input token if stale=TRUE. Otherwise previous credentials have failed
- so return CURLE_LOGIN_DENIED.
-
- Prior to this change the stale directive was ignored and if another
- challenge was received it would cause error CURLE_BAD_CONTENT_ENCODING.
-
- Ref: https://tools.ietf.org/html/rfc2617#page-10
-
- Bug: https://github.com/curl/curl/issues/928
- Reported-by: tarek112@users.noreply.github.com
-
-Daniel Stenberg (20 Feb 2017)
-- smb: use getpid replacement for windows UWP builds
-
- Source: https://github.com/Microsoft/vcpkg/blob/7676b8780db1e1e591c4fc7eba4f96f73c428cb4/ports/curl/0002_fix_uwp.patch
-
-- TODO: CURLOPT_RESOLVE for any port number
-
- Closes #1264
-
-- RELEASE-NOTES: synced with af30f1152d43dcdb
-
-- [Jean Gressmann brought this change]
-
- sftp: improved checks for create dir failures
-
- Since negative values are errors and not only -1. This makes SFTP upload
- with --create-dirs work (again).
-
- Closes #1269
-
-Jay Satiro (20 Feb 2017)
-- [Max Khon brought this change]
-
- digest_sspi: Fix nonce-count generation in HTTP digest
-
- - on the first invocation: keep security context returned by
- InitializeSecurityContext()
-
- - on subsequent invocations: use MakeSignature() instead of
- InitializeSecurityContext() to generate HTTP digest response
-
- Bug: https://github.com/curl/curl/issues/870
- Reported-by: Andreas Roth
-
- Closes https://github.com/curl/curl/pull/1251
-
-- examples/multi-uv: checksrc compliance
-
-Michael Kaufmann (19 Feb 2017)
-- string formatting: fix 4 printf-style format strings
-
-Dan Fandrich (18 Feb 2017)
-- tests: removed the obsolete name parameter
-
-Michael Kaufmann (18 Feb 2017)
-- speed caps: update the timeouts if the speed is too low/high
-
- Follow-up to 4b86113
-
- Fixes https://github.com/curl/curl/issues/793
- Fixes https://github.com/curl/curl/issues/942
-
-- docs: fix timeout handling in multi-uv example
-
-- proxy: fix hostname resolution and IDN conversion
-
- Properly resolve, convert and log the proxy host names.
- Support the "--connect-to" feature for SOCKS proxies and for passive FTP
- data transfers.
-
- Follow-up to cb4e2be
-
- Reported-by: Jay Satiro
- Fixes https://github.com/curl/curl/issues/1248
-
-Jay Satiro (17 Feb 2017)
-- [Isaac Boukris brought this change]
-
- http: fix missing 'Content-Length: 0' while negotiating auth
-
- - While negotiating auth during PUT/POST if a user-specified
- Content-Length header is set send 'Content-Length: 0'.
-
- This is what we do already in HTTPREQ_POST_FORM and what we did in the
- HTTPREQ_POST case (regression since afd288b).
-
- Prior to this change no Content-Length header would be sent in such a
- case.
-
- Bug: https://curl.haxx.se/mail/lib-2017-02/0006.html
- Reported-by: Dominik Hölzl
-
- Closes https://github.com/curl/curl/pull/1242
-
-Daniel Stenberg (16 Feb 2017)
-- [Simon Warta brought this change]
-
- winbuild: add note on auto-detection of MACHINE in Makefile.vc
-
- Closes #1265
-
-- RELEASE-PROCEDURE: update the upcoming release calendar
-
-- TODO: consider file name from the redirected URL with -O ?
-
- It isn't easily solved, but with some thinking someone could probably
- come up with a working approach?
-
- Closes #1241
-
-Jay Satiro (15 Feb 2017)
-- tool_urlglob: Allow a glob range with the same start and stop
-
- For example allow ranges like [1-1] and [a-a] etc.
-
- Regression since 5ca96cb.
-
- Bug: https://github.com/curl/curl/issues/1238
- Reported-by: R. Dennis Steed
-
-Daniel Stenberg (15 Feb 2017)
-- axtls: adapt to API changes
-
- Builds with axTLS 2.1.2. This then also breaks compatibility with axTLS
- < 2.1.0 (the older API)
-
- ... and fix the session_id mixup brought in 04b4ee549
-
- Fixes #1220
-
-- RELEASE-NOTES: synced with 690935390c29c
-
-- [Nick Draffen brought this change]
-
- curl: fix typo in time condition warning message
-
- The warning message had a typo. The argument long form is --time-cond
- not --timecond
-
- Closes #1263
-
-- smb: code indent
-
-Jay Satiro (14 Feb 2017)
-- configure: Allow disabling pthreads, fall back on Win32 threads
-
- When the threaded resolver option is specified for configure the default
- thread library is pthreads. This change makes it possible to
- --disable-pthreads and then configure can fall back on Win32 threads for
- native Windows builds.
-
- Closes https://github.com/curl/curl/pull/1260
-
-Daniel Stenberg (13 Feb 2017)
-- http2: fix memory-leak when denying push streams
-
- Reported-by: zelinchen@users.noreply.github.com
- Fixes #1229
-
-Jay Satiro (11 Feb 2017)
-- tool_operate: Show HTTPS-Proxy options on CURLE_SSL_CACERT
-
- When CURLE_SSL_CACERT occurs the tool shows a lengthy error message to
- the user explaining possible solutions such as --cacert and --insecure.
-
- This change appends to that message similar options --proxy-cacert and
- --proxy-insecure when there's a specified HTTPS proxy.
-
- Closes https://github.com/curl/curl/issues/1258
-
-Daniel Stenberg (10 Feb 2017)
-- cmdline-opts/page-footer: ftp.sunet.se is no longer an FTP mirror
-
-- URL: only accept ";options" in SMTP/POP3/IMAP URL schemes
-
- Fixes #1252
-
-Jay Satiro (9 Feb 2017)
-- cmdline-opts/socks*: Mention --preproxy in --socks* opts
-
- - Document in --socks* opts they're still mutually exclusive of --proxy.
-
- Partial revert of 423a93c; I had misinterpreted the SOCKS proxy +
- HTTP/HTTPS proxy combination.
-
- - Document in --socks* opts that --preproxy can be used to specify a
- SOCKS proxy at the same time --proxy is used with an HTTP/HTTPS proxy.
-
-Daniel Stenberg (9 Feb 2017)
-- CURLOPT_SSL_VERIFYPEER.3: also the https proxy version
-
-Kamil Dudka (9 Feb 2017)
-- nss: make FTPS work with --proxytunnel
-
- If the NSS code was in the middle of a non-blocking handshake and it
- was asked to finish the handshake in blocking mode, it unexpectedly
- continued in the non-blocking mode, which caused a FTPS connection
- over CONNECT to fail with "(81) Socket not ready for send/recv".
-
- Bug: https://bugzilla.redhat.com/1420327
-
-Daniel Stenberg (9 Feb 2017)
-- examples/multithread.c: link to our multi-thread docs
-
- ... instead of the OpenSSL mutex page.
-
-- http_proxy: avoid freeing static memory
-
- Follow up to 7fe81ec298e0: make sure 'host' is either NULL or malloced.
-
-- [Cameron MacMinn brought this change]
-
- http_proxy: Fix tiny memory leak upon edge case connecting to proxy
-
- Fixes #1255
-
-Michael Kaufmann (8 Feb 2017)
-- polarssl, mbedtls: Fix detection of pending data
-
- Reported-by: Dan Fandrich
- Bug: https://curl.haxx.se/mail/lib-2017-02/0032.html
-
-Dan Fandrich (7 Feb 2017)
-- test1139: Added the --manual keyword since the manual is required
-
-Daniel Stenberg (7 Feb 2017)
-- RELEASE-NOTES: synced with 102454459dd688c
-
-- THANKS-filter: polish some recent contributors
-
-- http2: reset push header counter fixes crash
-
- When removing an easy handler from a multi before it completed its
- transfer, and it had pushed streams, it would segfault due to the pushed
- counted not being cleared.
-
- Fixed-by: zelinchen@users.noreply.github.com
- Fixes #1249
-
-- [Markus Westerlind brought this change]
-
- transfer: only retry nobody-requests for HTTP
-
- Using sftp to delete a file with CURLOPT_NOBODY set with a reused
- connection would fail as curl expected to get some data. Thus it would
- retry the command again which fails as the file has already been
- deleted.
-
- Fixes #1243
-
-Jay Satiro (7 Feb 2017)
-- [Daniel Gustafsson brought this change]
-
- telnet: Fix typos
-
- Ref: https://github.com/curl/curl/pull/1245
-
-- [Daniel Gustafsson brought this change]
-
- test552: Fix typos
-
- Closes https://github.com/curl/curl/pull/1245
-
-- [Daniel Gustafsson brought this change]
-
- darwinssl: Avoid parsing certificates when not in verbose mode
-
- The information extracted from the server certificates in step 3 is only
- used when in verbose mode, and there is no error handling or validation
- performed as that has already been done. Only run the certificate
- information extraction when in verbose mode and libcurl was built with
- verbose strings.
-
- Closes https://github.com/curl/curl/pull/1246
-
-- [JDepooter brought this change]
-
- schannel: Remove incorrect SNI disabled message
-
- - Remove the SNI disabled when host verification disabled message
- since that is incorrect.
-
- - Show a message for legacy versions of Windows <= XP that connections
- may fail since those versions of WinSSL lack SNI, algorithms, etc.
-
- Bug: https://github.com/curl/curl/pull/1240
-
-Daniel Stenberg (7 Feb 2017)
-- CHANGES: spell fix, use correct path to script
-
-- CHANGES.0: removed
-
- This is the previously manually edited changelog, not touched since Aug
- 2015. Still present in git for those who wants it.
-
-Dan Fandrich (6 Feb 2017)
-- cmdline-opts: Fixed build and test in out of source tree builds
-
-Viktor Szakats (6 Feb 2017)
-- use *.sourceforge.io and misc URL updates
-
- Ref: https://sourceforge.net/blog/introducing-https-for-project-websites/
- Closes: https://github.com/curl/curl/pull/1247
-
-Jay Satiro (6 Feb 2017)
-- docs: Add more HTTPS proxy documentation
-
- - Document HTTPS proxy type.
-
- - Document --write-out %{proxy_ssl_verify_result}.
-
- - Document SOCKS proxy + HTTP/HTTPS proxy combination.
-
- HTTPS proxy support was added in 7.52.0 for OpenSSL, GnuTLS and NSS.
-
- Ref: https://github.com/curl/curl/commit/cb4e2be
-
-- OS400: Fix symbols
-
- - s/CURLOPT_SOCKS_PROXY/CURLOPT_PRE_PROXY
- Follow-up to 7907a2b and 845522c.
-
- - Fix incorrect id for CURLOPT_PROXY_PINNEDPUBLICKEY.
-
- - Add id for CURLOPT_ABSTRACT_UNIX_SOCKET.
-
- Bug: https://github.com/curl/curl/issues/1237
- Reported-by: jonrumsey@users.noreply.github.com
-
-- [Sean Burford brought this change]
-
- cmake: Support curl --xattr when built with cmake
-
- - Test for and set HAVE_FSETXATTR when support for extended file
- attributes is present.
-
- Closes https://github.com/curl/curl/pull/1176
-
-- [Adam Langley brought this change]
-
- openssl: Don't use certificate after transferring ownership
-
- SSL_CTX_add_extra_chain_cert takes ownership of the given certificate
- while, despite the similar name, SSL_CTX_add_client_CA does not. Thus
- it's best to call SSL_CTX_add_client_CA before
- SSL_CTX_add_extra_chain_cert, while the code still has ownership of the
- argument.
-
- Closes https://github.com/curl/curl/pull/1236
-
-Daniel Stenberg (29 Jan 2017)
-- [Antoine Aubert brought this change]
-
- mbedtls: implement CTR-DRBG and HAVEGE random generators
-
- closes #1227
-
-- docs: we no longer ship HTML versions of man pages
-
- ... refer to the web site for the web versions.
-
-- [railsnewbie257 brought this change]
-
- docs: proofread README.netware README.win32
-
- Closes #1231
-
-- RELEASE-NOTES; synced with ab08d82648
-
-Michael Kaufmann (28 Jan 2017)
-- mbedtls: disable TLS session tickets
-
- SSL session reuse with TLS session tickets is not supported yet.
- Use SSL session IDs instead.
-
- See https://github.com/curl/curl/issues/1109
-
-- gnutls: disable TLS session tickets
-
- SSL session reuse with TLS session tickets is not supported yet.
- Use SSL session IDs instead.
-
- Fixes https://github.com/curl/curl/issues/1109
-
-- polarssl: fix hangs
-
- This bugfix is similar to commit c111178bd4.
-
-Daniel Stenberg (27 Jan 2017)
-- cookies: do not assume a valid domain has a dot
-
- This repairs cookies for localhost.
-
- Non-PSL builds will now only accept "localhost" without dots, while PSL
- builds okeys everything not listed as PSL.
-
- Added test 1258 to verify.
-
- This was a regression brought in a76825a5efa6b4
-
-- TODO: remove "Support TLS v1.3"
-
- Support is trickling in already.
-
-- [railsnewbie257 brought this change]
-
- INTERNALS.md: language improvements
-
- Closes #1226
-
-- telnet: fix windows compiler warnings
-
- Thumbs-up-by: Jay Satiro
-
- Closes #1225
-
-- VC: remove the makefile.vc6 build infra
-
- The winbuild/ build files is now the single MSVC makefile build choice.
-
- Closes #1215
-
-- [Jay Satiro brought this change]
-
- cmdline-opts/gen.pl: Open input files in CRLF mode
-
- On Windows it's possible to have input files with CRLF line endings and
- a perl that defaults to LF line endings (eg msysgit). Currently that
- results in generator output of mixed line endings of CR, LF and CRLF.
-
- This change fixes that issue in the most succinct way by opening the
- files in :crlf text mode even when the perl being used does not default
- to that mode. (On operating systems that don't have a separate text mode
- it's essentially a no-op.) The output continues to be in the perl's
- native line ending.
-
-- docs/curl.1: generate from the cmdline-opts script
-
-- vtls: source indentation fix
-
-- contri*.sh: cut off parentheses from names too
-
-- RELEASE-NOTES: synced with 01ab7c30bba6f
-
-- vtls: fix PolarSSL non-blocking handling
-
- A regression brought in cb4e2be
-
- Reported-by: Michael Kaufmann
- Bug: https://github.com/curl/curl/issues/1174#issuecomment-274018791
-
-- [Antoine Aubert brought this change]
-
- vtls: fix mbedtls multi non blocking handshake.
-
- When using multi, mbedtls handshake is in non blocking mode. vtls must
- set wait for read/write flags for the socket.
-
- Closes #1223
-
-- [Richy Kim brought this change]
-
- CURLOPT_BUFFERSIZE: support enlarging receive buffer
-
- Replace use of fixed macro BUFSIZE to define the size of the receive
- buffer. Reappropriate CURLOPT_BUFFERSIZE to include enlarging receive
- buffer size. Upon setting, resize buffer if larger than the current
- default size up to a MAX_BUFSIZE (512KB). This can benefit protocols
- like SFTP.
-
- Closes #1222
-
-- sws: use SOCKERRNO, not errno
-
- Reported-by: Gisle Vanem
-
-Michael Kaufmann (19 Jan 2017)
-- KNOWN_BUGS: HTTP/2 server push enabled when no pushes can be accepted
-
- This has been implemented with commit 9ad034e.
-
-Viktor Szakats (19 Jan 2017)
-- *.rc: escape non-ASCII/non-UTF-8 character for clarity
-
- Closes https://github.com/curl/curl/pull/1217
-
-Kamil Dudka (19 Jan 2017)
-- docs: non-blocking SSL handshake is now supported with NSS
-
- Implemented since curl-7_36_0-130-g8868a22
-
- Reported-by: Fahim Chandurwala
-
-Michael Kaufmann (18 Jan 2017)
-- CURLOPT_CONNECT_TO: Fix compile warnings
-
- Fix compile warnings that appeared only when curl has been configured
- with '--disable-verbose'.
-
-Daniel Stenberg (18 Jan 2017)
-- usercertinmem.c: improve the short description
-
-- parseurl: move back buffer to function scope
-
- Regression since 1d4202ad, which moved the buffer into a more narrow
- scope, but the data in that buffer was used outside of that more narrow
- scope.
-
- Reported-by: Dan Fandrich
- Bug: https://curl.haxx.se/mail/lib-2017-01/0093.html
-
-Jay Satiro (17 Jan 2017)
-- openssl: Fix random generation
-
- - Fix logic error in Curl_ossl_random.
-
- Broken a few days ago in 807698d.
-
-Daniel Stenberg (17 Jan 2017)
-- TODO: share OpenSSL contexts
-
- By supporting this, subsequent connects would load a lot less data from
- disk.
-
- Closes #1110
-
-- bump: next release will be 7.53.0
-
-Kamil Dudka (15 Jan 2017)
-- nss: use the correct lock in nss_find_slot_by_name()
-
-Alessandro Ghedini (15 Jan 2017)
-- http2: disable server push if not requested
-
- Ref: https://github.com/curl/curl/pull/1160
-
-Daniel Stenberg (14 Jan 2017)
-- [railsnewbie257 brought this change]
-
- docs: improved language in README.md HISTORY.md CONTRIBUTE.md
-
- Closes #1211
-
-Alessandro Ghedini (14 Jan 2017)
-- http: print correct HTTP string in verbose output when using HTTP/2
-
- Before:
- ```
- % src/curl https://sigsegv.ninja/ -v --http2
- ...
- > GET / HTTP/1.1
- > Host: sigsegv.ninja
- > User-Agent: curl/7.52.2-DEV
- > Accept: */*
- >
- ...
- ```
-
- After:
- ```
- % src/curl https://sigsegv.ninja/ -v --http2
- ...
- > GET / HTTP/2
- > Host: sigsegv.ninja
- > User-Agent: curl/7.52.2-DEV
- > Accept: */*
- >
- ```
-
-Daniel Stenberg (14 Jan 2017)
-- TODO: send only part of --data
-
- Closes #1200
-
-- TODO: implemened "--fail-fast to exit on first transfer fail"
-
- Even though it is called --fail-early
-
-- TODO: Chunked transfer multipart formpost
-
- Closes #1139
-
-- TODO: Improve formpost API, not just add an easy argument
-
-- addrinfo: fix compiler warning on offsetof() use
-
- curl_addrinfo.c:519:20: error: conversion to ‘curl_socklen_t {aka
- unsigned int}’ from ‘long unsigned int’ may alter its value
- [-Werror=conversion]
-
- Follow-up to 1d786faee1046f
-
-- THANKS-filter: Jiri Malak
-
-- RELEASE-NOTES: synced with a7c73ae309c
-
-Peter Wu (13 Jan 2017)
-- [Isaac Boukris brought this change]
-
- unix_socket: add support for abstract unix domain socket
-
- In addition to unix domain sockets, Linux also supports an
- abstract namespace which is independent of the filesystem.
-
- In order to support it, add new CURLOPT_ABSTRACT_UNIX_SOCKET
- option which uses the same storage as CURLOPT_UNIX_SOCKET_PATH
- internally, along with a flag to specify abstract socket.
-
- On non-supporting platforms, the abstract address will be
- interpreted as an empty string and fail gracefully.
-
- Also add new --abstract-unix-socket tool parameter.
-
- Signed-off-by: Isaac Boukris <iboukris@gmail.com>
- Reported-by: Chungtsun Li (typeless)
- Reviewed-by: Daniel Stenberg
- Reviewed-by: Peter Wu
- Closes #1197
- Fixes #1061
-
-Daniel Stenberg (13 Jan 2017)
-- write-out.d: 'time_total' is not always shown with ms precision
-
- We have higher resolution since 7.52.0
-
-- next.d: --trace and --trace-ascii are also global
-
-- [Isaac Boukris brought this change]
-
- curl: reset the easy handle at --next
-
- So that only "global" options (verbose mostly) survive into the next
- transfer, and the others have to be set again unless default is fine.
-
-- [Frank Gevaerts brought this change]
-
- docs: Add note about libcurl copying strings to CURLOPT_* manpages
-
- Closes #1169
-
-- [Frank Gevaerts brought this change]
-
- CURLOPT_PREQUOTE.3: takes a struct curl_slist*, not a char*
-
-- IDN: Use TR46 non-transitional
-
- Assisted-by: Tim Rühsen
-
-- IDN: revert use of the transitional option
-
- It made the german ß get converted to ss, IDNA2003 style, and we can't
- have that for the .de TLD - a primary reason for our switch to IDNA2008.
-
- Test 165 verifies.
-
-- [Tim Rühsen brought this change]
-
- IDN: Fix compile time detection of linidn2 TR46
-
- Follow-up to f30cbcac1
-
- Closes #1207
-
-- [ERAMOTO Masaya brought this change]
-
- url: --noproxy option overrides NO_PROXY environment variable
-
- Under condition using http_proxy env var, noproxy list was the
- combination of --noproxy option and NO_PROXY env var previously. Since
- this commit, --noproxy option overrides NO_PROXY environment variable
- even if use http_proxy env var.
-
- Closes #1140
-
-- [ERAMOTO Masaya brought this change]
-
- url: Refactor detect_proxy()
-
- If defined CURL_DISABLE_HTTP, detect_proxy() returned NULL. If not
- defined CURL_DISABLE_HTTP, detect_proxy() checked noproxy list.
-
- Thus refactor to set proxy to NULL instead of calling detect_proxy() if
- define CURL_DISABLE_HTTP, and refactor to call detect_proxy() if not
- define CURL_DISABLE_HTTP and the host is not in the noproxy list.
-
-- [ERAMOTO Masaya brought this change]
-
- url: Fix NO_PROXY env var to work properly with --proxy option.
-
- The combination of --noproxy option and http_proxy env var works well
- both for proxied hosts and non-proxied hosts.
-
- However, when combining NO_PROXY env var with --proxy option,
- non-proxied hosts are not reachable while proxied host is OK.
-
- This patch allows us to access non-proxied hosts even if using NO_PROXY
- env var with --proxy option.
-
-- [Tim Rühsen brought this change]
-
- IDN: Use TR46 'transitional' for toASCII translations
-
- References: http://unicode.org/faq/idn.html
- http://unicode.org/reports/tr46
-
- Closes #1206
-
-- [railsnewbie257 brought this change]
-
- docs: FAQ MAIL-ETIQUETTE language fixes
-
- Closes #1194
-
-- [Marcus Hoffmann brought this change]
-
- gnutls: check for alpn and ocsp in configure
-
- Check for presence of gnutls_alpn_* and gnutls_ocsp_* functions during
- configure instead of relying on the version number. GnuTLS has options
- to turn these features off and we ca just work with with such builds
- like we work with older versions.
-
- Signed-off-by: Marcus Hoffmann <m.hoffmann@cartelsol.com>
-
- Closes #1204
-
-Jay Satiro (12 Jan 2017)
-- url: Fix parsing for when 'file' is the default protocol
-
- Follow-up to 3463408.
-
- Prior to 3463408 file:// hostnames were silently stripped.
-
- Prior to this commit it did not work when a schemeless url was used with
- file as the default protocol.
-
- Ref: https://curl.haxx.se/mail/lib-2016-11/0081.html
- Closes https://github.com/curl/curl/pull/1124
-
- Also fix for drive letters:
-
- - Support --proto-default file c:/foo/bar.txt
-
- - Support file://c:/foo/bar.txt
-
- - Fail when a file:// drive letter is detected and not MSDOS/Windows.
-
- Bug: https://github.com/curl/curl/issues/1187
- Reported-by: Anatol Belski
- Assisted-by: Anatol Belski
-
-Daniel Stenberg (12 Jan 2017)
-- rand: make it work without TLS backing
-
- Regression introduced in commit f682156a4fc6c4
-
- Reported-by: John Kohl
- Bug: https://curl.haxx.se/mail/lib-2017-01/0055.html
-
-Jay Satiro (12 Jan 2017)
-- STARTTLS: Don't print response character in denied messages
-
- Both IMAP and POP3 response characters are used internally, but when
- appended to the STARTTLS denial message likely could confuse the user.
-
- Closes https://github.com/curl/curl/pull/1203
-
-- smtp: Fix STARTTLS denied error message
-
- - Format the numeric denial code as an integer instead of a character.
-
-Daniel Stenberg (11 Jan 2017)
-- http2_send: avoid unsigned integer wrap around
-
- ... when checking for a too large request.
-
-Jay Satiro (9 Jan 2017)
-- [Jiri Malak brought this change]
-
- cmake: Fix passing _WINSOCKAPI_ macro to compiler
-
- Define _WINSOCKAPI_ blank rather than to 1 in order to match the value
- used by Microsoft's winsock header files.
-
- Closes https://github.com/curl/curl/pull/1195
-
-Daniel Stenberg (9 Jan 2017)
-- sws: retry send() on EWOULDBLOCK
-
- Fixes spurious test 1060 and 1061 failures on OpenBSD, Solaris and more.
-
- Bug: https://curl.haxx.se/mail/lib-2017-01/0009.html
- Reported-by: Christian Weisgerber
-
-- RELEASE-NOTES: synced with a41e8592d6b3e58
-
-- examples: make the C++ examples follow our code style too
-
- At least mostly, not counting // comments.
-
-- [Aulddays brought this change]
-
- asiohiper: improved socket handling
-
- libcurl requires CURLMOPT_SOCKETFUNCTION to KEEP watching socket events
- and notify back. Modify event_cb() to continue watching events when
- fired.
-
- Fixes #1191
- Closes #1192
- Fixed-by: Mingliang Zhu
-
-- [Jiří Malák brought this change]
-
- lib506: fix build for Open Watcom
-
- Rename symbol lock to locks to not clash with OW CRTL function name.
-
- Closes #1196
-
-- ROADMAP: 2017 cleanup
-
- Removed items already fixed, clarified a few others.
-
-- COPYING: update the generic copyright year range
-
-- docs/silent: mention --show-error in --silent description
-
- Reported in #1190
- Reported-by: Dan Jacobson
-
-- docs/page-header: mention how to disable the progress meter
-
- curl.1 is regenerated
-
- Fixes #1190
-
-Dan Fandrich (7 Jan 2017)
-- wolfssl: display negotiated SSL version and cipher
-
-- wolfssl: support setting cipher list
-
-Patrick Monnerat (6 Jan 2017)
-- CIPHERS.md: document GSKit ciphers
-
-Jay Satiro (5 Jan 2017)
-- [peterpih brought this change]
-
- TheArtOfHttpScripting: grammar
-
-Nick Zitzmann (3 Jan 2017)
-- darwinssl: --insecure overrides --cacert if both settings are in use
-
- Fixes #1184
-
-Jay Satiro (2 Jan 2017)
-- docs/libcurl: TCP_KEEPALIVE start and interval default to 60
-
- Since the TCP keep-alive options were added in 705f0f7 the start and
- interval default values have been 60, but that wasn't documented.
-
- Bug: https://curl.haxx.se/mail/lib-2017-01/0000.html
- Reported-by: Praveen Pvs
-
-Daniel Stenberg (29 Dec 2016)
-- curl.h: CURLE_FUNCTION_NOT_FOUND is no longer in use
-
- This error code was once introduced when some library was dynamically
- loaded and a funciton within said library couldn't be found.
-
-- content_encoding: change return code on a failure
-
- Failure to decompress is now a write error instead of the weird
- "function not found".
-
-- page-footer: error 36 is protocol agnostic!
-
-Jay Satiro (28 Dec 2016)
-- tool_operate: Fix --remote-time incorrect times on Windows
-
- - Use Windows API SetFileTime to set the file time instead of utime.
-
- Avoid utime on Windows if possible because it may apply a daylight
- saving time offset to our UTC file time.
-
- Bug: https://curl.haxx.se/mail/archive-2016-11/0033.html
- Reported-by: Tim
-
- Closes https://github.com/curl/curl/pull/1121
-
-Daniel Stenberg (29 Dec 2016)
-- [Max Khon brought this change]
-
- digest_sspi: copy terminating NUL as well
-
- Curl_auth_decode_digest_http_message(): copy terminating NUL as later
- Curl_override_sspi_http_realm() expects a NUL-terminated string.
-
- Fixes #1180
-
-- curl_formadd.3: CURLFORM_CONTENTSLENGTH not needed when chunked
-
- Mentioned in #1013
-
-- [Kyselgov E.N brought this change]
-
- cmake: use crypt32.lib when building with OpenSSL on windows
-
- Reviewed-by: Peter Wu
- Closes #1149
- Fixes #1147
-
-- [Chris Araman brought this change]
-
- darwinssl: fix CFArrayRef leak
-
- Reviewed-by: Nick Zitzmann
- Closes #1173
-
-- [Chris Araman brought this change]
-
- darwinssl: fix iOS build
-
- Reviewed-by: Nick Zitzmann
- Fixes #1172
-
-- curl: remove superfluous include file
-
- The <netinet/tcp.h> is a leftover from the past when TCP socket options
- were set in this file. This include causes build issues on AIX 4.3.
-
- Reported-by: Kim Minjoong
-
- Closes #1178
-
-- RELEASE-NOTES: synced with a7b38c9dc98481e
-
-- vtls: s/SSLEAY/OPENSSL
-
- Fixed an old leftover use of the USE_SSLEAY define which would make a
- socket get removed from the applications sockets to monitor when the
- multi_socket API was used, leading to timeouts.
-
- Bug: #1174
-
-- docs/ciphers: link to our own new page about ciphers
-
- ... as the former ones always go stale!
-
-- cmdline-opts/page-footer: add three more exit codes
-
- ... and regenerated curl.1
-
-- formdata: use NULL, not 0, when returning pointers
-
-- ftp: failure to resolve proxy should return that error code
-
-- configure: accept --with-libidn2 instead
-
- ... which the help text already implied since we switched to libidn2
- from libidn in commit 9c91ec778104ae3b back in October 2016.
-
- Reported-by: Christian Weisgerber
- Bug: https://curl.haxx.se/mail/lib-2016-12/0110.html
-
-- test1282: verify the ftp-gss check
-
-- ftp-gss: check for init before use
-
- To avoid dereferencing a NULL pointer.
-
- Reported-by: Daniel Romero
-
-Jay Satiro (24 Dec 2016)
-- build-wolfssl: Sync config with wolfSSL 3.10
-
- wolfSSL configure script relevant changes from 3.9 to 3.10:
-
- - DES3 no longer enabled by default
- - Shamir no longer enabled by default
- - Extended master secret enabled by default
- - RSA and ECC timing protections enabled by default
-
- For backwards compatibility I enabled DES3 and ECC shamir config options
- (ie no change from 3.9), and the other changes are included.
-
-- cyassl: use time_t instead of long for timeout
-
-Daniel Stenberg (23 Dec 2016)
-- bump: toward next release
-
-- http: remove "Curl_http_done: called premature" message
-
- ... it only confuses people.
-
-- openssl-random: check return code when asking for random
-
- and fail appropriately if it returns error
-
-- gnutls-random: check return code for failed random
-
-Version 7.52.1 (22 Dec 2016)
-
-Daniel Stenberg (22 Dec 2016)
-- RELEASE-NOTES: curl 7.52.1
-
-- lib557.c: use a shorter MAXIMIZE representation
-
- Since several compilers had problems with the previous one
-
- Reported-by: Ray Satiro
- Bug: https://curl.haxx.se/mail/lib-2016-12/0098.html
-
-- runtests: remove the valgrind parser
-
- Old legacy parsing that 1) hid problems for us and 2) probably isn't
- needed anymore.
-
-- [Kamil Dudka brought this change]
-
- randit: store the value in the buffer
-
-- tests/Makefile: run checksrc on debug builds
-
- ... just like we already do in src/ and lib/
-
-- lib557: move the "enable LONGLINE" to allow more long lines
-
- This file is riddled with them...
-
-- bump: toward next release
-
-Marcel Raad (21 Dec 2016)
-- lib: fix MSVC compiler warnings
-
- Visual C++ complained:
- warning C4267: '=': conversion from 'size_t' to 'long', possible loss of data
- warning C4701: potentially uninitialized local variable 'path' used
-
-Version 7.52.0 (20 Dec 2016)
-
-Daniel Stenberg (20 Dec 2016)
-- THANKS: 13 new contributors from 7.52.0
-
-- RELEASE-NOTES: 7.52.0
-
-- ssh: inhibit coverity warning with (void)
-
- CID 1397391 (#1 of 1): Unchecked return value (CHECKED_RETURN)
-
-- Curl_recv_has_postponed_data: silence compiler warnings
-
- Follow-up to d00f2a8f2
-
-Jay Satiro (19 Dec 2016)
-- tests: checksrc compliance
-
-- http_proxy: Fix proxy CONNECT hang on pending data
-
- - Check for pending data before waiting on the socket.
-
- Bug: https://github.com/curl/curl/issues/1156
- Reported-by: Adam Langley
-
-Daniel Stenberg (19 Dec 2016)
-- cmdline-opts/tlsv1.d: rephrased
-
-- [Dan McNulty brought this change]
-
- schannel: fix wildcard cert name validation on Win CE
-
- Fixes a few issues in manual wildcard cert name validation in
- schannel support code for Win32 CE:
- - when comparing the wildcard name to the hostname, the wildcard
- character was removed from the cert name and the hostname
- was checked to see if it ended with the modified cert name.
- This allowed cert names like *.com to match the connection
- hostname. This violates recommendations from RFC 6125.
- - when the wildcard name in the certificate is longer than the
- connection hostname, a buffer overread of the connection
- hostname buffer would occur during the comparison of the
- certificate name and the connection hostname.
-
-- printf: fix floating point buffer overflow issues
-
- ... and add a bunch of floating point printf tests
-
-- config-amigaos.h: (embarrassed) made the line shorter
-
-- config-amigaos.h: fix bug report email reference
-
-- RELEASE-NOTES: synced with 4517158abfeba
-
-- CIPHERS.md: backtick the names to show underscores fine
-
-- form-string.d: fix format mistake
-
- and regenerated curl.1
-
- Reported-by: Gisle Vanem
-
-Michael Kaufmann (18 Dec 2016)
-- openssl: simplify expression in Curl_ossl_version
-
-- curl_easy_recv: Improve documentation and example program
-
- Follow-up to 82245ea: Fix the example program sendrecv.c (handle
- CURLE_AGAIN, handle incomplete send). Improve the documentation
- for curl_easy_recv() and curl_easy_send().
-
- Reviewed-by: Frank Meier
- Assisted-by: Jay Satiro
-
- See https://github.com/curl/curl/pull/1134
-
-- [Isaac Boukris brought this change]
-
- Curl_getconnectinfo: avoid checking if the connection is closed
-
- It doesn't benefit us much as the connection could get closed at
- any time, and also by checking we lose the ability to determine
- if the socket was closed by reading zero bytes.
-
- Reported-by: Michael Kaufmann
-
- Closes https://github.com/curl/curl/pull/1134
-
-Daniel Stenberg (18 Dec 2016)
-- CIPHERS.md: attempt to document TLS cipher names
-
- As the official docs seems really hard to keep track of and link to over
- time
-
-- curl.1: generated after 6cce4dbf830
-
-- cmdline-opts/post30X.d: fix the RFC references
-
-- curl.1: regenerated
-
- Fixed trailing whitespace and numerous formatting glitches
-
-- cmdline-opts: formatting fixes
-
-- curl_easy_setopt.3: removed CURLOPT_SOCKS_PROXYTYPE
-
-- tool_getparam.c: make comments use the up-to-date option names
-
-- manpage-scan.pl: allow deprecated options to get removed from curl.1
-
- --krb4, --ftp-ssl and --ftp-ssl-reqd no longer need to be documented in the
- man page
-
-- cmdline-opts/gen.pl: trim off trailing spaces
-
-- cmdline-opts/proxy-tlsuser.d: remove trailing .d
-
-- curl_easy_setopt.3: CURLOPT_PRE_PROXY instead of CURLOPT_SOCKS_PROXY
-
-- symbols: removed two, added one
-
-- cmdline-opts: include the man page split up files in the dist
-
-- curl.1: generated with gen.pl
-
- This is the first time we replace the manually edited curt.1 with the
- generated one created by gen.pl and the individual option documentation
- pages.
-
- Do not edit this file, edit the individual pages and regenerate this
- output.
-
- This file will be generated by the build system soon and then removed
- from git.
-
-- cmdline-opts: added some missing info
-
-- CURLINFO_SSL_VERIFYRESULT.3: language
-
-- HTTPS-PROXY docs: update/polish
-
-- cmdline-opts/page-header: mention it is generated
-
- ... to avoid people from trying to edit the pending curl.1 version that
- gets generated by gen.pl
-
-- preproxy: renamed what was added as SOCKS_PROXY
-
- CURLOPT_SOCKS_PROXY -> CURLOPT_PRE_PROXY
-
- Added the corresponding --preroxy command line option. Sets a SOCKS
- proxy to connect to _before_ connecting to a HTTP(S) proxy.
-
-- curl: normal socks proxies still use CURLOPT_PROXY
-
- ... the newly introduced CURLOPT_SOCKS_PROXY is special and should be
- asked for specially. (Needs new code.)
-
- Unified proxy type to a single variable in the config struct.
-
-- CURLOPT_SOCKS_PROXYTYPE: removed
-
- This was added as part of the SOCKS+HTTPS proxy merge but there's no
- need to support this as we prefer to have the protocol specified as a
- prefix instead.
-
-- curl_multi_socket.3: fix typo
-
-- checksrc: warn for assignments within if() expressions
-
- ... they're already frowned upon in our source code style guide, this
- now enforces the rule harder.
-
-- checksrc: stricter no-space-before-paren enforcement
-
- In order to make the code style more uniform everywhere
-
-- ISSUE_TEMPLATE: try mentioning known bugs/todo in new issue template
-
-- RELEASE-NOTES: synced with 71a55534fa6
-
-- [Adam Langley brought this change]
-
- openssl: don't use OpenSSL's ERR_PACK.
-
- ERR_PACK is an internal detail of OpenSSL. Also, when using it, a
- function name must be specified which is overly specific: the test will
- break whenever OpenSSL internally change things so that a different
- function creates the error.
-
- Closes #1157
-
-Dan Fandrich (5 Dec 2016)
-- test2032: Mark test as flaky
-
-Jay Satiro (3 Dec 2016)
-- [Jeremy Pearson brought this change]
-
- libcurl-multi.3: typo
-
- Closes https://github.com/curl/curl/pull/1153
-
-Dan Fandrich (2 Dec 2016)
-- test1281: added http as a required feature
-
-Daniel Stenberg (2 Dec 2016)
-- curl: support zero-length argument strings in config files
-
- ... like 'user-agent = ""'
-
- Adjusted test 71 to verify.
-
-- http_proxy: simplify CONNECT response reading
-
- Since it now reads responses one byte a time, a loop could be removed
- and it is no longer limited to get the whole response within 16K, it is
- now instead only limited to 16K maximum header line lengths.
-
-- tests: fix CONNECT test cases to be more strict
-
- ... as they broke with the cleaned up CONNECT handling
-
-- CONNECT: read responses one byte at a time
-
- ... so that it doesn't read data that is actually coming from the
- remote. 2xx responses have no body from the proxy, that data is from the
- peer.
-
- Fixes #1132
-
-- CONNECT: reject TE or CL in 2xx responses
-
- A server MUST NOT send any Transfer-Encoding or Content-Length header
- fields in a 2xx (Successful) response to CONNECT. (RFC 7231 section
- 4.3.6)
-
- Also fixes the three test cases that did this.
-
-- URL parser: reject non-numerical port numbers
-
- Test 1281 added to verify
-
-Dan Fandrich (30 Nov 2016)
-- runtests: made Servers: output be more consistent by removing OFF
-
-- cyassl: fixed typo introduced in 4f8b1774
-
-Michael Kaufmann (30 Nov 2016)
-- CURLOPT_CONNECT_TO: Skip non-matching "connect-to" entries properly
-
- If a port number in a "connect-to" entry does not match, skip this
- entry instead of connecting to port 0.
-
- If a port number in a "connect-to" entry matches, use this entry
- and look no further.
-
- Reported-by: Jay Satiro
- Assisted-by: Jay Satiro, Daniel Stenberg
-
- Closes #1148
-
-Daniel Stenberg (29 Nov 2016)
-- BUGS: describe bug handling process
-
-- RELEASE-NOTES: synced with 19613fb3
-
-Jay Satiro (28 Nov 2016)
-- http2: check nghttp2_session_set_local_window_size exists
-
- The function only exists since nghttp2 1.12.0.
-
- Bug: https://github.com/curl/curl/commit/a4d8888#commitcomment-19985676
- Reported-by: Michael Kaufmann
-
-Daniel Stenberg (28 Nov 2016)
-- [Anders Bakken brought this change]
-
- http2: Fix crashes when parent stream gets aborted
-
- Closes #1125
-
-- cmdline-docs: more options converted and fixed
-
- Now all options are in the new system.
-
-- gen: include footer in mainpage output
-
-Jay Satiro (28 Nov 2016)
-- lib1536: checksrc compliance
-
-Daniel Stenberg (28 Nov 2016)
-- cmdline-opts: more command line options documented
-
- Moved over to the new format
-
-- curl: remove --proxy-ssl* options
-
- There's mostly likely no need to allow setting SSLv2/3 version for HTTPS
- proxy. Those protocols are insecure by design and deprecated.
-
-- CURLOPT_PROXY_*.3: polished some proxy option man pages
-
-Patrick Monnerat (26 Nov 2016)
-- os400: support CURLOPT_PROXY_PINNEDPUBLICKEY
-
- Also define it in ILE/RPG binding.
-
-Daniel Stenberg (26 Nov 2016)
-- [Okhin Vasilij brought this change]
-
- curl_version_info: add CURL_VERSION_HTTPS_PROXY
-
- Closes #1142
-
-- [Frank Gevaerts brought this change]
-
- tests: Add some testcases for recent new features.
-
- Add missing tests for CURLINFO_SCHEME, CURLINFO_PROTOCOL, %{scheme},
- and %{http_version}
-
- closes #1143
-
-- [Frank Gevaerts brought this change]
-
- curl_easy_reset: clear info for CULRINFO_PROTOCOL and CURLINFO_SCHEME
-
-- CURLOPT_PROXY_CAINFO.3: clarify proxy use
-
-- CURLOPT_PROXY_CRLFILE.3: clarify https proxy and availability
-
-- curl_easy_setopt.3: add CURLOPT_PROXY_PINNEDPUBLICKEY
-
- Follow-up to 4f8b17743d7c55a
-
-- docs: include all opts man pages in dist
-
- Sorted the lists too.
-
- ... and include the new ones in the PDF and HTML generation targets
-
-- [Thomas Glanzmann brought this change]
-
- HTTPS Proxy: Implement CURLOPT_PROXY_PINNEDPUBLICKEY
-
-- [Thomas Glanzmann brought this change]
-
- url: proxy: Use 443 as default port for https proxies
-
-- TODO: removed "HTTPS proxy"
-
-- [Jan-E brought this change]
-
- winbuild: add config option ENABLE_NGHTTP2
-
- Closes #1141
-
-Jay Satiro (24 Nov 2016)
-- tool_urlglob: Improve sanity check in glob_range
-
- Prior to this change we depended on errno if strtol could not perform a
- conversion. POSIX says EINVAL *may* be set. Some implementations like
- Microsoft's will not set it if there's no conversion.
-
- Ref: https://github.com/curl/curl/commit/ee4f7660#commitcomment-19658189
-
-- tool_help: Change description for --retry-connrefused
-
- Ref: https://github.com/curl/curl/pull/1064#issuecomment-260052409
-
-Patrick Monnerat (25 Nov 2016)
-- os400: sync ILE/RPG binding
-
-Jay Satiro (24 Nov 2016)
-- test1135: Fix curl_easy_duphandle prototype for code style
-
- Follow-up to dbadaeb which changed the style.
-
-- x509asn1: Restore the parameter check in Curl_getASN1Element
-
- - Restore the removed parts of the parameter check.
-
- Follow-up to 945f60e which altered the parameter check.
-
-Daniel Stenberg (25 Nov 2016)
-- RELEASE-NOTES: update option counters
-
-- [Frank Gevaerts brought this change]
-
- add CURLINFO_SCHEME, CURLINFO_PROTOCOL, and %{scheme}
-
- Adds access to the effectively used protocol/scheme to both libcurl and
- curl, both in string and numeric (CURLPROTO_*) form.
-
- Note that the string form will be uppercase, as it is just the internal
- string.
-
- As these strings are declared internally as const, and all other strings
- returned by curl_easy_getinfo() are de-facto const as well, string
- handling in getinfo.c got const-ified.
-
- Closes #1137
-
-- RELEASE-NOTES: synced with 63198a4750aeb
-
-- curl.1: the new --proxy options ship in 7.52.0
-
-- checksrc: move open braces to comply with function declaration style
-
-- checksrc: detect wrongly placed open braces in func declarations
-
-- checksrc: white space edits to comply to stricter checksrc
-
-- checksrc: verify ASTERISKNOSPACE
-
- Detects (char*) and 'char*foo' uses.
-
-- checksrc: code style: use 'char *name' style
-
-- checksrc: add ASTERISKSPACE
-
- Verifies a 'char *name' style, with no space after the asterisk.
-
-- openssl: remove dead code
-
- Coverity CID 1394666
-
-- [Okhin Vasilij brought this change]
-
- HTTPS-proxy: fixed mbedtls and polishing
-
-- darwinssl: adopted to the HTTPS proxy changes
-
- It builds and runs all test cases. No adaptations for actual HTTPS proxy
- support has been made.
-
-- gtls: fix indent to silence compiler warning
-
- vtls/gtls.c: In function ‘Curl_gtls_data_pending’:
- vtls/gtls.c:1429:3: error: this ‘if’ clause does not guard... [-Werror=misleading-indentation]
- if(conn->proxy_ssl[connindex].session &&
- ^~
- vtls/gtls.c:1433:5: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
- return res;
-
-- [Thomas Glanzmann brought this change]
-
- mbedtls: Fix compile errors
-
-- [Alex Rousskov brought this change]
-
- proxy: Support HTTPS proxy and SOCKS+HTTP(s)
-
- * HTTPS proxies:
-
- An HTTPS proxy receives all transactions over an SSL/TLS connection.
- Once a secure connection with the proxy is established, the user agent
- uses the proxy as usual, including sending CONNECT requests to instruct
- the proxy to establish a [usually secure] TCP tunnel with an origin
- server. HTTPS proxies protect nearly all aspects of user-proxy
- communications as opposed to HTTP proxies that receive all requests
- (including CONNECT requests) in vulnerable clear text.
-
- With HTTPS proxies, it is possible to have two concurrent _nested_
- SSL/TLS sessions: the "outer" one between the user agent and the proxy
- and the "inner" one between the user agent and the origin server
- (through the proxy). This change adds supports for such nested sessions
- as well.
-
- A secure connection with a proxy requires its own set of the usual SSL
- options (their actual descriptions differ and need polishing, see TODO):
-
- --proxy-cacert FILE CA certificate to verify peer against
- --proxy-capath DIR CA directory to verify peer against
- --proxy-cert CERT[:PASSWD] Client certificate file and password
- --proxy-cert-type TYPE Certificate file type (DER/PEM/ENG)
- --proxy-ciphers LIST SSL ciphers to use
- --proxy-crlfile FILE Get a CRL list in PEM format from the file
- --proxy-insecure Allow connections to proxies with bad certs
- --proxy-key KEY Private key file name
- --proxy-key-type TYPE Private key file type (DER/PEM/ENG)
- --proxy-pass PASS Pass phrase for the private key
- --proxy-ssl-allow-beast Allow security flaw to improve interop
- --proxy-sslv2 Use SSLv2
- --proxy-sslv3 Use SSLv3
- --proxy-tlsv1 Use TLSv1
- --proxy-tlsuser USER TLS username
- --proxy-tlspassword STRING TLS password
- --proxy-tlsauthtype STRING TLS authentication type (default SRP)
-
- All --proxy-foo options are independent from their --foo counterparts,
- except --proxy-crlfile which defaults to --crlfile and --proxy-capath
- which defaults to --capath.
-
- Curl now also supports %{proxy_ssl_verify_result} --write-out variable,
- similar to the existing %{ssl_verify_result} variable.
-
- Supported backends: OpenSSL, GnuTLS, and NSS.
-
- * A SOCKS proxy + HTTP/HTTPS proxy combination:
-
- If both --socks* and --proxy options are given, Curl first connects to
- the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS
- proxy.
-
- TODO: Update documentation for the new APIs and --proxy-* options.
- Look for "Added in 7.XXX" marks.
-
-Patrick Monnerat (24 Nov 2016)
-- Declare endian read functions argument as a const pointer.
- This is done for all functions of the form Curl_read[136][624]_[lb]e.
-
-- Limit ASN.1 structure sizes to 256K. Prevent some allocation size overflows.
- See CRL-01-006.
-
-Jay Satiro (22 Nov 2016)
-- url: Fix conn reuse for local ports and interfaces
-
- - Fix connection reuse for when the proposed new conn 'needle' has a
- specified local port but does not have a specified device interface.
-
- Bug: https://curl.haxx.se/mail/lib-2016-11/0137.html
- Reported-by: bjt3[at]hotmail.com
-
-Daniel Stenberg (21 Nov 2016)
-- rand: pass in number of randoms as an unsigned argument
-
-Jay Satiro (20 Nov 2016)
-- rand: Fix potentially uninitialized result warning
-
-Marcel Raad (19 Nov 2016)
-- vtls: fix build warnings
-
- Fix warnings about conversions from long to time_t in openssl.c and
- schannel.c.
-
- Follow-up to de4de4e3c7c
-
-Daniel Stenberg (18 Nov 2016)
-- [Marcel Raad brought this change]
-
- lib: fix compiler warnings after de4de4e3c7c
-
- Visual C++ now complains about implicitly casting time_t (64-bit) to
- long (32-bit). Fix this by changing some variables from long to time_t,
- or explicitly casting to long where the public interface would be
- affected.
-
- Closes #1131
-
-Peter Wu (17 Nov 2016)
-- [Isaac Boukris brought this change]
-
- Don't mix unix domain sockets with regular ones
-
- When reusing a connection, make sure the unix domain
- socket option matches.
-
-Jay Satiro (17 Nov 2016)
-- tests: Fix HTTP2-Settings header for huge window size
-
- Follow-up to a4d8888. Changing the window size in that commit resulted
- in a different HTTP2-Settings upgrade header, causing test 1800 to fail.
-
-- http2: Use huge HTTP/2 windows
-
- - Improve performance by using a huge HTTP/2 window size.
-
- Bug: https://github.com/curl/curl/issues/1102
- Reported-by: afrind@users.noreply.github.com
- Assisted-by: Tatsuhiro Tsujikawa
-
-Daniel Stenberg (16 Nov 2016)
-- cmdline-docs: more conversion
-
-- gen: support 'protos'
-
- and warn on unrecognized lines
-
-- gen: support 'single' to make an individual page man page
-
-- cmdline-docs: more options converted over
-
-- gen: support 'redirect'
-
- ... and warn for too long --help lines
-
-- cmdline/gen: replace options in texts better
-
-Jay Satiro (16 Nov 2016)
-- http2: Fix address sanitizer memcpy warning
-
- - In Curl_http2_switched don't call memcpy when src is NULL.
-
- Curl_http2_switched can be called like:
-
- Curl_http2_switched(conn, NULL, 0);
-
- .. and prior to this change memcpy was then called like:
-
- memcpy(dest, NULL, 0)
-
- .. causing address sanitizer to warn:
-
- http2.c:2057:3: runtime error: null pointer passed as argument 2, which
- is declared to never be null
diff --git a/CMake/Macros.cmake b/CMake/Macros.cmake
index dab005f..82aadca 100644
--- a/CMake/Macros.cmake
+++ b/CMake/Macros.cmake
@@ -93,3 +93,32 @@ macro(CURL_INTERNAL_TEST_RUN CURL_TEST)
endif(${CURL_TEST}_COMPILE AND NOT ${CURL_TEST})
endif()
endmacro(CURL_INTERNAL_TEST_RUN)
+
+macro(CURL_NROFF_CHECK)
+ find_program(NROFF NAMES gnroff nroff)
+ if(NROFF)
+ # Need a way to write to stdin, this will do
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt" "test")
+ # Tests for a valid nroff option to generate a manpage
+ foreach(_MANOPT "-man" "-mandoc")
+ execute_process(COMMAND "${NROFF}" ${_MANOPT}
+ OUTPUT_VARIABLE NROFF_MANOPT_OUTPUT
+ INPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt"
+ ERROR_QUIET)
+ # Save the option if it was valid
+ if(NROFF_MANOPT_OUTPUT)
+ message("Found *nroff option: -- ${_MANOPT}")
+ set(NROFF_MANOPT ${_MANOPT})
+ set(NROFF_USEFUL ON)
+ break()
+ endif()
+ endforeach()
+ # No need for the temporary file
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt")
+ if(NOT NROFF_USEFUL)
+ message(WARNING "Found no *nroff option to get plaintext from man pages")
+ endif()
+ else()
+ message(WARNING "Found no *nroff program")
+ endif()
+endmacro(CURL_NROFF_CHECK)
diff --git a/CMake/curl-config.cmake b/CMake/curl-config.cmake
new file mode 100644
index 0000000..119332c
--- /dev/null
+++ b/CMake/curl-config.cmake
@@ -0,0 +1,59 @@
+
+get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
+
+if(NOT CURL_FIND_COMPONENTS)
+ set(CURL_FIND_COMPONENTS curl libcurl)
+ if(CURL_FIND_REQUIRED)
+ set(CURL_FIND_REQUIRED_curl TRUE)
+ set(CURL_FIND_REQUIRED_libcurl TRUE)
+ endif()
+endif()
+
+set(_curl_missing_components)
+foreach(_comp ${CURL_FIND_COMPONENTS})
+ if(EXISTS "${_DIR}/${_comp}-target.cmake")
+ include("${_DIR}/${_comp}-target.cmake")
+ set(CURL_${_comp}_FOUND TRUE)
+ else()
+ set(CURL_${_comp}_FOUND FALSE)
+ if(CURL_FIND_REQUIRED_${_comp})
+ set(CURL_FOUND FALSE)
+ list(APPEND _curl_missing_components ${_comp})
+ endif()
+ endif()
+endforeach()
+
+if(_curl_missing_components)
+ set(CURL_NOT_FOUND_MESSAGE "Following required components not found: " ${_curl_missing_components})
+else()
+ if(TARGET CURL::libcurl)
+ string(TOUPPER "${CMAKE_BUILD_TYPE}" _curl_current_config)
+ if(NOT _curl_current_config)
+ set(_curl_current_config "NOCONFIG")
+ endif()
+ get_target_property(_curl_configurations CURL::libcurl IMPORTED_CONFIGURATIONS)
+ list(FIND _curl_configurations "${_curl_current_config}" _i)
+ if(_i LESS 0)
+ set(_curl_config "RELEASE")
+ list(FIND _curl_configurations "${_curl_current_config}" _i)
+ if(_i LESS 0)
+ set(_curl_config "NOCONFIG")
+ list(FIND _curl_configurations "${_curl_current_config}" _i)
+ endif()
+ endif()
+
+ if(_i LESS 0)
+ set(_curl_current_config "") # let CMake pick config at random
+ else()
+ set(_curl_current_config "_${_curl_current_config}")
+ endif()
+
+ get_target_property(CURL_INCLUDE_DIRS CURL::libcurl INTERFACE_INCLUDE_DIRECTORIES)
+ get_target_property(CURL_LIBRARIES CURL::libcurl "LOCATION${_curl_current_config}")
+ set(_curl_current_config)
+ set(_curl_configurations)
+ set(_i)
+ endif()
+endif()
+
+unset(_curl_missing_components)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index af7f4dc..7b73b98 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -38,11 +38,12 @@
# To check:
# (From Daniel Stenberg) The cmake build selected to run gcc with -fPIC on my box while the plain configure script did not.
# (From Daniel Stenberg) The gcc command line use neither -g nor any -O options. As a developer, I also treasure our configure scripts's --enable-debug option that sets a long range of "picky" compiler options.
-cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}")
include(Utilities)
include(Macros)
include(CMakeDependentOption)
+include(CheckCCompilerFlag)
project( CURL C )
@@ -73,6 +74,7 @@ include_directories(${PROJECT_BINARY_DIR}/include/curl)
include_directories( ${CURL_SOURCE_DIR}/include )
option(CURL_WERROR "Turn compiler warnings into errors" OFF)
+option(PICKY_COMPILER "Enable picky compiler options" ON)
option(BUILD_CURL_EXE "Set to ON to build curl executable." ON)
option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)
option(ENABLE_ARES "Set to ON to enable c-ares support" OFF)
@@ -88,6 +90,19 @@ CMAKE_DEPENDENT_OPTION(ENABLE_THREADED_RESOLVER "Set to ON to enable threaded DN
option(ENABLE_DEBUG "Set to ON to enable curl debug features" OFF)
option(ENABLE_CURLDEBUG "Set to ON to build with TrackMemory feature enabled" OFF)
+if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
+ if (PICKY_COMPILER)
+ foreach (_CCOPT -pedantic -Wall -W -Wpointer-arith -Wwrite-strings -Wunused -Wshadow -Winline -Wnested-externs -Wmissing-declarations -Wmissing-prototypes -Wno-long-long -Wfloat-equal -Wno-multichar -Wsign-compare -Wundef -Wno-format-nonliteral -Wendif-labels -Wstrict-prototypes -Wdeclaration-after-statement -Wstrict-aliasing=3 -Wcast-align -Wtype-limits -Wold-style-declaration -Wmissing-parameter-type -Wempty-body -Wclobbered -Wignored-qualifiers -Wconversion -Wno-sign-conversion -Wvla -Wdouble-promotion -Wno-system-headers)
+ # surprisingly, CHECK_C_COMPILER_FLAG needs a new variable to store each new
+ # test result in.
+ CHECK_C_COMPILER_FLAG(${_CCOPT} OPT${_CCOPT})
+ if(OPT${_CCOPT})
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_CCOPT}")
+ endif()
+ endforeach()
+ endif(PICKY_COMPILER)
+endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
+
if (ENABLE_DEBUG)
# DEBUGBUILD will be defined only for Debug builds
if(NOT CMAKE_VERSION VERSION_LESS 3.0)
@@ -172,8 +187,6 @@ option(CURL_DISABLE_CRYPTO_AUTH "to disable cryptographic authentication" OFF)
mark_as_advanced(CURL_DISABLE_CRYPTO_AUTH)
option(CURL_DISABLE_VERBOSE_STRINGS "to disable verbose strings" OFF)
mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS)
-option(DISABLED_THREADSAFE "Set to explicitly specify we don't want to use thread-safe functions" OFF)
-mark_as_advanced(DISABLED_THREADSAFE)
option(ENABLE_IPV6 "Define if you want to enable IPv6 support" ON)
mark_as_advanced(ENABLE_IPV6)
if(ENABLE_IPV6 AND NOT WIN32)
@@ -190,38 +203,20 @@ if(ENABLE_IPV6 AND NOT WIN32)
endif()
endif()
-option(ENABLE_MANUAL "to provide the built-in manual" ON)
-unset(USE_MANUAL CACHE) # TODO: cache NROFF/NROFF_MANOPT/USE_MANUAL vars?
+CURL_NROFF_CHECK()
+find_package(Perl)
+
+CMAKE_DEPENDENT_OPTION(ENABLE_MANUAL "to provide the built-in manual"
+ ON "NROFF_USEFUL;PERL_FOUND"
+ OFF)
+
+if(NOT PERL_FOUND)
+ message(STATUS "Perl not found, testing disabled.")
+ set(BUILD_TESTING OFF)
+endif()
if(ENABLE_MANUAL)
- find_program(NROFF NAMES gnroff nroff)
- if(NROFF)
- # Need a way to write to stdin, this will do
- file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt" "test")
- # Tests for a valid nroff option to generate a manpage
- foreach(_MANOPT "-man" "-mandoc")
- execute_process(COMMAND "${NROFF}" ${_MANOPT}
- OUTPUT_VARIABLE NROFF_MANOPT_OUTPUT
- INPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt"
- ERROR_QUIET)
- # Save the option if it was valid
- if(NROFF_MANOPT_OUTPUT)
- message("Found *nroff option: -- ${_MANOPT}")
- set(NROFF_MANOPT ${_MANOPT})
- set(USE_MANUAL 1)
- break()
- endif()
- endforeach()
- # No need for the temporary file
- file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt")
- if(NOT USE_MANUAL)
- message(WARNING "Found no *nroff option to get plaintext from man pages")
- endif()
- else()
- message(WARNING "Found no *nroff program")
- endif()
+ set(USE_MANUAL ON)
endif()
-# Required for building manual, docs, tests
-find_package(Perl REQUIRED)
# We need ansi c-flags, especially on HP
set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
@@ -371,7 +366,6 @@ if(CMAKE_USE_OPENSSL)
check_include_file("openssl/engine.h" HAVE_OPENSSL_ENGINE_H)
check_include_file("openssl/err.h" HAVE_OPENSSL_ERR_H)
check_include_file("openssl/pem.h" HAVE_OPENSSL_PEM_H)
- check_include_file("openssl/pkcs12.h" HAVE_OPENSSL_PKCS12_H)
check_include_file("openssl/rsa.h" HAVE_OPENSSL_RSA_H)
check_include_file("openssl/ssl.h" HAVE_OPENSSL_SSL_H)
check_include_file("openssl/x509.h" HAVE_OPENSSL_X509_H)
@@ -801,50 +795,6 @@ if(NOT HAVE_SIZEOF_SSIZE_T)
endif(NOT HAVE_SIZEOF_SSIZE_T)
# off_t is sized later, after the HAVE_FILE_OFFSET_BITS test
-# Different sizeofs, etc.
-
-# define CURL_SIZEOF_LONG 4
-# define CURL_TYPEOF_CURL_OFF_T long long
-# define CURL_FORMAT_CURL_OFF_T "lld"
-# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
-# define CURL_SIZEOF_CURL_OFF_T 8
-# define CURL_SUFFIX_CURL_OFF_T LL
-# define CURL_SUFFIX_CURL_OFF_TU ULL
-
-set(CURL_SIZEOF_LONG ${SIZEOF_LONG})
-
-if(SIZEOF_LONG EQUAL 8)
- set(CURL_TYPEOF_CURL_OFF_T long)
- set(CURL_SIZEOF_CURL_OFF_T 8)
- set(CURL_FORMAT_CURL_OFF_T "ld")
- set(CURL_FORMAT_CURL_OFF_TU "lu")
- set(CURL_FORMAT_OFF_T "%ld")
- set(CURL_SUFFIX_CURL_OFF_T L)
- set(CURL_SUFFIX_CURL_OFF_TU UL)
-endif(SIZEOF_LONG EQUAL 8)
-
-if(SIZEOF_LONG_LONG EQUAL 8)
- set(CURL_TYPEOF_CURL_OFF_T "long long")
- set(CURL_SIZEOF_CURL_OFF_T 8)
- set(CURL_FORMAT_CURL_OFF_T "lld")
- set(CURL_FORMAT_CURL_OFF_TU "llu")
- set(CURL_FORMAT_OFF_T "%lld")
- set(CURL_SUFFIX_CURL_OFF_T LL)
- set(CURL_SUFFIX_CURL_OFF_TU ULL)
-endif(SIZEOF_LONG_LONG EQUAL 8)
-
-if(NOT CURL_TYPEOF_CURL_OFF_T)
- set(CURL_TYPEOF_CURL_OFF_T ${ssize_t})
- set(CURL_SIZEOF_CURL_OFF_T ${SIZEOF_SSIZE_T})
- # TODO: need adjustment here.
- set(CURL_FORMAT_CURL_OFF_T "ld")
- set(CURL_FORMAT_CURL_OFF_TU "lu")
- set(CURL_FORMAT_OFF_T "%ld")
- set(CURL_SUFFIX_CURL_OFF_T L)
- set(CURL_SUFFIX_CURL_OFF_TU LU)
-endif(NOT CURL_TYPEOF_CURL_OFF_T)
-
if(HAVE_SIZEOF_LONG_LONG)
set(HAVE_LONGLONG 1)
set(HAVE_LL 1)
@@ -924,10 +874,12 @@ check_symbol_exists(ftruncate "${CURL_INCLUDES}" HAVE_FTRUNCATE)
check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME)
check_symbol_exists(getrlimit "${CURL_INCLUDES}" HAVE_GETRLIMIT)
check_symbol_exists(setlocale "${CURL_INCLUDES}" HAVE_SETLOCALE)
+check_symbol_exists(setmode "${CURL_INCLUDES}" HAVE_SETMODE)
check_symbol_exists(setrlimit "${CURL_INCLUDES}" HAVE_SETRLIMIT)
check_symbol_exists(fcntl "${CURL_INCLUDES}" HAVE_FCNTL)
check_symbol_exists(ioctl "${CURL_INCLUDES}" HAVE_IOCTL)
check_symbol_exists(setsockopt "${CURL_INCLUDES}" HAVE_SETSOCKOPT)
+check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME)
# symbol exists in win32, but function does not.
if(WIN32)
@@ -1013,6 +965,13 @@ if(HAVE_FILE_OFFSET_BITS)
set(CMAKE_REQUIRED_FLAGS "-D_FILE_OFFSET_BITS=64")
endif(HAVE_FILE_OFFSET_BITS)
check_type_size("off_t" SIZEOF_OFF_T)
+
+# include this header to get the type
+set(CMAKE_REQUIRED_INCLUDES "${CURL_SOURCE_DIR}/include")
+set(CMAKE_EXTRA_INCLUDE_FILES "curl/system.h")
+check_type_size("curl_off_t" SIZEOF_CURL_OFF_T)
+set(CMAKE_EXTRA_INCLUDE_FILES "")
+
set(CMAKE_REQUIRED_FLAGS)
foreach(CURL_TEST
@@ -1173,8 +1132,18 @@ function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
endfunction()
-add_subdirectory(docs)
+if(WIN32 AND NOT CYGWIN)
+ set(CURL_INSTALL_CMAKE_DIR CMake)
+else()
+ set(CURL_INSTALL_CMAKE_DIR lib/cmake/curl)
+endif()
+
+if(USE_MANUAL)
+ add_subdirectory(docs)
+endif()
+
add_subdirectory(lib)
+
if(BUILD_CURL_EXE)
add_subdirectory(src)
endif()
@@ -1319,6 +1288,25 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl"
DESTINATION include
FILES_MATCHING PATTERN "*.h")
+
+include(CMakePackageConfigHelpers)
+write_basic_package_version_file(
+ "${PROJECT_BINARY_DIR}/curl-config-version.cmake"
+ VERSION ${CURL_VERSION}
+ COMPATIBILITY SameMajorVersion
+)
+
+configure_file(CMake/curl-config.cmake
+ "${PROJECT_BINARY_DIR}/curl-config.cmake"
+ COPYONLY
+)
+
+install(
+ FILES ${PROJECT_BINARY_DIR}/curl-config.cmake
+ ${PROJECT_BINARY_DIR}/curl-config-version.cmake
+ DESTINATION ${CURL_INSTALL_CMAKE_DIR}
+)
+
# Workaround for MSVS10 to avoid the Dialog Hell
# FIXME: This could be removed with future version of CMake.
if(MSVC_VERSION EQUAL 1600)
diff --git a/Makefile.am b/Makefile.am
index ab8f11c..8e5ef91 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -30,7 +30,8 @@ CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \
CMake/Macros.cmake \
CMake/CurlSymbolHiding.cmake CMake/FindCARES.cmake \
CMake/FindLibSSH2.cmake CMake/FindNGHTTP2.cmake \
- CMake/FindMbedTLS.cmake CMake/cmake_uninstall.cmake.in
+ CMake/FindMbedTLS.cmake CMake/cmake_uninstall.cmake.in \
+ CMake/curl-config.cmake
VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl
VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist
@@ -216,15 +217,6 @@ examples:
check-docs:
@(cd docs/libcurl; $(MAKE) check)
-# This is a hook to have 'make clean' also clean up the docs and the tests
-# dir. The extra check for the Makefiles being present is necessary because
-# 'make distcheck' will make clean first in these directories _before_ it runs
-# this hook.
-clean-local:
- @(if test -f tests/Makefile; then cd tests; $(MAKE) clean; fi)
- @(if test -f docs/Makefile; then cd docs; $(MAKE) clean; fi)
-
-#
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
# must contain the following line:
# %_topdir /home/loic/local/rpm
diff --git a/README.version b/README.version
index 1c2b9cd..e54612c 100644
--- a/README.version
+++ b/README.version
@@ -1,5 +1,5 @@
-URL: https://curl.haxx.se/download/curl-7.55.1.tar.gz
-Version: 7.55.1
+URL: https://curl.haxx.se/download/curl-7.57.0.tar.gz
+Version: 7.57.0
License: MIT
License File: NOTICE
BugComponent: 31714
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index a735262..bb52004 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,40 +1,88 @@
-Curl and libcurl 7.55.1
+Curl and libcurl 7.57.0
- Public curl releases: 168
- Command line options: 210
- curl_easy_setopt() options: 247
- Public functions in libcurl: 61
- Contributors: 1592
+ Public curl releases: 171
+ Command line options: 211
+ curl_easy_setopt() options: 249
+ Public functions in libcurl: 74
+ Contributors: 1649
+
+This release includes the following changes:
+
+ o auth: add support for RFC7616 - HTTP Digest access authentication [12]
+ o share: add support for sharing the connection cache [31]
+ o HTTP: implement Brotli content encoding [28]
This release includes the following bugfixes:
- o build: fix 'make install' with configure, install docs/libcurl/* too
- o make install: add 8 missing man pages to the installation
- o curl: do bounds check using a double comparison [1]
- o dist: Add dictserver.py/negtelnetserver.py to release [2]
- o digest_sspi: Don't reuse context if the user/passwd has changed [3]
- o gitignore: ignore top-level .vs folder [4]
- o build: check out *.sln files with Windows line endings [5]
- o travis: verify "make install" [6]
- o dist: fix the cmake build by shipping cmake_uninstall.cmake.in too [7]
- o metalink: fix error: ‘*’ in boolean context, suggest ‘&&’ instead
- o configure: use the threaded resolver backend by default if possible [8]
- o mkhelp.pl: allow executing this script directly [9]
- o maketgz: remove old *.dist files before making the tarball [10]
- o openssl: remove CONST_ASN1_BIT_STRING [11]
- o openssl: fix "error: this statement may fall through"
- o proxy: fix memory leak in case of invalid proxy server name [12]
- o curl/system.h: support more architectures (OpenRISC, ARC) [13]
- o docs: fix typos [14]
- o curl/system.h: add Oracle Solaris Studio [15]
- o CURLINFO_TOTAL_TIME: could wrongly return 4200 seconds [16]
- o docs: --connect-to clarified
- o cmake: allow user to override CMAKE_DEBUG_POSTFIX [17]
- o travis: test cmake build on tarball too
- o redirect: make it handle absolute redirects to IDN names [18]
- o curl/system.h: fix for gcc on PowerPC [19]
- o curl --interface: fixed for IPV6 unique local addresses [20]
- o cmake: threads detection improvements [21]
+ o CVE-2017-8816: NTLM buffer overflow via integer overflow [47]
+ o CVE-2017-8817: FTP wildcard out of bounds read [48]
+ o CVE-2017-8818: SSL out of buffer access [49]
+ o curl_mime_filedata.3: fix typos [1]
+ o libtest: Add required test libraries for lib1552 and lib1553 [2]
+ o fix time diffs for systems using unsigned time_t [3]
+ o ftplistparser: memory leak fix: free temporary memory always [4]
+ o multi: allow table handle sizes to be overridden [5]
+ o wildcards: don't use with non-supported protocols [6]
+ o curl_fnmatch: return error on illegal wildcard pattern [7]
+ o transfer: Fix chunked-encoding upload too early exit [8]
+ o curl_setup: Improve detection of CURL_WINDOWS_APP [9]
+ o resolvers: only include anything if needed [10]
+ o setopt: fix CURLOPT_SSH_AUTH_TYPES option read
+ o appveyor: add a win32 build
+ o Curl_timeleft: change return type to timediff_t [11]
+ o cmake: Export libcurl and curl targets to use by other cmake projects [13]
+ o curl: in -F option arg, comma is a delimiter for files only [14]
+ o curl: improved ";type=" handling in -F option arguments
+ o timeval: use mach_absolute_time() on MacOS [15]
+ o curlx: the timeval functions are no longer provided as curlx_* [16]
+ o mkhelp.pl: do not generate comment with current date [17]
+ o memdebug: use send/recv signature for curl_dosend/curl_dorecv [18]
+ o cookie: avoid NULL dereference [19]
+ o url: fix CURLOPT_POSTFIELDSIZE arg value check to allow -1 [20]
+ o include: remove conncache.h inclusion from where its not needed
+ o CURLOPT_MAXREDIRS: allow -1 as a value [21]
+ o tests: Fixed torture tests on tests 556 and 650
+ o http2: Fixed OOM handling in upgrade request
+ o url: fix CURLOPT_DNS_CACHE_TIMEOUT arg value check to allow -1
+ o CURLOPT_INFILESIZE: accept -1 [22]
+ o curl: pass through [] in URLs instead of calling globbing error [23]
+ o curl: speed up handling of many URLs [24]
+ o ntlm: avoid malloc(0) for zero length passwords [25]
+ o url: remove faulty arg value check from CURLOPT_SSH_AUTH_TYPES [26]
+ o HTTP: support multiple Content-Encodings [27]
+ o travis: add a job with brotli enabled
+ o url: remove unncessary NULL-check
+ o fnmatch: remove dead code
+ o connect: store IPv6 connection status after valid connection [29]
+ o imap: deal with commands case insensitively [30]
+ o --interface: add support for Linux VRF [32]
+ o content_encoding: fix inflate_stream for no bytes available [33]
+ o cmake: Correctly include curl.rc in Windows builds [34]
+ o cmake: Add missing setmode check [35]
+ o connect.c: remove executable bit on file [36]
+ o SMB: fix uninitialized local variable
+ o zlib/brotli: only include header files in modules needing them [37]
+ o URL: return error on malformed URLs with junk after IPv6 bracket [38]
+ o openssl: fix too broad use of HAVE_OPAQUE_EVP_PKEY [39]
+ o macOS: Fix missing connectx function with Xcode version older than 9.0 [40]
+ o --resolve: allow IP address within [] brackets [41]
+ o examples/curlx: Fix code style [42]
+ o ntlm: remove unnecessary NULL-check to please scan-build [43]
+ o Curl_llist_remove: fix potential NULL pointer deref [43]
+ o mime: fix "Value stored to 'sz' is never read" scan-build error [43]
+ o openssl: fix "Value stored to 'rc' is never read" scan-build error [43]
+ o http2: fix "Value stored to 'hdbuf' is never read" scan-build error [43]
+ o http2: fix "Value stored to 'end' is never read" scan-build error [43]
+ o Curl_open: fix OOM return error correctly [43]
+ o url: reject ASCII control characters and space in host names [44]
+ o examples/rtsp: clear RANGE again after use [45]
+ o connect: improve the bind error message [46]
+ o make: fix "make distclean" [50]
+ o connect: add support for new TCP Fast Open API on Linux [51]
+ o metalink: fix memory-leak and NULL pointer dereference [52]
+ o URL: update "file:" URL handling [53]
+ o ssh: remove check for a NULL pointer [54]
+ o global_init: ignore CURL_GLOBAL_SSL's absense [55]
This release includes the following known bugs:
@@ -43,36 +91,73 @@ This release includes the following known bugs:
This release would not have looked like this without help, code, reports and
advice from friends like these:
- Adam Sampson, Alessandro Ghedini, Alex Potapenko, Bernard Spil,
- Christian Weisgerber, Dagobert Michelsen, Dan Fandrich, Daniel Krügler,
- Daniel Stenberg, David Benjamin, David Lord, Even Rouault, Han Qiao,
- Isaac Boukris, James Slaughter, Marcel Raad, paulharris on github,
- Ray Satiro, Salah-Eddin Shaban, Sergei Nikulov, Simon Warta,
- Thomas Petazzoni,
- (22 contributors)
+ Alessandro Ghedini, Alex Malinovich, Alex Nichols, Alfonso Martone,
+ Andrew Lambert, arainchik on github, Brian Carpenter, cbartl on github,
+ Dan Fandrich, Daniel Bankhead, Daniel Stenberg, Dirk Feytons,
+ Dmitri Tikhonov, Evgeny Grin, Gisle Vanem, hsiao yi, Jakub Zakrzewski,
+ John Starks, Juro Bystricky, Kamil Dudka, Luca Boccassi, Marcel Raad,
+ Martin Storsjö, Matthew Kerwin, Max Dymond, Michael Felt, Michael Kaufmann,
+ moohoorama on github, omau on github, Orgad Shaneh, Patrick Monnerat,
+ Paul Howarth, Pavel Gushchin, Pavol Markovic, Per Lundberg, Peter Piekarski,
+ Petr Voytsik, Ray Satiro, Rob Cotrone, Viktor Szakáts, youngchopin on github,
+ (41 contributors)
Thanks! (and sorry if I forgot to mention someone)
References to bug reports and discussions on issues:
- [1] = https://curl.haxx.se/bug/?i=1750
- [2] = https://curl.haxx.se/bug/?i=1744
- [3] = https://curl.haxx.se/bug/?i=1742
- [4] = https://curl.haxx.se/bug/?i=1746
- [5] = https://curl.haxx.se/bug/?i=1746
- [6] = https://curl.haxx.se/bug/?i=1753
- [7] = https://curl.haxx.se/bug/?i=1755
- [8] = https://curl.haxx.se/bug/?i=1647
- [9] = https://curl.haxx.se/bug/?i=1743
- [10] = https://curl.haxx.se/mail/lib-2017-08/0050.html
- [11] = https://curl.haxx.se/bug/?i=1759
- [12] = https://curl.haxx.se/bug/?i=1761
- [13] = https://curl.haxx.se/bug/?i=1766
- [14] = https://curl.haxx.se/bug/?i=1770
- [15] = https://curl.haxx.se/bug/?i=1752
- [16] = https://curl.haxx.se/bug/?i=1769
- [17] = https://curl.haxx.se/bug/?i=1763
- [18] = https://curl.haxx.se/bug/?i=1762
- [19] = https://curl.haxx.se/bug/?i=1774
- [20] = https://curl.haxx.se/bug/?i=1764
- [21] = https://curl.haxx.se/bug/?i=1719
+ [1] = https://curl.haxx.se/bug/?i=2008
+ [2] = https://curl.haxx.se/bug/?i=2006
+ [3] = https://curl.haxx.se/bug/?i=2004
+ [4] = https://curl.haxx.se/bug/?i=2013
+ [5] = https://curl.haxx.se/bug/?i=1982
+ [6] = https://curl.haxx.se/bug/?i=2016
+ [7] = https://curl.haxx.se/bug/?i=2015
+ [8] = https://curl.haxx.se/bug/?i=2001
+ [9] = https://curl.haxx.se/bug/?i=2025
+ [10] = https://curl.haxx.se/bug/?i=2023
+ [11] = https://curl.haxx.se/bug/?i=2021
+ [12] = https://curl.haxx.se/bug/?i=1934
+ [13] = https://curl.haxx.se/bug/?i=1879
+ [14] = https://curl.haxx.se/bug/?i=2022
+ [15] = https://curl.haxx.se/bug/?i=2033
+ [16] = https://curl.haxx.se/bug/?i=2034
+ [17] = https://curl.haxx.se/bug/?i=2026
+ [18] = https://curl.haxx.se/bug/?i=2031
+ [19] = https://curl.haxx.se/bug/?i=2032
+ [20] = https://curl.haxx.se/mail/lib-2017-11/0000.html
+ [21] = https://curl.haxx.se/bug/?i=2038
+ [22] = https://curl.haxx.se/bug/?i=2047
+ [23] = https://curl.haxx.se/bug/?i=2044
+ [24] = https://curl.haxx.se/bug/?i=1959
+ [25] = https://curl.haxx.se/bug/?i=2054
+ [26] = https://github.com/curl/curl/commit/f121575#commitcomment-25347120
+ [27] = https://curl.haxx.se/bug/?i=2002
+ [28] = https://curl.haxx.se/bug/?i=2045
+ [29] = https://curl.haxx.se/bug/?i=2053
+ [30] = https://curl.haxx.se/bug/?i=2061
+ [31] = https://curl.haxx.se/bug/?i=2043
+ [32] = https://curl.haxx.se/bug/?i=2024
+ [33] = https://curl.haxx.se/bug/?i=2060
+ [34] = https://curl.haxx.se/bug/?i=2064
+ [35] = https://curl.haxx.se/bug/?i=2067
+ [36] = https://curl.haxx.se/bug/?i=2071
+ [37] = https://curl.haxx.se/mail/lib-2017-11/0032.html
+ [38] = https://curl.haxx.se/bug/?i=2072
+ [39] = https://curl.haxx.se/bug/?i=2079
+ [40] = https://curl.haxx.se/bug/?i=2080
+ [41] = https://curl.haxx.se/bug/?i=2087
+ [42] = https://curl.haxx.se/bug/?i=2096
+ [43] = https://curl.haxx.se/bug/?i=2098
+ [44] = https://curl.haxx.se/bug/?i=2073
+ [45] = https://curl.haxx.se/bug/?i=2106
+ [46] = https://curl.haxx.se/bug/?i=2104
+ [47] = https://curl.haxx.se/docs/adv_2017-11e7.html
+ [48] = https://curl.haxx.se/docs/adv_2017-ae72.html
+ [49] = https://curl.haxx.se/docs/adv_2017-af0a.html
+ [50] = https://curl.haxx.se/bug/?i=2097
+ [51] = https://curl.haxx.se/bug/?i=2056
+ [52] = https://curl.haxx.se/bug/?i=2109
+ [53] = https://curl.haxx.se/bug/?i=2110
+ [54] = https://curl.haxx.se/bug/?i=2111
+ [55] = https://curl.haxx.se/bug/?i=2083
diff --git a/acinclude.m4 b/acinclude.m4
index 5393228..69bb6c0 100644..100755
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -2084,20 +2084,6 @@ _EOF
])
-dnl CURL_CONFIGURE_LONG
-dnl -------------------------------------------------
-dnl Find out the size of long as reported by sizeof() and define
-dnl CURL_SIZEOF_LONG.
-
-AC_DEFUN([CURL_CONFIGURE_LONG], [
- if test -z "$ac_cv_sizeof_long" ||
- test "$ac_cv_sizeof_long" -eq "0"; then
- AC_MSG_ERROR([cannot find out size of long.])
- fi
- CURL_DEFINE_UNQUOTED([CURL_SIZEOF_LONG], [$ac_cv_sizeof_long])
-])
-
-
dnl CURL_CONFIGURE_CURL_SOCKLEN_T
dnl -------------------------------------------------
dnl The need for the curl_socklen_t definition arises mainly to properly
@@ -2718,291 +2704,6 @@ AC_HELP_STRING([--without-ca-fallback], [Don't use the built in CA store of the
fi
])
-
-dnl DO_CURL_OFF_T_CHECK (TYPE, SIZE)
-dnl -------------------------------------------------
-dnl Internal macro for CURL_CONFIGURE_CURL_OFF_T
-
-AC_DEFUN([DO_CURL_OFF_T_CHECK], [
- AC_REQUIRE([CURL_INCLUDES_INTTYPES])dnl
- if test "$curl_typeof_curl_off_t" = "unknown" && test ! -z "$1"; then
- tmp_includes=""
- tmp_source=""
- tmp_fmt=""
- case XC_SH_TR_SH([$1]) in
- int64_t)
- tmp_includes="$curl_includes_inttypes"
- tmp_source="char f@<:@@:>@ = PRId64;"
- tmp_fmt="PRId64"
- ;;
- int32_t)
- tmp_includes="$curl_includes_inttypes"
- tmp_source="char f@<:@@:>@ = PRId32;"
- tmp_fmt="PRId32"
- ;;
- int16_t)
- tmp_includes="$curl_includes_inttypes"
- tmp_source="char f@<:@@:>@ = PRId16;"
- tmp_fmt="PRId16"
- ;;
- esac
- AC_COMPILE_IFELSE([
- AC_LANG_PROGRAM([[
- $tmp_includes
- typedef $1 curl_off_t;
- typedef char dummy_arr[sizeof(curl_off_t) == $2 ? 1 : -1];
- ]],[[
- $tmp_source
- curl_off_t dummy;
- ]])
- ],[
- if test -z "$tmp_fmt"; then
- curl_typeof_curl_off_t="$1"
- curl_sizeof_curl_off_t="$2"
- else
- CURL_CHECK_DEF([$tmp_fmt], [$curl_includes_inttypes], [silent])
- AS_VAR_PUSHDEF([tmp_HaveFmtDef], [curl_cv_have_def_$tmp_fmt])dnl
- AS_VAR_PUSHDEF([tmp_FmtDef], [curl_cv_def_$tmp_fmt])dnl
- if test AS_VAR_GET(tmp_HaveFmtDef) = "yes"; then
- curl_format_curl_off_t=AS_VAR_GET(tmp_FmtDef)
- curl_typeof_curl_off_t="$1"
- curl_sizeof_curl_off_t="$2"
- fi
- AS_VAR_POPDEF([tmp_FmtDef])dnl
- AS_VAR_POPDEF([tmp_HaveFmtDef])dnl
- fi
- ])
- fi
-])
-
-
-dnl DO_CURL_OFF_T_SUFFIX_CHECK (TYPE)
-dnl -------------------------------------------------
-dnl Internal macro for CURL_CONFIGURE_CURL_OFF_T
-
-AC_DEFUN([DO_CURL_OFF_T_SUFFIX_CHECK], [
- AC_REQUIRE([CURL_INCLUDES_INTTYPES])dnl
- AC_MSG_CHECKING([constant suffix string for curl_off_t])
- #
- curl_suffix_curl_off_t="unknown"
- curl_suffix_curl_off_tu="unknown"
- #
- case XC_SH_TR_SH([$1]) in
- long_long | __longlong | __longlong_t)
- tst_suffixes="LL::"
- ;;
- long)
- tst_suffixes="L::"
- ;;
- int)
- tst_suffixes="::"
- ;;
- __int64 | int64_t)
- tst_suffixes="LL:i64::"
- ;;
- __int32 | int32_t)
- tst_suffixes="L:i32::"
- ;;
- __int16 | int16_t)
- tst_suffixes="L:i16::"
- ;;
- *)
- AC_MSG_ERROR([unexpected data type $1])
- ;;
- esac
- #
- old_IFS=$IFS; IFS=':'
- for tmp_ssuf in $tst_suffixes ; do
- IFS=$old_IFS
- if test "x$curl_suffix_curl_off_t" = "xunknown"; then
- case $tmp_ssuf in
- i64 | i32 | i16)
- tmp_usuf="u$tmp_ssuf"
- ;;
- LL | L)
- tmp_usuf="U$tmp_ssuf"
- ;;
- *)
- tmp_usuf=""
- ;;
- esac
- AC_COMPILE_IFELSE([
- AC_LANG_PROGRAM([[
- $curl_includes_inttypes
- typedef $1 new_t;
- ]],[[
- new_t s1;
- new_t s2;
- s1 = -10$tmp_ssuf ;
- s2 = 20$tmp_ssuf ;
- if(s1 > s2)
- return 1;
- ]])
- ],[
- curl_suffix_curl_off_t="$tmp_ssuf"
- curl_suffix_curl_off_tu="$tmp_usuf"
- ])
- fi
- done
- IFS=$old_IFS
- #
- if test "x$curl_suffix_curl_off_t" = "xunknown"; then
- AC_MSG_ERROR([cannot find constant suffix string for curl_off_t.])
- else
- AC_MSG_RESULT([$curl_suffix_curl_off_t])
- AC_MSG_CHECKING([constant suffix string for unsigned curl_off_t])
- AC_MSG_RESULT([$curl_suffix_curl_off_tu])
- fi
- #
-])
-
-
-dnl CURL_CONFIGURE_CURL_OFF_T
-dnl -------------------------------------------------
-dnl Find out suitable curl_off_t data type definition and associated
-dnl items
-
-AC_DEFUN([CURL_CONFIGURE_CURL_OFF_T], [
- AC_REQUIRE([CURL_INCLUDES_INTTYPES])dnl
- #
- AC_BEFORE([$0],[AC_SYS_LARGEFILE])dnl
- AC_BEFORE([$0],[CURL_CONFIGURE_REENTRANT])dnl
- AC_BEFORE([$0],[CURL_CHECK_AIX_ALL_SOURCE])dnl
- #
- if test -z "$SED"; then
- AC_MSG_ERROR([SED not set. Cannot continue without SED being set.])
- fi
- #
- AC_CHECK_SIZEOF(long)
- AC_CHECK_SIZEOF(void*)
- #
- if test -z "$ac_cv_sizeof_long" ||
- test "$ac_cv_sizeof_long" -eq "0"; then
- AC_MSG_ERROR([cannot find out size of long.])
- fi
- if test -z "$ac_cv_sizeof_voidp" ||
- test "$ac_cv_sizeof_voidp" -eq "0"; then
- AC_MSG_ERROR([cannot find out size of void*.])
- fi
- #
- x_LP64_long=""
- x_LP32_long=""
- #
- if test "$ac_cv_sizeof_long" -eq "8" &&
- test "$ac_cv_sizeof_voidp" -ge "8"; then
- x_LP64_long="long"
- elif test "$ac_cv_sizeof_long" -eq "4" &&
- test "$ac_cv_sizeof_voidp" -ge "4"; then
- x_LP32_long="long"
- fi
- #
- dnl DO_CURL_OFF_T_CHECK results are stored in next 3 vars
- #
- curl_typeof_curl_off_t="unknown"
- curl_sizeof_curl_off_t="unknown"
- curl_format_curl_off_t="unknown"
- curl_format_curl_off_tu="unknown"
- #
- if test "$curl_typeof_curl_off_t" = "unknown"; then
- AC_MSG_CHECKING([for 64-bit curl_off_t data type])
- for t8 in \
- "$x_LP64_long" \
- 'int64_t' \
- '__int64' \
- 'long long' \
- '__longlong' \
- '__longlong_t' ; do
- DO_CURL_OFF_T_CHECK([$t8], [8])
- done
- AC_MSG_RESULT([$curl_typeof_curl_off_t])
- fi
- if test "$curl_typeof_curl_off_t" = "unknown"; then
- AC_MSG_CHECKING([for 32-bit curl_off_t data type])
- for t4 in \
- "$x_LP32_long" \
- 'int32_t' \
- '__int32' \
- 'int' ; do
- DO_CURL_OFF_T_CHECK([$t4], [4])
- done
- AC_MSG_RESULT([$curl_typeof_curl_off_t])
- fi
- if test "$curl_typeof_curl_off_t" = "unknown"; then
- AC_MSG_ERROR([cannot find data type for curl_off_t.])
- fi
- #
- AC_MSG_CHECKING([size of curl_off_t])
- AC_MSG_RESULT([$curl_sizeof_curl_off_t])
- #
- AC_MSG_CHECKING([formatting string directive for curl_off_t])
- if test "$curl_format_curl_off_t" != "unknown"; then
- x_pull_headers="yes"
- curl_format_curl_off_t=`echo "$curl_format_curl_off_t" | "$SED" 's/[["]]//g'`
- curl_format_curl_off_tu=`echo "$curl_format_curl_off_t" | "$SED" 's/i$/u/'`
- curl_format_curl_off_tu=`echo "$curl_format_curl_off_tu" | "$SED" 's/d$/u/'`
- curl_format_curl_off_tu=`echo "$curl_format_curl_off_tu" | "$SED" 's/D$/U/'`
- else
- x_pull_headers="no"
- case XC_SH_TR_SH([$curl_typeof_curl_off_t]) in
- long_long | __longlong | __longlong_t)
- curl_format_curl_off_t="lld"
- curl_format_curl_off_tu="llu"
- ;;
- long)
- curl_format_curl_off_t="ld"
- curl_format_curl_off_tu="lu"
- ;;
- int)
- curl_format_curl_off_t="d"
- curl_format_curl_off_tu="u"
- ;;
- __int64)
- curl_format_curl_off_t="I64d"
- curl_format_curl_off_tu="I64u"
- ;;
- __int32)
- curl_format_curl_off_t="I32d"
- curl_format_curl_off_tu="I32u"
- ;;
- __int16)
- curl_format_curl_off_t="I16d"
- curl_format_curl_off_tu="I16u"
- ;;
- *)
- AC_MSG_ERROR([cannot find print format string for curl_off_t.])
- ;;
- esac
- fi
- AC_MSG_RESULT(["$curl_format_curl_off_t"])
- #
- AC_MSG_CHECKING([formatting string directive for unsigned curl_off_t])
- AC_MSG_RESULT(["$curl_format_curl_off_tu"])
- #
- DO_CURL_OFF_T_SUFFIX_CHECK([$curl_typeof_curl_off_t])
- #
- if test "$x_pull_headers" = "yes"; then
- if test "x$ac_cv_header_sys_types_h" = "xyes"; then
- CURL_DEFINE_UNQUOTED([CURL_PULL_SYS_TYPES_H])
- fi
- if test "x$ac_cv_header_stdint_h" = "xyes"; then
- CURL_DEFINE_UNQUOTED([CURL_PULL_STDINT_H])
- fi
- if test "x$ac_cv_header_inttypes_h" = "xyes"; then
- CURL_DEFINE_UNQUOTED([CURL_PULL_INTTYPES_H])
- fi
- fi
- #
- CURL_DEFINE_UNQUOTED([CURL_TYPEOF_CURL_OFF_T], [$curl_typeof_curl_off_t])
- CURL_DEFINE_UNQUOTED([CURL_FORMAT_CURL_OFF_T], ["$curl_format_curl_off_t"])
- CURL_DEFINE_UNQUOTED([CURL_FORMAT_CURL_OFF_TU], ["$curl_format_curl_off_tu"])
- CURL_DEFINE_UNQUOTED([CURL_FORMAT_OFF_T], ["%$curl_format_curl_off_t"])
- CURL_DEFINE_UNQUOTED([CURL_SIZEOF_CURL_OFF_T], [$curl_sizeof_curl_off_t])
- CURL_DEFINE_UNQUOTED([CURL_SUFFIX_CURL_OFF_T], [$curl_suffix_curl_off_t])
- CURL_DEFINE_UNQUOTED([CURL_SUFFIX_CURL_OFF_TU], [$curl_suffix_curl_off_tu])
- #
-])
-
-
dnl CURL_CHECK_WIN32_LARGEFILE
dnl -------------------------------------------------
dnl Check if curl's WIN32 large file will be used
@@ -3243,3 +2944,29 @@ AC_DEFUN([CURL_MAC_CFLAGS], [
fi
])
+
+
+dnl CURL_SUPPORTS_BUILTIN_AVAILABLE
+dnl
+dnl Check to see if the compiler supports __builtin_available. This built-in
+dnl compiler function first appeared in Apple LLVM 9.0.0. It's so new that, at
+dnl the time this macro was written, the function was not yet documented. Its
+dnl purpose is to return true if the code is running under a certain OS version
+dnl or later.
+
+AC_DEFUN([CURL_SUPPORTS_BUILTIN_AVAILABLE], [
+ AC_MSG_CHECKING([to see if the compiler supports __builtin_available()])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+#include <stdlib.h>
+ ]],[[
+ if (__builtin_available(macOS 10.8, iOS 5.0, *)) {}
+ ]])
+ ],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE_UNQUOTED(HAVE_BUILTIN_AVAILABLE, 1,
+ [Define to 1 if you have the __builtin_available function.])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+])
diff --git a/configure b/configure
index e1ca812..8916fad 100755
--- a/configure
+++ b/configure
@@ -885,8 +885,6 @@ BLANK_AT_MAKETIME
CURL_NETWORK_AND_TIME_LIBS
CURL_NETWORK_LIBS
LIBCURL_LIBS
-SONAME_BUMP_FALSE
-SONAME_BUMP_TRUE
CFLAG_CURL_SYMBOL_HIDING
DOING_CURL_SYMBOL_HIDING_FALSE
DOING_CURL_SYMBOL_HIDING_TRUE
@@ -917,6 +915,7 @@ LIBMETALINK_LIBS
USE_LIBPSL_FALSE
USE_LIBPSL_TRUE
CURL_CA_BUNDLE
+CURL_WITH_MULTI_SSL
SSL_ENABLED
USE_AXTLS
NSS_LIBS
@@ -933,7 +932,11 @@ SSL_LIBS
USE_DARWINSSL
USE_WINDOWS_SSPI
USE_SCHANNEL
+DEFAULT_SSL_BACKEND
+BUILD_STUB_GSS_FALSE
+BUILD_STUB_GSS_TRUE
USE_OPENLDAP
+HAVE_BROTLI
ZLIB_LIBS
HAVE_LIBZ_FALSE
HAVE_LIBZ_TRUE
@@ -1156,12 +1159,14 @@ enable_manual
enable_libcurl_option
enable_libgcc
with_zlib
+with_brotli
with_ldap_lib
with_lber_lib
enable_ipv6
with_gssapi_includes
with_gssapi_libs
with_gssapi
+with_default_ssl_backend
with_winssl
with_darwinssl
with_ssl
@@ -1194,7 +1199,6 @@ enable_ntlm_wb
enable_tls_srp
enable_unix_sockets
enable_cookies
-enable_soname_bump
'
ac_precious_vars='build_alias
host_alias
@@ -1934,8 +1938,6 @@ Optional Features:
--disable-unix-sockets Disable Unix domain sockets
--enable-cookies Enable cookies support
--disable-cookies Disable cookies support
- --enable-soname-bump Enable enforced SONAME bump
- --disable-soname-bump Disable enforced SONAME bump
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -1951,12 +1953,20 @@ Optional Packages:
compiler's sysroot if not specified).
--with-zlib=PATH search for zlib in PATH
--without-zlib disable use of zlib
+ --with-brotli=PATH Where to look for brotli, PATH points to the BROTLI
+ installation; when possible, set the PKG_CONFIG_PATH
+ environment variable instead of using this option
+ --without-brotli disable BROTLI
--with-ldap-lib=libname Specify name of ldap lib file
--with-lber-lib=libname Specify name of lber lib file
--with-gssapi-includes=DIR
Specify location of GSS-API headers
--with-gssapi-libs=DIR Specify location of GSS-API libs
--with-gssapi=DIR Where to look for GSS-API
+ --with-default-ssl-backend=NAME
+ Use NAME as default SSL backend
+ --without-default-ssl-backend
+ Use implicit default SSL backend
--with-winssl enable Windows native SSL/TLS
--without-winssl disable Windows native SSL/TLS
--with-darwinssl enable Apple OS native SSL/TLS
@@ -2195,6 +2205,52 @@ fi
} # ac_fn_c_try_cpp
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
@@ -2268,6 +2324,148 @@ fi
} # ac_fn_c_try_run
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define $2 innocuous_$2
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+#undef $2
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int main (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ----------------------------------------------------------------------- ##
+## Report this to a suitable curl mailing list: https://curl.haxx.se/mail/ ##
+## ----------------------------------------------------------------------- ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
@@ -2445,194 +2643,6 @@ rm -f conftest.val
} # ac_fn_c_compute_int
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- test -x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-#define $2 innocuous_$2
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-#undef $2
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int main (void)
-{
-return $2 ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_func
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ----------------------------------------------------------------------- ##
-## Report this to a suitable curl mailing list: https://curl.haxx.se/mail/ ##
-## ----------------------------------------------------------------------- ##"
- ) | sed "s/^/$as_me: WARNING: /" >&2
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
@@ -6087,6 +6097,7 @@ PKGADD_VENDOR="curl.haxx.se"
curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl,mbedtls,cyassl,axtls,winssl,darwinssl} )"
curl_ssh_msg="no (--with-libssh2)"
curl_zlib_msg="no (--with-zlib)"
+ curl_brotli_msg="no (--with-brotli)"
curl_gss_msg="no (--with-gssapi)"
curl_tls_srp_msg="no (--enable-tls-srp)"
curl_res_msg="default (--enable-ares / --enable-threaded-resolver)"
@@ -6104,7 +6115,7 @@ curl_verbose_msg="enabled (--disable-verbose)"
curl_mtlnk_msg="no (--with-libmetalink)"
curl_psl_msg="no (--with-libpsl)"
- init_ssl_msg=${curl_ssl_msg}
+ ssl_backends=
INITIAL_LDFLAGS=$LDFLAGS
INITIAL_LIBS=$LIBS
@@ -6190,39 +6201,6 @@ _ACEOF
-curl_includes_inttypes="\
-/* includes start */
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-/* includes end */"
- case $host_os in
- irix*)
- ac_cv_header_stdint_h="no"
- ;;
- esac
- for ac_header in sys/types.h stdint.h inttypes.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$curl_includes_inttypes
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
if ${ac_cv_path_GREP+:} false; then :
@@ -6353,742 +6331,6 @@ $as_echo "$ac_cv_path_EGREP" >&6; }
EGREP="$ac_cv_path_EGREP"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int main (void)
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if cpp -P is needed" >&5
-$as_echo_n "checking if cpp -P is needed... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #include <errno.h>
-TEST EINVAL TEST
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "TEST.*TEST" >/dev/null 2>&1; then :
- cpp=no
-else
- cpp=yes
-fi
-rm -f conftest*
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cpp" >&5
-$as_echo "$cpp" >&6; }
-
- if test "x$cpp" = "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if cpp -P works" >&5
-$as_echo_n "checking if cpp -P works... " >&6; }
- OLDCPPFLAGS=$CPPFLAGS
- CPPFLAGS="$CPPFLAGS -P"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #include <errno.h>
-TEST EINVAL TEST
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "TEST.*TEST" >/dev/null 2>&1; then :
- cpp_p=yes
-else
- cpp_p=no
-fi
-rm -f conftest*
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cpp_p" >&5
-$as_echo "$cpp_p" >&6; }
-
- if test "x$cpp_p" = "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: failed to figure out cpp -P alternative" >&5
-$as_echo "$as_me: WARNING: failed to figure out cpp -P alternative" >&2;}
- # without -P
- CPPPFLAG=""
- else
- # with -P
- CPPPFLAG="-P"
- fi
- CPPFLAGS=$OLDCPPFLAGS
- else
- # without -P
- CPPPFLAG=""
- fi
-
-
- #
- #
- if test -z "$SED"; then
- as_fn_error $? "SED not set. Cannot continue without SED being set." "$LINENO" 5
- fi
- #
- # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
-$as_echo_n "checking size of long... " >&6; }
-if ${ac_cv_sizeof_long+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then :
-
-else
- if test "$ac_cv_type_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (long)
-See \`config.log' for more details" "$LINENO" 5; }
- else
- ac_cv_sizeof_long=0
- fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
-$as_echo "$ac_cv_sizeof_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
-_ACEOF
-
-
- # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5
-$as_echo_n "checking size of void*... " >&6; }
-if ${ac_cv_sizeof_voidp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then :
-
-else
- if test "$ac_cv_type_voidp" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (void*)
-See \`config.log' for more details" "$LINENO" 5; }
- else
- ac_cv_sizeof_voidp=0
- fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5
-$as_echo "$ac_cv_sizeof_voidp" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOIDP $ac_cv_sizeof_voidp
-_ACEOF
-
-
- #
- if test -z "$ac_cv_sizeof_long" ||
- test "$ac_cv_sizeof_long" -eq "0"; then
- as_fn_error $? "cannot find out size of long." "$LINENO" 5
- fi
- if test -z "$ac_cv_sizeof_voidp" ||
- test "$ac_cv_sizeof_voidp" -eq "0"; then
- as_fn_error $? "cannot find out size of void*." "$LINENO" 5
- fi
- #
- x_LP64_long=""
- x_LP32_long=""
- #
- if test "$ac_cv_sizeof_long" -eq "8" &&
- test "$ac_cv_sizeof_voidp" -ge "8"; then
- x_LP64_long="long"
- elif test "$ac_cv_sizeof_long" -eq "4" &&
- test "$ac_cv_sizeof_voidp" -ge "4"; then
- x_LP32_long="long"
- fi
- #
- #
- curl_typeof_curl_off_t="unknown"
- curl_sizeof_curl_off_t="unknown"
- curl_format_curl_off_t="unknown"
- curl_format_curl_off_tu="unknown"
- #
- if test "$curl_typeof_curl_off_t" = "unknown"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit curl_off_t data type" >&5
-$as_echo_n "checking for 64-bit curl_off_t data type... " >&6; }
- for t8 in \
- "$x_LP64_long" \
- 'int64_t' \
- '__int64' \
- 'long long' \
- '__longlong' \
- '__longlong_t' ; do
-
- if test "$curl_typeof_curl_off_t" = "unknown" && test ! -z "$t8"; then
- tmp_includes=""
- tmp_source=""
- tmp_fmt=""
- case `echo "$t8" | sed 's/[^a-zA-Z0-9_]/_/g'` in
- int64_t)
- tmp_includes="$curl_includes_inttypes"
- tmp_source="char f[] = PRId64;"
- tmp_fmt="PRId64"
- ;;
- int32_t)
- tmp_includes="$curl_includes_inttypes"
- tmp_source="char f[] = PRId32;"
- tmp_fmt="PRId32"
- ;;
- int16_t)
- tmp_includes="$curl_includes_inttypes"
- tmp_source="char f[] = PRId16;"
- tmp_fmt="PRId16"
- ;;
- esac
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
- $tmp_includes
- typedef $t8 curl_off_t;
- typedef char dummy_arr[sizeof(curl_off_t) == 8 ? 1 : -1];
-
-int main (void)
-{
-
- $tmp_source
- curl_off_t dummy;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
- if test -z "$tmp_fmt"; then
- curl_typeof_curl_off_t="$t8"
- curl_sizeof_curl_off_t="8"
- else
-
- OLDCPPFLAGS=$CPPFLAGS
- # CPPPFLAG comes from CURL_CPP_P
- CPPFLAGS="$CPPFLAGS $CPPPFLAG"
- as_ac_HaveDef=`$as_echo "curl_cv_have_def_$tmp_fmt" | $as_tr_sh`
- as_ac_Def=`$as_echo "curl_cv_def_$tmp_fmt" | $as_tr_sh`
- if test -z "$SED"; then
- as_fn_error $? "SED not set. Cannot continue without SED being set." "$LINENO" 5
- fi
- if test -z "$GREP"; then
- as_fn_error $? "GREP not set. Cannot continue without GREP being set." "$LINENO" 5
- fi
-
- tmp_exp=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- $curl_includes_inttypes
-#ifdef $tmp_fmt
-CURL_DEF_TOKEN $tmp_fmt
-#endif
-
-
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
- tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
- "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
- "$SED" 's/.*CURL_DEF_TOKEN[ ][ ]*//' 2>/dev/null | \
- "$SED" 's/["][ ]*["]//g' 2>/dev/null`
- if test -z "$tmp_exp" || test "$tmp_exp" = "$tmp_fmt"; then
- tmp_exp=""
- fi
-
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
- if test -z "$tmp_exp"; then
- eval "$as_ac_HaveDef=no"
-
- else
- eval "$as_ac_HaveDef=yes"
- eval "$as_ac_Def=\$tmp_exp"
-
- fi
- CPPFLAGS=$OLDCPPFLAGS
-
- as_tmp_HaveFmtDef=`$as_echo "curl_cv_have_def_$tmp_fmt" | $as_tr_sh`
- as_tmp_FmtDef=`$as_echo "curl_cv_def_$tmp_fmt" | $as_tr_sh`
- if test `eval 'as_val=${'$as_tmp_HaveFmtDef'};$as_echo "$as_val"'` = "yes"; then
- curl_format_curl_off_t=`eval 'as_val=${'$as_tmp_FmtDef'};$as_echo "$as_val"'`
- curl_typeof_curl_off_t="$t8"
- curl_sizeof_curl_off_t="8"
- fi
- fi
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
-
- done
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $curl_typeof_curl_off_t" >&5
-$as_echo "$curl_typeof_curl_off_t" >&6; }
- fi
- if test "$curl_typeof_curl_off_t" = "unknown"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit curl_off_t data type" >&5
-$as_echo_n "checking for 32-bit curl_off_t data type... " >&6; }
- for t4 in \
- "$x_LP32_long" \
- 'int32_t' \
- '__int32' \
- 'int' ; do
-
- if test "$curl_typeof_curl_off_t" = "unknown" && test ! -z "$t4"; then
- tmp_includes=""
- tmp_source=""
- tmp_fmt=""
- case `echo "$t4" | sed 's/[^a-zA-Z0-9_]/_/g'` in
- int64_t)
- tmp_includes="$curl_includes_inttypes"
- tmp_source="char f[] = PRId64;"
- tmp_fmt="PRId64"
- ;;
- int32_t)
- tmp_includes="$curl_includes_inttypes"
- tmp_source="char f[] = PRId32;"
- tmp_fmt="PRId32"
- ;;
- int16_t)
- tmp_includes="$curl_includes_inttypes"
- tmp_source="char f[] = PRId16;"
- tmp_fmt="PRId16"
- ;;
- esac
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
- $tmp_includes
- typedef $t4 curl_off_t;
- typedef char dummy_arr[sizeof(curl_off_t) == 4 ? 1 : -1];
-
-int main (void)
-{
-
- $tmp_source
- curl_off_t dummy;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
- if test -z "$tmp_fmt"; then
- curl_typeof_curl_off_t="$t4"
- curl_sizeof_curl_off_t="4"
- else
-
- OLDCPPFLAGS=$CPPFLAGS
- # CPPPFLAG comes from CURL_CPP_P
- CPPFLAGS="$CPPFLAGS $CPPPFLAG"
- as_ac_HaveDef=`$as_echo "curl_cv_have_def_$tmp_fmt" | $as_tr_sh`
- as_ac_Def=`$as_echo "curl_cv_def_$tmp_fmt" | $as_tr_sh`
- if test -z "$SED"; then
- as_fn_error $? "SED not set. Cannot continue without SED being set." "$LINENO" 5
- fi
- if test -z "$GREP"; then
- as_fn_error $? "GREP not set. Cannot continue without GREP being set." "$LINENO" 5
- fi
-
- tmp_exp=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- $curl_includes_inttypes
-#ifdef $tmp_fmt
-CURL_DEF_TOKEN $tmp_fmt
-#endif
-
-
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
- tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
- "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
- "$SED" 's/.*CURL_DEF_TOKEN[ ][ ]*//' 2>/dev/null | \
- "$SED" 's/["][ ]*["]//g' 2>/dev/null`
- if test -z "$tmp_exp" || test "$tmp_exp" = "$tmp_fmt"; then
- tmp_exp=""
- fi
-
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
- if test -z "$tmp_exp"; then
- eval "$as_ac_HaveDef=no"
-
- else
- eval "$as_ac_HaveDef=yes"
- eval "$as_ac_Def=\$tmp_exp"
-
- fi
- CPPFLAGS=$OLDCPPFLAGS
-
- as_tmp_HaveFmtDef=`$as_echo "curl_cv_have_def_$tmp_fmt" | $as_tr_sh`
- as_tmp_FmtDef=`$as_echo "curl_cv_def_$tmp_fmt" | $as_tr_sh`
- if test `eval 'as_val=${'$as_tmp_HaveFmtDef'};$as_echo "$as_val"'` = "yes"; then
- curl_format_curl_off_t=`eval 'as_val=${'$as_tmp_FmtDef'};$as_echo "$as_val"'`
- curl_typeof_curl_off_t="$t4"
- curl_sizeof_curl_off_t="4"
- fi
- fi
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
-
- done
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $curl_typeof_curl_off_t" >&5
-$as_echo "$curl_typeof_curl_off_t" >&6; }
- fi
- if test "$curl_typeof_curl_off_t" = "unknown"; then
- as_fn_error $? "cannot find data type for curl_off_t." "$LINENO" 5
- fi
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of curl_off_t" >&5
-$as_echo_n "checking size of curl_off_t... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $curl_sizeof_curl_off_t" >&5
-$as_echo "$curl_sizeof_curl_off_t" >&6; }
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking formatting string directive for curl_off_t" >&5
-$as_echo_n "checking formatting string directive for curl_off_t... " >&6; }
- if test "$curl_format_curl_off_t" != "unknown"; then
- x_pull_headers="yes"
- curl_format_curl_off_t=`echo "$curl_format_curl_off_t" | "$SED" 's/["]//g'`
- curl_format_curl_off_tu=`echo "$curl_format_curl_off_t" | "$SED" 's/i$/u/'`
- curl_format_curl_off_tu=`echo "$curl_format_curl_off_tu" | "$SED" 's/d$/u/'`
- curl_format_curl_off_tu=`echo "$curl_format_curl_off_tu" | "$SED" 's/D$/U/'`
- else
- x_pull_headers="no"
- case `echo "$curl_typeof_curl_off_t" | sed 's/[^a-zA-Z0-9_]/_/g'` in
- long_long | __longlong | __longlong_t)
- curl_format_curl_off_t="lld"
- curl_format_curl_off_tu="llu"
- ;;
- long)
- curl_format_curl_off_t="ld"
- curl_format_curl_off_tu="lu"
- ;;
- int)
- curl_format_curl_off_t="d"
- curl_format_curl_off_tu="u"
- ;;
- __int64)
- curl_format_curl_off_t="I64d"
- curl_format_curl_off_tu="I64u"
- ;;
- __int32)
- curl_format_curl_off_t="I32d"
- curl_format_curl_off_tu="I32u"
- ;;
- __int16)
- curl_format_curl_off_t="I16d"
- curl_format_curl_off_tu="I16u"
- ;;
- *)
- as_fn_error $? "cannot find print format string for curl_off_t." "$LINENO" 5
- ;;
- esac
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$curl_format_curl_off_t\"" >&5
-$as_echo "\"$curl_format_curl_off_t\"" >&6; }
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking formatting string directive for unsigned curl_off_t" >&5
-$as_echo_n "checking formatting string directive for unsigned curl_off_t... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$curl_format_curl_off_tu\"" >&5
-$as_echo "\"$curl_format_curl_off_tu\"" >&6; }
- #
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking constant suffix string for curl_off_t" >&5
-$as_echo_n "checking constant suffix string for curl_off_t... " >&6; }
- #
- curl_suffix_curl_off_t="unknown"
- curl_suffix_curl_off_tu="unknown"
- #
- case `echo "$curl_typeof_curl_off_t" | sed 's/[^a-zA-Z0-9_]/_/g'` in
- long_long | __longlong | __longlong_t)
- tst_suffixes="LL::"
- ;;
- long)
- tst_suffixes="L::"
- ;;
- int)
- tst_suffixes="::"
- ;;
- __int64 | int64_t)
- tst_suffixes="LL:i64::"
- ;;
- __int32 | int32_t)
- tst_suffixes="L:i32::"
- ;;
- __int16 | int16_t)
- tst_suffixes="L:i16::"
- ;;
- *)
- as_fn_error $? "unexpected data type $curl_typeof_curl_off_t" "$LINENO" 5
- ;;
- esac
- #
- old_IFS=$IFS; IFS=':'
- for tmp_ssuf in $tst_suffixes ; do
- IFS=$old_IFS
- if test "x$curl_suffix_curl_off_t" = "xunknown"; then
- case $tmp_ssuf in
- i64 | i32 | i16)
- tmp_usuf="u$tmp_ssuf"
- ;;
- LL | L)
- tmp_usuf="U$tmp_ssuf"
- ;;
- *)
- tmp_usuf=""
- ;;
- esac
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
- $curl_includes_inttypes
- typedef $curl_typeof_curl_off_t new_t;
-
-int main (void)
-{
-
- new_t s1;
- new_t s2;
- s1 = -10$tmp_ssuf ;
- s2 = 20$tmp_ssuf ;
- if(s1 > s2)
- return 1;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
- curl_suffix_curl_off_t="$tmp_ssuf"
- curl_suffix_curl_off_tu="$tmp_usuf"
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- done
- IFS=$old_IFS
- #
- if test "x$curl_suffix_curl_off_t" = "xunknown"; then
- as_fn_error $? "cannot find constant suffix string for curl_off_t." "$LINENO" 5
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $curl_suffix_curl_off_t" >&5
-$as_echo "$curl_suffix_curl_off_t" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking constant suffix string for unsigned curl_off_t" >&5
-$as_echo_n "checking constant suffix string for unsigned curl_off_t... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $curl_suffix_curl_off_tu" >&5
-$as_echo "$curl_suffix_curl_off_tu" >&6; }
- fi
- #
-
- #
- if test "$x_pull_headers" = "yes"; then
- if test "x$ac_cv_header_sys_types_h" = "xyes"; then
-
-cat >>confdefs.h <<_EOF
-#define CURL_PULL_SYS_TYPES_H 1
-_EOF
-
- fi
- if test "x$ac_cv_header_stdint_h" = "xyes"; then
-
-cat >>confdefs.h <<_EOF
-#define CURL_PULL_STDINT_H 1
-_EOF
-
- fi
- if test "x$ac_cv_header_inttypes_h" = "xyes"; then
-
-cat >>confdefs.h <<_EOF
-#define CURL_PULL_INTTYPES_H 1
-_EOF
-
- fi
- fi
- #
-
-cat >>confdefs.h <<_EOF
-#define CURL_TYPEOF_CURL_OFF_T $curl_typeof_curl_off_t
-_EOF
-
-
-cat >>confdefs.h <<_EOF
-#define CURL_FORMAT_CURL_OFF_T "$curl_format_curl_off_t"
-_EOF
-
-
-cat >>confdefs.h <<_EOF
-#define CURL_FORMAT_CURL_OFF_TU "$curl_format_curl_off_tu"
-_EOF
-
-
-cat >>confdefs.h <<_EOF
-#define CURL_FORMAT_OFF_T "%$curl_format_curl_off_t"
-_EOF
-
-
-cat >>confdefs.h <<_EOF
-#define CURL_SIZEOF_CURL_OFF_T $curl_sizeof_curl_off_t
-_EOF
-
-
-cat >>confdefs.h <<_EOF
-#define CURL_SUFFIX_CURL_OFF_T $curl_suffix_curl_off_t
-_EOF
-
-
-cat >>confdefs.h <<_EOF
-#define CURL_SUFFIX_CURL_OFF_TU $curl_suffix_curl_off_tu
-_EOF
-
- #
-
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if OS is AIX (to define _ALL_SOURCE)" >&5
@@ -11570,6 +10812,134 @@ func_munge_path_list ()
esac
}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
for ac_header in dlfcn.h
do :
ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
@@ -16566,6 +15936,65 @@ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if cpp -P is needed" >&5
+$as_echo_n "checking if cpp -P is needed... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <errno.h>
+TEST EINVAL TEST
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "TEST.*TEST" >/dev/null 2>&1; then :
+ cpp=no
+else
+ cpp=yes
+fi
+rm -f conftest*
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cpp" >&5
+$as_echo "$cpp" >&6; }
+
+ if test "x$cpp" = "xyes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if cpp -P works" >&5
+$as_echo_n "checking if cpp -P works... " >&6; }
+ OLDCPPFLAGS=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS -P"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <errno.h>
+TEST EINVAL TEST
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "TEST.*TEST" >/dev/null 2>&1; then :
+ cpp_p=yes
+else
+ cpp_p=no
+fi
+rm -f conftest*
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cpp_p" >&5
+$as_echo "$cpp_p" >&6; }
+
+ if test "x$cpp_p" = "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: failed to figure out cpp -P alternative" >&5
+$as_echo "$as_me: WARNING: failed to figure out cpp -P alternative" >&2;}
+ # without -P
+ CPPPFLAG=""
+ else
+ # with -P
+ CPPPFLAG="-P"
+ fi
+ CPPFLAGS=$OLDCPPFLAGS
+ else
+ # without -P
+ CPPPFLAG=""
+ fi
+
+
#
compiler_id="unknown"
compiler_num="0"
@@ -16997,7 +16426,7 @@ $as_echo "yes" >&6; }
clangver=`echo $fullclangver | grep "based on LLVM " | "$SED" 's/.*(based on LLVM \([0-9]*\.[0-9]*\).*)/\1/'`
if test -z "$clangver"; then
if echo $fullclangver | grep "Apple LLVM version " >/dev/null; then
- clangver=`3.7`
+ clangver="3.7"
else
clangver=`echo $fullclangver | "$SED" 's/.*version \([0-9]*\.[0-9]*\).*/\1/'`
fi
@@ -18503,6 +17932,11 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
#
if test "$compiler_num" -ge "309"; then
tmp_CFLAGS="$tmp_CFLAGS -Wcomma"
+ # avoid the varargs warning, fixed in 4.0
+ # https://bugs.llvm.org/show_bug.cgi?id=29140
+ if test "$compiler_num" -lt "400"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wno-varargs"
+ fi
fi
fi
;;
@@ -19747,6 +19181,43 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if the compiler supports __builtin_available()" >&5
+$as_echo_n "checking to see if the compiler supports __builtin_available()... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#include <stdlib.h>
+
+int main (void)
+{
+
+ if (__builtin_available(macOS 10.8, iOS 5.0, *)) {}
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_BUILTIN_AVAILABLE 1
+_ACEOF
+
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support http" >&5
$as_echo_n "checking whether to support http... " >&6; }
# Check whether --enable-http was given.
@@ -21499,6 +20970,262 @@ fi
+
+OPT_BROTLI=off
+
+# Check whether --with-brotli was given.
+if test "${with_brotli+set}" = set; then :
+ withval=$with_brotli; OPT_BROTLI=$withval
+fi
+
+
+if test X"$OPT_BROTLI" != Xno; then
+ CLEANLDFLAGS="$LDFLAGS"
+ CLEANCPPFLAGS="$CPPFLAGS"
+ CLEANLIBS="$LIBS"
+
+ case "$OPT_BROTLI" in
+ yes)
+
+ if test -n "$PKG_CONFIG"; then
+ PKGCONFIG="$PKG_CONFIG"
+ else
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKGCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKGCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKGCONFIG=$ac_cv_path_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+ ac_pt_PKGCONFIG=$PKGCONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKGCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKGCONFIG" = x; then
+ PKGCONFIG="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKGCONFIG=$ac_pt_PKGCONFIG
+ fi
+else
+ PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
+ fi
+
+ if test "x$PKGCONFIG" != "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libbrotlidec options with pkg-config" >&5
+$as_echo_n "checking for libbrotlidec options with pkg-config... " >&6; }
+ itexists=`
+ if test -n ""; then
+ PKG_CONFIG_LIBDIR=""
+ export PKG_CONFIG_LIBDIR
+ fi
+ $PKGCONFIG --exists libbrotlidec >/dev/null 2>&1 && echo 1`
+
+ if test -z "$itexists"; then
+ PKGCONFIG="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+ fi
+ fi
+
+
+ if test "$PKGCONFIG" != "no" ; then
+ LIB_BROTLI=`$PKGCONFIG --libs-only-l libbrotlidec`
+ LD_BROTLI=`$PKGCONFIG --libs-only-L libbrotlidec`
+ CPP_BROTLI=`$PKGCONFIG --cflags-only-I libbrotlidec`
+ version=`$PKGCONFIG --modversion libbrotlidec`
+ DIR_BROTLI=`echo $LD_BROTLI | $SED -e 's/-L//'`
+ fi
+
+ ;;
+ off)
+ ;;
+ *)
+ PREFIX_BROTLI=$OPT_BROTLI
+ ;;
+ esac
+
+ if test -n "$PREFIX_BROTLI"; then
+ LIB_BROTLI="-lbrotlidec"
+ LD_BROTLI=-L${PREFIX_BROTLI}/lib$libsuff
+ CPP_BROTLI=-I${PREFIX_BROTLI}/include
+ DIR_BROTLI=${PREFIX_BROTLI}/lib$libsuff
+ fi
+
+ LDFLAGS="$LDFLAGS $LD_BROTLI"
+ CPPFLAGS="$CPPFLAGS $CPP_BROTLI"
+ LIBS="$LIB_BROTLI $LIBS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BrotliDecoderDecompress in -lbrotlidec" >&5
+$as_echo_n "checking for BrotliDecoderDecompress in -lbrotlidec... " >&6; }
+if ${ac_cv_lib_brotlidec_BrotliDecoderDecompress+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbrotlidec $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char BrotliDecoderDecompress ();
+int main (void)
+{
+return BrotliDecoderDecompress ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_brotlidec_BrotliDecoderDecompress=yes
+else
+ ac_cv_lib_brotlidec_BrotliDecoderDecompress=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_brotlidec_BrotliDecoderDecompress" >&5
+$as_echo "$ac_cv_lib_brotlidec_BrotliDecoderDecompress" >&6; }
+if test "x$ac_cv_lib_brotlidec_BrotliDecoderDecompress" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBBROTLIDEC 1
+_ACEOF
+
+ LIBS="-lbrotlidec $LIBS"
+
+fi
+
+
+ for ac_header in brotli/decode.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "brotli/decode.h" "ac_cv_header_brotli_decode_h" "$ac_includes_default"
+if test "x$ac_cv_header_brotli_decode_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_BROTLI_DECODE_H 1
+_ACEOF
+ curl_brotli_msg="enabled (libbrotlidec)"
+ HAVE_BROTLI=1
+
+$as_echo "#define HAVE_BROTLI 1" >>confdefs.h
+
+ HAVE_BROTLI=1
+
+
+fi
+
+done
+
+
+ if test X"$OPT_BROTLI" != Xoff &&
+ test "$HAVE_BROTLI" != "1"; then
+ as_fn_error $? "BROTLI libs and/or directories were not found where specified!" "$LINENO" 5
+ fi
+
+ if test "$HAVE_BROTLI" = "1"; then
+ if test -n "$DIR_BROTLI"; then
+
+ if test "x$cross_compiling" != "xyes"; then
+ LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DIR_BROTLI"
+ export LD_LIBRARY_PATH
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_BROTLI to LD_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $DIR_BROTLI to LD_LIBRARY_PATH" >&6;}
+ fi
+ fi
+ else
+ LDFLAGS=$CLEANLDFLAGS
+ CPPFLAGS=$CLEANCPPFLAGS
+ LIBS=$CLEANLIBS
+ fi
+fi
+
+
LDAPLIBNAME=""
# Check whether --with-ldap-lib was given.
@@ -22505,6 +22232,42 @@ else
CPPFLAGS="$save_CPPFLAGS"
fi
+build_libstubgss=no
+if test x"$want_gss" = "xyes"; then
+ build_libstubgss=yes
+fi
+
+ if test "x$build_libstubgss" = "xyes"; then
+ BUILD_STUB_GSS_TRUE=
+ BUILD_STUB_GSS_FALSE='#'
+else
+ BUILD_STUB_GSS_TRUE='#'
+ BUILD_STUB_GSS_FALSE=
+fi
+
+
+
+DEFAULT_SSL_BACKEND=no
+VALID_DEFAULT_SSL_BACKEND=
+
+# Check whether --with-default-ssl-backend was given.
+if test "${with_default_ssl_backend+set}" = set; then :
+ withval=$with_default_ssl_backend; DEFAULT_SSL_BACKEND=$withval
+fi
+
+case "$DEFAULT_SSL_BACKEND" in
+ no)
+ ;;
+ default|yes)
+ as_fn_error $? "The name of the default SSL backend is required." "$LINENO" 5
+ ;;
+ *)
+
+ VALID_DEFAULT_SSL_BACKEND=no
+ ;;
+esac
+
+
OPT_WINSSL=no
@@ -22516,7 +22279,8 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Windows native SSL/TLS (Windows native builds only)" >&5
$as_echo_n "checking whether to enable Windows native SSL/TLS (Windows native builds only)... " >&6; }
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_WINSSL" != xno; then
+ ssl_msg=
if test "x$OPT_WINSSL" != "xno" &&
test "x$curl_cv_native_windows" = "xyes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -22526,7 +22290,8 @@ $as_echo "#define USE_SCHANNEL 1" >>confdefs.h
USE_SCHANNEL=1
- curl_ssl_msg="enabled (Windows-native)"
+ ssl_msg="Windows-native"
+ test schannel != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
WINSSL_ENABLED=1
# --with-winssl implies --enable-sspi
@@ -22540,6 +22305,7 @@ $as_echo "#define USE_WINDOWS_SSPI 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
@@ -22555,7 +22321,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Apple OS native SSL/TLS" >&5
$as_echo_n "checking whether to enable Apple OS native SSL/TLS... " >&6; }
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_DARWINSSL" != xno; then
if test "x$OPT_DARWINSSL" != "xno" &&
test -d "/System/Library/Frameworks/Security.framework"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -22565,13 +22331,15 @@ $as_echo "#define USE_DARWINSSL 1" >>confdefs.h
USE_DARWINSSL=1
- curl_ssl_msg="enabled (Apple OS-native)"
+ ssl_msg="Apple OS-native"
+ test darwinssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
DARWINSSL_ENABLED=1
LDFLAGS="$LDFLAGS -framework CoreFoundation -framework Security"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
@@ -22587,7 +22355,10 @@ if test "${with_ssl+set}" = set; then :
fi
-if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
+if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
+ test X"$OPT_SSL" != Xno; then
+ ssl_msg=
+
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
CLEANLIBS="$LIBS"
@@ -23095,7 +22866,8 @@ if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
- curl_ssl_msg="enabled (OpenSSL)"
+ ssl_msg="OpenSSL"
+ test openssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
OPENSSL_ENABLED=1
$as_echo "#define USE_OPENSSL 1" >>confdefs.h
@@ -23123,26 +22895,13 @@ done
if test $ac_cv_header_x509_h = yes &&
test $ac_cv_header_crypto_h = yes &&
test $ac_cv_header_ssl_h = yes; then
- curl_ssl_msg="enabled (OpenSSL)"
+ ssl_msg="OpenSSL"
OPENSSL_ENABLED=1
fi
fi
fi
- if test X"$OPENSSL_ENABLED" = X"1"; then
- for ac_header in openssl/pkcs12.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "openssl/pkcs12.h" "ac_cv_header_openssl_pkcs12_h" "$ac_includes_default"
-if test "x$ac_cv_header_openssl_pkcs12_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_OPENSSL_PKCS12_H 1
-_ACEOF
-
-fi
-
-done
-
- else
+ if test X"$OPENSSL_ENABLED" != X"1"; then
LIBS="$CLEANLIBS"
fi
@@ -23230,7 +22989,7 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_BORINGSSL 1
_ACEOF
- curl_ssl_msg="enabled (BoringSSL)"
+ ssl_msg="BoringSSL"
else
@@ -23267,7 +23026,7 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_LIBRESSL 1
_ACEOF
- curl_ssl_msg="enabled (libressl)"
+ ssl_msg="libressl"
else
@@ -23910,6 +23669,7 @@ $as_echo "$as_me: WARNING: $tst_warns" >&2;}
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
@@ -24031,7 +23791,8 @@ if test "${with_gnutls+set}" = set; then :
fi
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_GNUTLS" != xno; then
+ ssl_msg=
if test X"$OPT_GNUTLS" != Xno; then
@@ -24259,7 +24020,8 @@ $as_echo "#define USE_GNUTLS 1" >>confdefs.h
GNUTLS_ENABLED=1
USE_GNUTLS="yes"
- curl_ssl_msg="enabled (GnuTLS)"
+ ssl_msg="GnuTLS"
+ test gnutls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
else
@@ -24298,6 +24060,7 @@ done
fi
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
@@ -24532,7 +24295,8 @@ if test "${with_polarssl+set}" = set; then :
fi
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_POLARSSL" != xno; then
+ ssl_msg=
if test X"$OPT_POLARSSL" != Xno; then
@@ -24584,7 +24348,8 @@ $as_echo "#define USE_POLARSSL 1" >>confdefs.h
POLARSSL_ENABLED=1
USE_POLARSSL="yes"
- curl_ssl_msg="enabled (PolarSSL)"
+ ssl_msg="PolarSSL"
+ test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
fi
@@ -24647,7 +24412,8 @@ $as_echo "#define USE_POLARSSL 1" >>confdefs.h
POLARSSL_ENABLED=1
USE_POLARSSL="yes"
- curl_ssl_msg="enabled (PolarSSL)"
+ ssl_msg="PolarSSL"
+ test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
else
@@ -24675,6 +24441,7 @@ $as_echo "$as_me: Added $polarssllib to LD_LIBRARY_PATH" >&6;}
fi
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
@@ -24689,7 +24456,8 @@ if test "${with_mbedtls+set}" = set; then :
fi
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_MBEDTLS" != xno; then
+ ssl_msg=
if test X"$OPT_MBEDTLS" != Xno; then
@@ -24741,7 +24509,8 @@ $as_echo "#define USE_MBEDTLS 1" >>confdefs.h
MBEDTLS_ENABLED=1
USE_MBEDTLS="yes"
- curl_ssl_msg="enabled (mbedTLS)"
+ ssl_msg="mbedTLS"
+ test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
fi
@@ -24804,7 +24573,8 @@ $as_echo "#define USE_MBEDTLS 1" >>confdefs.h
MBEDTLS_ENABLED=1
USE_MBEDTLS="yes"
- curl_ssl_msg="enabled (mbedTLS)"
+ ssl_msg="mbedTLS"
+ test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
else
@@ -24832,6 +24602,7 @@ $as_echo "$as_me: Added $mbedtlslib to LD_LIBRARY_PATH" >&6;}
fi
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
@@ -24846,7 +24617,8 @@ if test "${with_cyassl+set}" = set; then :
fi
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_CYASSL" != xno; then
+ ssl_msg=
if test X"$OPT_CYASSL" != Xno; then
@@ -24901,7 +24673,8 @@ $as_echo "#define USE_CYASSL 1" >>confdefs.h
CYASSL_ENABLED=1
USE_CYASSL="yes"
- curl_ssl_msg="enabled (CyaSSL)"
+ ssl_msg="CyaSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
fi
@@ -24964,7 +24737,8 @@ $as_echo "#define USE_CYASSL 1" >>confdefs.h
CYASSL_ENABLED=1
USE_CYASSL="yes"
- curl_ssl_msg="enabled (CyaSSL)"
+ ssl_msg="CyaSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
else
@@ -25027,7 +24801,8 @@ $as_echo "#define USE_CYASSL 1" >>confdefs.h
CYASSL_ENABLED=1
USE_CYASSL="yes"
- curl_ssl_msg="enabled (WolfSSL)"
+ ssl_msg="WolfSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
else
@@ -25153,6 +24928,7 @@ $as_echo "$as_me: Added $cyassllib to LD_LIBRARY_PATH" >&6;}
fi
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
@@ -25165,7 +24941,8 @@ if test "${with_nss+set}" = set; then :
fi
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_NSS" != xno; then
+ ssl_msg=
if test X"$OPT_NSS" != Xno; then
@@ -25550,7 +25327,8 @@ $as_echo "#define USE_NSS 1" >>confdefs.h
USE_NSS="yes"
NSS_ENABLED=1
- curl_ssl_msg="enabled (NSS)"
+ ssl_msg="NSS"
+ test nss != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
else
@@ -25577,7 +25355,9 @@ $as_echo "$as_me: Added $nssprefix/lib$libsuff to LD_LIBRARY_PATH" >&6;}
fi
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
+
OPT_AXTLS=off
@@ -25587,7 +25367,8 @@ if test "${with_axtls+set}" = set; then :
fi
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_AXTLS" != xno; then
+ ssl_msg=
if test X"$OPT_AXTLS" != Xno; then
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -25654,7 +25435,8 @@ $as_echo "#define USE_AXTLS 1" >>confdefs.h
AXTLS_ENABLED=1
USE_AXTLS="yes"
- curl_ssl_msg="enabled (axTLS)"
+ ssl_msg="axTLS"
+ test axtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
if test "x$cross_compiling" != "xyes"; then
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS"
@@ -25672,17 +25454,56 @@ else
fi
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
-if test "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$MBEDTLS_ENABLED$AXTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$DARWINSSL_ENABLED" = "x"; then
+case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$MBEDTLS_ENABLED$AXTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$DARWINSSL_ENABLED" in
+x)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more." >&5
$as_echo "$as_me: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more." >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, or --with-darwinssl to address this." >&5
$as_echo "$as_me: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, or --with-darwinssl to address this." >&2;}
-else
- # SSL is enabled, genericly
+ ;;
+x1)
+ # one SSL backend is enabled
+
+ SSL_ENABLED="1"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: built with one SSL backend" >&5
+$as_echo "$as_me: built with one SSL backend" >&6;}
+ ;;
+*)
+ # more than one SSL backend is enabled
SSL_ENABLED="1"
+
+ CURL_WITH_MULTI_SSL="1"
+
+$as_echo "#define CURL_WITH_MULTI_SSL 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: built with multiple SSL backends" >&5
+$as_echo "$as_me: built with multiple SSL backends" >&6;}
+ ;;
+esac
+
+if test -n "$ssl_backends"; then
+ curl_ssl_msg="enabled ($ssl_backends)"
+fi
+
+if test no = "$VALID_DEFAULT_SSL_BACKEND"
+then
+ if test -n "$SSL_ENABLED"
+ then
+ as_fn_error $? "Default SSL backend $DEFAULT_SSL_BACKEND not enabled!" "$LINENO" 5
+ else
+ as_fn_error $? "Default SSL backend requires SSL!" "$LINENO" 5
+ fi
+elif test yes = "$VALID_DEFAULT_SSL_BACKEND"
+then
+
+cat >>confdefs.h <<_ACEOF
+#define CURL_DEFAULT_SSL_BACKEND "$DEFAULT_SSL_BACKEND"
+_ACEOF
+
fi
@@ -26820,7 +26641,9 @@ $as_echo "$as_me: WARNING: You need an ld version supporting the --version-scrip
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
- if test "x$OPENSSL_ENABLED" = "x1"; then
+ if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
+ versioned_symbols_flavour="MULTISSL_"
+ elif test "x$OPENSSL_ENABLED" = "x1"; then
versioned_symbols_flavour="OPENSSL_"
elif test "x$GNUTLS_ENABLED" = "x1"; then
versioned_symbols_flavour="GNUTLS_"
@@ -28003,6 +27826,7 @@ for ac_header in sys/types.h \
net/if.h \
netinet/in.h \
sys/un.h \
+ linux/tcp.h \
netinet/tcp.h \
netdb.h \
sys/sockio.h \
@@ -28558,17 +28382,6 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
-
- if test -z "$ac_cv_sizeof_long" ||
- test "$ac_cv_sizeof_long" -eq "0"; then
- as_fn_error $? "cannot find out size of long." "$LINENO" 5
- fi
-
-cat >>confdefs.h <<_EOF
-#define CURL_SIZEOF_LONG $ac_cv_sizeof_long
-_EOF
-
-
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
@@ -28636,17 +28449,46 @@ _ACEOF
-soname_bump=no
-if test x"$curl_cv_native_windows" != "xyes" &&
- test $ac_cv_sizeof_off_t -ne $curl_sizeof_curl_off_t; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This libcurl built is probably not ABI compatible with previous" >&5
-$as_echo "$as_me: WARNING: This libcurl built is probably not ABI compatible with previous" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: builds! You MUST read lib/README.curl_off_t to figure it out." >&5
-$as_echo "$as_me: WARNING: builds! You MUST read lib/README.curl_off_t to figure it out." >&2;}
- soname_bump=yes
+o=$CPPFLAGS
+CPPFLAGS="-I$srcdir/include $CPPFLAGS"
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of curl_off_t" >&5
+$as_echo_n "checking size of curl_off_t... " >&6; }
+if ${ac_cv_sizeof_curl_off_t+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (curl_off_t))" "ac_cv_sizeof_curl_off_t" "
+#include <curl/system.h>
+
+"; then :
+
+else
+ if test "$ac_cv_type_curl_off_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (curl_off_t)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_curl_off_t=0
+ fi
+fi
+
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_curl_off_t" >&5
+$as_echo "$ac_cv_sizeof_curl_off_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_CURL_OFF_T $ac_cv_sizeof_curl_off_t
+_ACEOF
+CPPFLAGS=$o
+
ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default"
if test "x$ac_cv_type_long_long" = xyes; then :
@@ -39829,6 +39671,7 @@ for ac_func in geteuid \
getrlimit \
gettimeofday \
if_nametoindex \
+ mach_absolute_time \
pipe \
setlocale \
setmode \
@@ -40660,12 +40503,12 @@ if test "${enable_threaded_resolver+set}" = set; then :
fi
case "$OPT_THRES" in
- *)
- want_thres="yes"
- ;;
no)
want_thres="no"
;;
+ *)
+ want_thres="yes"
+ ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $want_thres" >&5
$as_echo "$want_thres" >&6; }
@@ -41076,36 +40919,6 @@ fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enforce SONAME bump" >&5
-$as_echo_n "checking whether to enforce SONAME bump... " >&6; }
-# Check whether --enable-soname-bump was given.
-if test "${enable_soname_bump+set}" = set; then :
- enableval=$enable_soname_bump; case "$enableval" in
- yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- soname_bump=yes
- ;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- ;;
- esac
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $soname_bump" >&5
-$as_echo "$soname_bump" >&6; }
-
-fi
-
- if test x$soname_bump = xyes; then
- SONAME_BUMP_TRUE=
- SONAME_BUMP_FALSE='#'
-else
- SONAME_BUMP_TRUE='#'
- SONAME_BUMP_FALSE=
-fi
-
-
LIBCURL_LIBS=$LIBS
@@ -41146,6 +40959,9 @@ fi
if test "x$HAVE_LIBZ" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES libz"
fi
+if test "x$HAVE_BROTLI" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES brotli"
+fi
if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1" \
-o "x$USE_THREADS_WIN32" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES AsynchDNS"
@@ -41196,6 +41012,10 @@ if test "x$USE_NGHTTP2" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
fi
+if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
+fi
+
if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
-o "x$NSS_ENABLED" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
@@ -41469,7 +41289,7 @@ if test "x$want_curldebug_assumed" = "xyes" &&
ac_configure_args="$ac_configure_args --enable-curldebug"
fi
-ac_config_files="$ac_config_files Makefile docs/Makefile docs/examples/Makefile docs/libcurl/Makefile docs/libcurl/opts/Makefile docs/cmdline-opts/Makefile include/Makefile include/curl/Makefile src/Makefile lib/Makefile scripts/Makefile lib/libcurl.vers tests/Makefile tests/certs/Makefile tests/certs/scripts/Makefile tests/data/Makefile tests/server/Makefile tests/libtest/Makefile tests/unit/Makefile tests/fuzz/Makefile packages/Makefile packages/Win32/Makefile packages/Win32/cygwin/Makefile packages/Linux/Makefile packages/Linux/RPM/Makefile packages/Linux/RPM/curl.spec packages/Linux/RPM/curl-ssl.spec packages/Solaris/Makefile packages/EPM/curl.list packages/EPM/Makefile packages/vms/Makefile packages/AIX/Makefile packages/AIX/RPM/Makefile packages/AIX/RPM/curl.spec curl-config libcurl.pc"
+ac_config_files="$ac_config_files Makefile docs/Makefile docs/examples/Makefile docs/libcurl/Makefile docs/libcurl/opts/Makefile docs/cmdline-opts/Makefile include/Makefile include/curl/Makefile src/Makefile lib/Makefile scripts/Makefile lib/libcurl.vers tests/Makefile tests/certs/Makefile tests/certs/scripts/Makefile tests/data/Makefile tests/server/Makefile tests/libtest/Makefile tests/unit/Makefile packages/Makefile packages/Win32/Makefile packages/Win32/cygwin/Makefile packages/Linux/Makefile packages/Linux/RPM/Makefile packages/Linux/RPM/curl.spec packages/Linux/RPM/curl-ssl.spec packages/Solaris/Makefile packages/EPM/curl.list packages/EPM/Makefile packages/vms/Makefile packages/AIX/Makefile packages/AIX/RPM/Makefile packages/AIX/RPM/curl.spec curl-config libcurl.pc"
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
@@ -41648,6 +41468,10 @@ if test -z "${HAVE_LIBZ_TRUE}" && test -z "${HAVE_LIBZ_FALSE}"; then
as_fn_error $? "conditional \"HAVE_LIBZ\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${BUILD_STUB_GSS_TRUE}" && test -z "${BUILD_STUB_GSS_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_STUB_GSS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${USE_LIBPSL_TRUE}" && test -z "${USE_LIBPSL_FALSE}"; then
as_fn_error $? "conditional \"USE_LIBPSL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -41672,10 +41496,6 @@ if test -z "${DOING_CURL_SYMBOL_HIDING_TRUE}" && test -z "${DOING_CURL_SYMBOL_HI
as_fn_error $? "conditional \"DOING_CURL_SYMBOL_HIDING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${SONAME_BUMP_TRUE}" && test -z "${SONAME_BUMP_FALSE}"; then
- as_fn_error $? "conditional \"SONAME_BUMP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
if test -z "${CROSSCOMPILING_TRUE}" && test -z "${CROSSCOMPILING_FALSE}"; then
as_fn_error $? "conditional \"CROSSCOMPILING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -42571,7 +42391,6 @@ do
"tests/server/Makefile") CONFIG_FILES="$CONFIG_FILES tests/server/Makefile" ;;
"tests/libtest/Makefile") CONFIG_FILES="$CONFIG_FILES tests/libtest/Makefile" ;;
"tests/unit/Makefile") CONFIG_FILES="$CONFIG_FILES tests/unit/Makefile" ;;
- "tests/fuzz/Makefile") CONFIG_FILES="$CONFIG_FILES tests/fuzz/Makefile" ;;
"packages/Makefile") CONFIG_FILES="$CONFIG_FILES packages/Makefile" ;;
"packages/Win32/Makefile") CONFIG_FILES="$CONFIG_FILES packages/Win32/Makefile" ;;
"packages/Win32/cygwin/Makefile") CONFIG_FILES="$CONFIG_FILES packages/Win32/cygwin/Makefile" ;;
@@ -44151,6 +43970,7 @@ done
SSL support: ${curl_ssl_msg}
SSH support: ${curl_ssh_msg}
zlib support: ${curl_zlib_msg}
+ brotli support: ${curl_brotli_msg}
GSS-API support: ${curl_gss_msg}
TLS-SRP support: ${curl_tls_srp_msg}
resolver: ${curl_res_msg}
@@ -44183,6 +44003,7 @@ $as_echo "$as_me: Configured to build curl/libcurl:
SSL support: ${curl_ssl_msg}
SSH support: ${curl_ssh_msg}
zlib support: ${curl_zlib_msg}
+ brotli support: ${curl_brotli_msg}
GSS-API support: ${curl_gss_msg}
TLS-SRP support: ${curl_tls_srp_msg}
resolver: ${curl_res_msg}
@@ -44206,14 +44027,3 @@ $as_echo "$as_me: Configured to build curl/libcurl:
HTTP2 support: ${curl_h2_msg}
Protocols: ${SUPPORT_PROTOCOLS}
" >&6;}
-
-if test "x$soname_bump" = "xyes"; then
-
-cat <<EOM
- SONAME bump: yes - WARNING: this library will be built with the SONAME
- number bumped due to (a detected) ABI breakage.
- See lib/README.curl_off_t for details on this.
-EOM
-
-fi
-
diff --git a/configure.ac b/configure.ac
index edebfc7..a72a612 100644..100755
--- a/configure.ac
+++ b/configure.ac
@@ -148,6 +148,7 @@ dnl initialize all the info variables
curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl,mbedtls,cyassl,axtls,winssl,darwinssl} )"
curl_ssh_msg="no (--with-libssh2)"
curl_zlib_msg="no (--with-zlib)"
+ curl_brotli_msg="no (--with-brotli)"
curl_gss_msg="no (--with-gssapi)"
curl_tls_srp_msg="no (--enable-tls-srp)"
curl_res_msg="default (--enable-ares / --enable-threaded-resolver)"
@@ -165,7 +166,7 @@ curl_verbose_msg="enabled (--disable-verbose)"
curl_mtlnk_msg="no (--with-libmetalink)"
curl_psl_msg="no (--with-libpsl)"
- init_ssl_msg=${curl_ssl_msg}
+ ssl_backends=
dnl
dnl Save some initial values the user might have provided
@@ -183,9 +184,6 @@ AC_DEFINE_UNQUOTED(OS, "${host}", [cpu-machine-OS])
dnl Checks for programs.
-dnl Our curl_off_t internal and external configure settings
-CURL_CONFIGURE_CURL_OFF_T
-
dnl This defines _ALL_SOURCE for AIX
CURL_CHECK_AIX_ALL_SOURCE
@@ -354,6 +352,7 @@ esac
CURL_CHECK_WIN32_LARGEFILE
CURL_MAC_CFLAGS
+CURL_SUPPORTS_BUILTIN_AVAILABLE
dnl ************************************************************
dnl switch off particular protocols
@@ -978,6 +977,94 @@ AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1)
AC_SUBST(ZLIB_LIBS)
dnl **********************************************************************
+dnl Check for the presence of BROTLI decoder libraries and headers
+dnl **********************************************************************
+
+dnl Brotli project home page: https://github.com/google/brotli
+
+dnl Default to compiler & linker defaults for BROTLI files & libraries.
+OPT_BROTLI=off
+AC_ARG_WITH(brotli,dnl
+AC_HELP_STRING([--with-brotli=PATH],[Where to look for brotli, PATH points to the BROTLI installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
+AC_HELP_STRING([--without-brotli], [disable BROTLI]),
+ OPT_BROTLI=$withval)
+
+if test X"$OPT_BROTLI" != Xno; then
+ dnl backup the pre-brotli variables
+ CLEANLDFLAGS="$LDFLAGS"
+ CLEANCPPFLAGS="$CPPFLAGS"
+ CLEANLIBS="$LIBS"
+
+ case "$OPT_BROTLI" in
+ yes)
+ dnl --with-brotli (without path) used
+ CURL_CHECK_PKGCONFIG(libbrotlidec)
+
+ if test "$PKGCONFIG" != "no" ; then
+ LIB_BROTLI=`$PKGCONFIG --libs-only-l libbrotlidec`
+ LD_BROTLI=`$PKGCONFIG --libs-only-L libbrotlidec`
+ CPP_BROTLI=`$PKGCONFIG --cflags-only-I libbrotlidec`
+ version=`$PKGCONFIG --modversion libbrotlidec`
+ DIR_BROTLI=`echo $LD_BROTLI | $SED -e 's/-L//'`
+ fi
+
+ ;;
+ off)
+ dnl no --with-brotli option given, just check default places
+ ;;
+ *)
+ dnl use the given --with-brotli spot
+ PREFIX_BROTLI=$OPT_BROTLI
+ ;;
+ esac
+
+ dnl if given with a prefix, we set -L and -I based on that
+ if test -n "$PREFIX_BROTLI"; then
+ LIB_BROTLI="-lbrotlidec"
+ LD_BROTLI=-L${PREFIX_BROTLI}/lib$libsuff
+ CPP_BROTLI=-I${PREFIX_BROTLI}/include
+ DIR_BROTLI=${PREFIX_BROTLI}/lib$libsuff
+ fi
+
+ LDFLAGS="$LDFLAGS $LD_BROTLI"
+ CPPFLAGS="$CPPFLAGS $CPP_BROTLI"
+ LIBS="$LIB_BROTLI $LIBS"
+
+ AC_CHECK_LIB(brotlidec, BrotliDecoderDecompress)
+
+ AC_CHECK_HEADERS(brotli/decode.h,
+ curl_brotli_msg="enabled (libbrotlidec)"
+ HAVE_BROTLI=1
+ AC_DEFINE(HAVE_BROTLI, 1, [if BROTLI is in use])
+ AC_SUBST(HAVE_BROTLI, [1])
+ )
+
+ if test X"$OPT_BROTLI" != Xoff &&
+ test "$HAVE_BROTLI" != "1"; then
+ AC_MSG_ERROR([BROTLI libs and/or directories were not found where specified!])
+ fi
+
+ if test "$HAVE_BROTLI" = "1"; then
+ if test -n "$DIR_BROTLI"; then
+ dnl when the brotli shared libs were found in a path that the run-time
+ dnl linker doesn't search through, we need to add it to LD_LIBRARY_PATH
+ dnl to prevent further configure tests to fail due to this
+
+ if test "x$cross_compiling" != "xyes"; then
+ LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DIR_BROTLI"
+ export LD_LIBRARY_PATH
+ AC_MSG_NOTICE([Added $DIR_BROTLI to LD_LIBRARY_PATH])
+ fi
+ fi
+ else
+ dnl no brotli, revert back to clean variables
+ LDFLAGS=$CLEANLDFLAGS
+ CPPFLAGS=$CLEANCPPFLAGS
+ LIBS=$CLEANLIBS
+ fi
+fi
+
+dnl **********************************************************************
dnl Check for LDAP
dnl **********************************************************************
@@ -1336,6 +1423,41 @@ else
CPPFLAGS="$save_CPPFLAGS"
fi
+build_libstubgss=no
+if test x"$want_gss" = "xyes"; then
+ build_libstubgss=yes
+fi
+
+AM_CONDITIONAL(BUILD_STUB_GSS, test "x$build_libstubgss" = "xyes")
+
+dnl -------------------------------------------------------------
+dnl parse --with-default-ssl-backend so it can be validated below
+dnl -------------------------------------------------------------
+
+DEFAULT_SSL_BACKEND=no
+VALID_DEFAULT_SSL_BACKEND=
+AC_ARG_WITH(default-ssl-backend,
+AC_HELP_STRING([--with-default-ssl-backend=NAME],[Use NAME as default SSL backend])
+AC_HELP_STRING([--without-default-ssl-backend],[Use implicit default SSL backend]),
+ [DEFAULT_SSL_BACKEND=$withval])
+case "$DEFAULT_SSL_BACKEND" in
+ no)
+ dnl --without-default-ssl-backend option used
+ ;;
+ default|yes)
+ dnl --with-default-ssl-backend option used without name
+ AC_MSG_ERROR([The name of the default SSL backend is required.])
+ ;;
+ *)
+ dnl --with-default-ssl-backend option used with name
+ AC_SUBST(DEFAULT_SSL_BACKEND)
+ dnl needs to be validated below
+ VALID_DEFAULT_SSL_BACKEND=no
+ ;;
+esac
+
+dnl **********************************************************************
+
dnl -------------------------------------------------
dnl check winssl option before other SSL libraries
dnl -------------------------------------------------
@@ -1347,13 +1469,15 @@ AC_HELP_STRING([--without-winssl], [disable Windows native SSL/TLS]),
OPT_WINSSL=$withval)
AC_MSG_CHECKING([whether to enable Windows native SSL/TLS (Windows native builds only)])
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_WINSSL" != xno; then
+ ssl_msg=
if test "x$OPT_WINSSL" != "xno" &&
test "x$curl_cv_native_windows" = "xyes"; then
AC_MSG_RESULT(yes)
AC_DEFINE(USE_SCHANNEL, 1, [to enable Windows native SSL/TLS support])
AC_SUBST(USE_SCHANNEL, [1])
- curl_ssl_msg="enabled (Windows-native)"
+ ssl_msg="Windows-native"
+ test schannel != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
WINSSL_ENABLED=1
# --with-winssl implies --enable-sspi
AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support])
@@ -1363,6 +1487,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
else
AC_MSG_RESULT(no)
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
else
AC_MSG_RESULT(no)
fi
@@ -1374,18 +1499,20 @@ AC_HELP_STRING([--without-darwinssl], [disable Apple OS native SSL/TLS]),
OPT_DARWINSSL=$withval)
AC_MSG_CHECKING([whether to enable Apple OS native SSL/TLS])
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_DARWINSSL" != xno; then
if test "x$OPT_DARWINSSL" != "xno" &&
test -d "/System/Library/Frameworks/Security.framework"; then
AC_MSG_RESULT(yes)
AC_DEFINE(USE_DARWINSSL, 1, [to enable Apple OS native SSL/TLS support])
AC_SUBST(USE_DARWINSSL, [1])
- curl_ssl_msg="enabled (Apple OS-native)"
+ ssl_msg="Apple OS-native"
+ test darwinssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
DARWINSSL_ENABLED=1
LDFLAGS="$LDFLAGS -framework CoreFoundation -framework Security"
else
AC_MSG_RESULT(no)
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
else
AC_MSG_RESULT(no)
fi
@@ -1403,7 +1530,10 @@ AC_HELP_STRING([--with-ssl=PATH],[Where to look for OpenSSL, PATH points to the
AC_HELP_STRING([--without-ssl], [disable OpenSSL]),
OPT_SSL=$withval)
-if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
+if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
+ test X"$OPT_SSL" != Xno; then
+ ssl_msg=
+
dnl backup the pre-ssl variables
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -1584,7 +1714,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
dnl Have the libraries--check for OpenSSL headers
AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \
openssl/pem.h openssl/ssl.h openssl/err.h,
- curl_ssl_msg="enabled (OpenSSL)"
+ ssl_msg="OpenSSL"
+ test openssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
OPENSSL_ENABLED=1
AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use]))
@@ -1598,16 +1729,13 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
test $ac_cv_header_crypto_h = yes &&
test $ac_cv_header_ssl_h = yes; then
dnl three matches
- curl_ssl_msg="enabled (OpenSSL)"
+ ssl_msg="OpenSSL"
OPENSSL_ENABLED=1
fi
fi
fi
- if test X"$OPENSSL_ENABLED" = X"1"; then
- dnl is there a pkcs12.h header present?
- AC_CHECK_HEADERS(openssl/pkcs12.h)
- else
+ if test X"$OPENSSL_ENABLED" != X"1"; then
LIBS="$CLEANLIBS"
fi
@@ -1649,7 +1777,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
AC_MSG_RESULT([yes])
AC_DEFINE_UNQUOTED(HAVE_BORINGSSL, 1,
[Define to 1 if using BoringSSL.])
- curl_ssl_msg="enabled (BoringSSL)"
+ ssl_msg="BoringSSL"
],[
AC_MSG_RESULT([no])
])
@@ -1665,7 +1793,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
AC_MSG_RESULT([yes])
AC_DEFINE_UNQUOTED(HAVE_LIBRESSL, 1,
[Define to 1 if using libressl.])
- curl_ssl_msg="enabled (libressl)"
+ ssl_msg="libressl"
],[
AC_MSG_RESULT([no])
])
@@ -1685,6 +1813,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
CURL_CHECK_OPENSSL_API
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
dnl **********************************************************************
@@ -1746,7 +1875,8 @@ AC_HELP_STRING([--with-gnutls=PATH],[where to look for GnuTLS, PATH points to th
AC_HELP_STRING([--without-gnutls], [disable GnuTLS detection]),
OPT_GNUTLS=$withval)
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_GNUTLS" != xno; then
+ ssl_msg=
if test X"$OPT_GNUTLS" != Xno; then
@@ -1820,7 +1950,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_GNUTLS, [1])
GNUTLS_ENABLED=1
USE_GNUTLS="yes"
- curl_ssl_msg="enabled (GnuTLS)"
+ ssl_msg="GnuTLS"
+ test gnutls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
],
[
LIBS="$CLEANLIBS"
@@ -1835,7 +1966,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
dnl linker doesn't search through, we need to add it to
dnl LD_LIBRARY_PATH to prevent further configure tests to fail
dnl due to this
- if test "x$cross_compiling" != "xyes"; then
+ if test "x$cross_compiling" != "xyes"; then
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$gtlslib"
export LD_LIBRARY_PATH
AC_MSG_NOTICE([Added $gtlslib to LD_LIBRARY_PATH])
@@ -1848,6 +1979,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
fi dnl GNUTLS not disabled
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
dnl ---
@@ -1905,7 +2037,8 @@ AC_HELP_STRING([--with-polarssl=PATH],[where to look for PolarSSL, PATH points t
AC_HELP_STRING([--without-polarssl], [disable PolarSSL detection]),
OPT_POLARSSL=$withval)
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_POLARSSL" != xno; then
+ ssl_msg=
if test X"$OPT_POLARSSL" != Xno; then
@@ -1923,7 +2056,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_POLARSSL, [1])
POLARSSL_ENABLED=1
USE_POLARSSL="yes"
- curl_ssl_msg="enabled (PolarSSL)"
+ ssl_msg="PolarSSL"
+ test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
])
fi
@@ -1949,7 +2083,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_POLARSSL, [1])
POLARSSL_ENABLED=1
USE_POLARSSL="yes"
- curl_ssl_msg="enabled (PolarSSL)"
+ ssl_msg="PolarSSL"
+ test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
],
[
CPPFLAGS=$_cppflags
@@ -1977,6 +2112,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
fi dnl PolarSSL not disabled
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
dnl ----------------------------------------------------
@@ -1992,7 +2128,8 @@ AC_HELP_STRING([--with-mbedtls=PATH],[where to look for mbedTLS, PATH points to
AC_HELP_STRING([--without-mbedtls], [disable mbedTLS detection]),
OPT_MBEDTLS=$withval)
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_MBEDTLS" != xno; then
+ ssl_msg=
if test X"$OPT_MBEDTLS" != Xno; then
@@ -2010,7 +2147,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_MBEDTLS, [1])
MBEDTLS_ENABLED=1
USE_MBEDTLS="yes"
- curl_ssl_msg="enabled (mbedTLS)"
+ ssl_msg="mbedTLS"
+ test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
], [], -lmbedx509 -lmbedcrypto)
fi
@@ -2036,7 +2174,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_MBEDTLS, [1])
MBEDTLS_ENABLED=1
USE_MBEDTLS="yes"
- curl_ssl_msg="enabled (mbedTLS)"
+ ssl_msg="mbedTLS"
+ test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
],
[
CPPFLAGS=$_cppflags
@@ -2064,6 +2203,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
fi dnl mbedTLS not disabled
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
dnl ----------------------------------------------------
@@ -2080,7 +2220,8 @@ AC_HELP_STRING([--with-cyassl=PATH],[where to look for CyaSSL, PATH points to th
AC_HELP_STRING([--without-cyassl], [disable CyaSSL detection]),
OPT_CYASSL=$withval)
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_CYASSL" != xno; then
+ ssl_msg=
if test X"$OPT_CYASSL" != Xno; then
@@ -2102,7 +2243,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_CYASSL, [1])
CYASSL_ENABLED=1
USE_CYASSL="yes"
- curl_ssl_msg="enabled (CyaSSL)"
+ ssl_msg="CyaSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
])
fi
@@ -2128,7 +2270,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_CYASSL, [1])
CYASSL_ENABLED=1
USE_CYASSL="yes"
- curl_ssl_msg="enabled (CyaSSL)"
+ ssl_msg="CyaSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
],
[
CPPFLAGS=$_cppflags
@@ -2173,7 +2316,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_CYASSL, [1])
CYASSL_ENABLED=1
USE_CYASSL="yes"
- curl_ssl_msg="enabled (WolfSSL)"
+ ssl_msg="WolfSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
],
[
AC_MSG_RESULT(no)
@@ -2227,6 +2371,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
fi dnl CyaSSL not disabled
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
dnl ----------------------------------------------------
@@ -2241,7 +2386,8 @@ AC_HELP_STRING([--with-nss=PATH],[where to look for NSS, PATH points to the inst
AC_HELP_STRING([--without-nss], [disable NSS detection]),
OPT_NSS=$withval)
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_NSS" != xno; then
+ ssl_msg=
if test X"$OPT_NSS" != Xno; then
@@ -2316,7 +2462,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_NSS, [1])
USE_NSS="yes"
NSS_ENABLED=1
- curl_ssl_msg="enabled (NSS)"
+ ssl_msg="NSS"
+ test nss != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
],
[
LDFLAGS="$CLEANLDFLAGS"
@@ -2345,7 +2492,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
fi dnl NSS not disabled
-fi dnl curl_ssl_msg = init_ssl_msg
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
+fi
OPT_AXTLS=off
@@ -2354,7 +2502,8 @@ AC_HELP_STRING([--with-axtls=PATH],[Where to look for axTLS, PATH points to the
AC_HELP_STRING([--without-axtls], [disable axTLS]),
OPT_AXTLS=$withval)
-if test "$curl_ssl_msg" = "$init_ssl_msg"; then
+if test -z "$ssl_backends" -o "x$OPT_AXTLS" != xno; then
+ ssl_msg=
if test X"$OPT_AXTLS" != Xno; then
dnl backup the pre-axtls variables
CLEANLDFLAGS="$LDFLAGS"
@@ -2388,7 +2537,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_SUBST(USE_AXTLS, [1])
AXTLS_ENABLED=1
USE_AXTLS="yes"
- curl_ssl_msg="enabled (axTLS)"
+ ssl_msg="axTLS"
+ test axtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
if test "x$cross_compiling" != "xyes"; then
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS"
@@ -2401,15 +2551,46 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
LIBS="$CLEANLIBS"
])
fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
-if test "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$MBEDTLS_ENABLED$AXTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$DARWINSSL_ENABLED" = "x"; then
+case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$MBEDTLS_ENABLED$AXTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$DARWINSSL_ENABLED" in
+x)
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, or --with-darwinssl to address this.])
-else
- # SSL is enabled, genericly
+ ;;
+x1)
+ # one SSL backend is enabled
+ AC_SUBST(SSL_ENABLED)
+ SSL_ENABLED="1"
+ AC_MSG_NOTICE([built with one SSL backend])
+ ;;
+*)
+ # more than one SSL backend is enabled
AC_SUBST(SSL_ENABLED)
SSL_ENABLED="1"
+ AC_SUBST(CURL_WITH_MULTI_SSL)
+ CURL_WITH_MULTI_SSL="1"
+ AC_DEFINE(CURL_WITH_MULTI_SSL, 1, [built with multiple SSL backends])
+ AC_MSG_NOTICE([built with multiple SSL backends])
+ ;;
+esac
+
+if test -n "$ssl_backends"; then
+ curl_ssl_msg="enabled ($ssl_backends)"
+fi
+
+if test no = "$VALID_DEFAULT_SSL_BACKEND"
+then
+ if test -n "$SSL_ENABLED"
+ then
+ AC_MSG_ERROR([Default SSL backend $DEFAULT_SSL_BACKEND not enabled!])
+ else
+ AC_MSG_ERROR([Default SSL backend requires SSL!])
+ fi
+elif test yes = "$VALID_DEFAULT_SSL_BACKEND"
+then
+ AC_DEFINE_UNQUOTED([CURL_DEFAULT_SSL_BACKEND], ["$DEFAULT_SSL_BACKEND"], [Default SSL backend])
fi
dnl **********************************************************************
@@ -2710,7 +2891,9 @@ AC_HELP_STRING([--disable-versioned-symbols], [Disable versioned symbols in shar
AC_MSG_WARN([You need an ld version supporting the --version-script option])
else
AC_MSG_RESULT(yes)
- if test "x$OPENSSL_ENABLED" = "x1"; then
+ if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
+ versioned_symbols_flavour="MULTISSL_"
+ elif test "x$OPENSSL_ENABLED" = "x1"; then
versioned_symbols_flavour="OPENSSL_"
elif test "x$GNUTLS_ENABLED" = "x1"; then
versioned_symbols_flavour="GNUTLS_"
@@ -3092,6 +3275,7 @@ AC_CHECK_HEADERS(
net/if.h \
netinet/in.h \
sys/un.h \
+ linux/tcp.h \
netinet/tcp.h \
netdb.h \
sys/sockio.h \
@@ -3158,18 +3342,15 @@ AC_CHECK_SIZEOF(size_t)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(short)
-CURL_CONFIGURE_LONG
AC_CHECK_SIZEOF(time_t)
AC_CHECK_SIZEOF(off_t)
-soname_bump=no
-if test x"$curl_cv_native_windows" != "xyes" &&
- test $ac_cv_sizeof_off_t -ne $curl_sizeof_curl_off_t; then
- AC_MSG_WARN([This libcurl built is probably not ABI compatible with previous])
- AC_MSG_WARN([builds! You MUST read lib/README.curl_off_t to figure it out.])
- soname_bump=yes
-fi
-
+o=$CPPFLAGS
+CPPFLAGS="-I$srcdir/include $CPPFLAGS"
+AC_CHECK_SIZEOF(curl_off_t, unused , [
+#include <curl/system.h>
+])
+CPPFLAGS=$o
AC_CHECK_TYPE(long long,
[AC_DEFINE(HAVE_LONGLONG, 1,
@@ -3294,6 +3475,7 @@ AC_CHECK_FUNCS([geteuid \
getrlimit \
gettimeofday \
if_nametoindex \
+ mach_absolute_time \
pipe \
setlocale \
setmode \
@@ -3648,26 +3830,6 @@ dnl hiding of library internal symbols
dnl
CURL_CONFIGURE_SYMBOL_HIDING
-dnl ************************************************************
-dnl enforce SONAME bump
-dnl
-
-AC_MSG_CHECKING([whether to enforce SONAME bump])
-AC_ARG_ENABLE(soname-bump,
-AC_HELP_STRING([--enable-soname-bump],[Enable enforced SONAME bump])
-AC_HELP_STRING([--disable-soname-bump],[Disable enforced SONAME bump]),
-[ case "$enableval" in
- yes) AC_MSG_RESULT(yes)
- soname_bump=yes
- ;;
- *)
- AC_MSG_RESULT(no)
- ;;
- esac ],
- AC_MSG_RESULT($soname_bump)
-)
-AM_CONDITIONAL(SONAME_BUMP, test x$soname_bump = xyes)
-
dnl
dnl All the library dependencies put into $LIB apply to libcurl only.
dnl
@@ -3714,6 +3876,9 @@ fi
if test "x$HAVE_LIBZ" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES libz"
fi
+if test "x$HAVE_BROTLI" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES brotli"
+fi
if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1" \
-o "x$USE_THREADS_WIN32" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES AsynchDNS"
@@ -3764,6 +3929,10 @@ if test "x$USE_NGHTTP2" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
fi
+if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
+fi
+
if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
-o "x$NSS_ENABLED" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
@@ -3895,7 +4064,6 @@ AC_CONFIG_FILES([Makefile \
tests/server/Makefile \
tests/libtest/Makefile \
tests/unit/Makefile \
- tests/fuzz/Makefile \
packages/Makefile \
packages/Win32/Makefile \
packages/Win32/cygwin/Makefile \
@@ -3928,6 +4096,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
SSL support: ${curl_ssl_msg}
SSH support: ${curl_ssh_msg}
zlib support: ${curl_zlib_msg}
+ brotli support: ${curl_brotli_msg}
GSS-API support: ${curl_gss_msg}
TLS-SRP support: ${curl_tls_srp_msg}
resolver: ${curl_res_msg}
@@ -3951,14 +4120,3 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
HTTP2 support: ${curl_h2_msg}
Protocols: ${SUPPORT_PROTOCOLS}
])
-
-if test "x$soname_bump" = "xyes"; then
-
-cat <<EOM
- SONAME bump: yes - WARNING: this library will be built with the SONAME
- number bumped due to (a detected) ABI breakage.
- See lib/README.curl_off_t for details on this.
-EOM
-
-fi
-
diff --git a/docs/BUGS b/docs/BUGS
index 3c8fa9f..33f06ce 100644
--- a/docs/BUGS
+++ b/docs/BUGS
@@ -63,7 +63,7 @@ BUGS
Security related bugs or bugs that are suspected to have a security impact,
should be reported by email to curl-security@haxx.se so that they first can
be dealt with away from the public to minimize the harm and impact it will
- have on existing users out there who might be using the vulernable versions.
+ have on existing users out there who might be using the vulnerable versions.
The curl project's process for handling security related issues is
documented here:
@@ -186,7 +186,7 @@ BUGS
include the version number of the curl you're using when you experience the
issue. If that version number shows us that you're using an out-of-date
curl, you should also try out a modern curl version to see if the problem
- persists or how/if it has changed in apperance.
+ persists or how/if it has changed in appearance.
Even if you cannot immediately upgrade your application/system to run the
latest curl version, you can most often at least run a test version or
@@ -290,8 +290,8 @@ BUGS
The issue and pull request trackers on https://github.com/curl/curl will
only hold "active" entries (using a non-precise definition of what active
actually is, but they're at least not completely dead). Those that are
- abandonded or in other ways dormant will be closed and sometimes added to
+ abandoned or in other ways dormant will be closed and sometimes added to
TODO and KNOWN_BUGS instead.
This way, we only have "active" issues open on github. Irrelevant issues and
- pull requests will not distract developes or casual visitors.
+ pull requests will not distract developers or casual visitors.
diff --git a/docs/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md
index 04ea66e..1f71c38 100644
--- a/docs/CODE_OF_CONDUCT.md
+++ b/docs/CODE_OF_CONDUCT.md
@@ -28,5 +28,5 @@ reported by opening an issue or contacting one or more of the project
maintainers.
This Code of Conduct is adapted from the [Contributor
-Covenant](http://contributor-covenant.org), version 1.1.0, available at
-[http://contributor-covenant.org/version/1/1/0/](http://contributor-covenant.org/version/1/1/0/)
+Covenant](https://contributor-covenant.org/), version 1.1.0, available at
+[https://contributor-covenant.org/version/1/1/0/](https://contributor-covenant.org/version/1/1/0/)
diff --git a/docs/FAQ b/docs/FAQ
index 5b98106..7ed5fa0 100644
--- a/docs/FAQ
+++ b/docs/FAQ
@@ -1418,7 +1418,7 @@ FAQ
timed out.
The most flexible way is by writing your own time-out logic and using
- CURLOPT_PROGRESSFUNCTION (perhaps in combination with other callbacks) and
+ CURLOPT_XFERINFOFUNCTION (perhaps in combination with other callbacks) and
use that to figure out exactly when the right condition is met when the
transfer should get stopped.
diff --git a/docs/HELP-US.md b/docs/HELP-US.md
new file mode 100644
index 0000000..aae2b9f
--- /dev/null
+++ b/docs/HELP-US.md
@@ -0,0 +1,70 @@
+# How to get started helping out in the curl project
+
+We are always in need of more help. If you are new to the project and are
+looking for ways to contribute and help out, this document aims to give a few
+good starting points.
+
+A good idea is to start by subscribing to the [curl-library mailing
+list](https://cool.haxx.se/mailman/listinfo/curl-library) to keep track of the
+current discussion topics.
+
+## Scratch your own itch
+
+One of the best ways is to start working on any problems or issues you have
+found yourself or perhaps got annoyed at in the past. It can be a spelling
+error in an error text or a weirdly phrased section in a man page. Hunt it
+down and report the bug. Or make your first pull request with a fix for that.
+
+## Help wanted
+
+In the issue tracker we occasionally mark bugs with [help
+wanted](https://github.com/curl/curl/labels/help%20wanted), as a sign that the
+bug is acknowledged to exist and that there's nobody known to work on this
+issue for the moment. Those are bugs that are fine to "grab" and provide a
+pull request for. The complexity level of these will of course vary, so pick
+one that piques your interest.
+
+## Work on known bugs
+
+Some bugs are known and haven't yet received attention and work enough to get
+fixed. We collect such known existing flaws in the
+[KNOWN_BUGS](https://curl.haxx.se/docs/knownbugs.html) page. Many of them link
+to the original bug report with some additional details, but some may also
+have aged a bit and may require some verification that the bug still exists in
+the same way and that what was said about it in the past is still valid.
+
+## Fix autobuild problems
+
+On the [autobuilds page](https://curl.haxx.se/dev/builds.html) we show a
+collection of test results from the automatic curl build and tests that are
+performed by volunteers. Fixing compiler warnings and errors shown there is
+something we value greatly. Also, if you own or run systems or architectures
+that aren't already tested in the autobuilds, we also appreciate more
+volunteers running builds automatically to help us keep curl portable.
+
+## TODO items
+
+Ideas for features and functions that we have considered worthwhile to
+implement and provide are kept in the
+[TODO](https://curl.haxx.se/docs/todo.html) file. Some of the ideas are
+rough. Some are well thought out. Some probably aren't really suitable
+anymore.
+
+Before you invest a lot of time on a TODO item, do bring it up for discussion
+on the mailing list. For discussion on applicability but also for ideas and
+brainstorming on specific ways to do the implementation etc.
+
+## You decide
+
+You can also come up with a completely new thing you think we should do. Or
+not do. Or fix. Or add to the project. You then either bring it to the mailing
+list first to see if people will shoot down the idea at once, or you bring a
+first draft of the idea as a pull request and take the discussion there around
+the specific implementation. Either way is fine.
+
+## CONTRIBUTE
+
+We offer [guidelines](https://curl.haxx.se/dev/contribute.html) that are
+suitable to be familiar with before you decide to contribute to curl. If
+you're used to open source development, you'll probably not find many
+surprises in there.
diff --git a/docs/HISTORY.md b/docs/HISTORY.md
index 551e7d2..a84ad8f 100644
--- a/docs/HISTORY.md
+++ b/docs/HISTORY.md
@@ -275,3 +275,21 @@ August:
March: first real release supporting HTTP/2
September: Web site had 245,000 unique visitors and served 236GB data
+
+2016
+----
+
+ December: curl 7.52.0 introduced support for HTTPS-proxy!
+
+2017
+----
+
+ September: Added Multi-SSL support
+
+ The web site serves 3100 GB/month
+
+ Public curl releases: 169
+ Command line options: 211
+ curl_easy_setopt() options: 249
+ Public functions in libcurl: 74
+ Contributors: 1609
diff --git a/docs/INSTALL.md b/docs/INSTALL.md
index 6c2c8ce..67a9378 100644
--- a/docs/INSTALL.md
+++ b/docs/INSTALL.md
@@ -222,6 +222,9 @@ subdirectory run following command from mentioned subdirectory:
In order to build sample program simplessl.c an SSL enabled libcurl is
required, as well as the OpenSSL libeay32.lib and ssleay32.lib libraries.
+In order to build sample program `sslbackend.c`, an SSL enabled libcurl
+is required.
+
## Disabling Specific Protocols in Windows builds
The configure utility, unfortunately, is not available for the Windows
diff --git a/docs/INTERNALS.md b/docs/INTERNALS.md
index 2e273a9..459684b 100644
--- a/docs/INTERNALS.md
+++ b/docs/INTERNALS.md
@@ -82,7 +82,7 @@ Dependencies
- zlib 1.1.4
- libssh2 0.16
- c-ares 1.6.0
- - libidn 0.4.1
+ - libidn2 2.0.0
- cyassl 2.0.0
- openldap 2.0
- MIT Kerberos 1.2.4
@@ -612,20 +612,6 @@ curlx
strtoll() (or equivalent) function exist on your platform. If `curl_off_t`
is only a 32 bit number on your platform, this macro uses strtol().
-`curlx_tvnow()`
----------------
- returns a struct timeval for the current time.
-
-`curlx_tvdiff()`
---------------
- returns the difference between two timeval structs, in number of
- milliseconds.
-
-`curlx_tvdiff_secs()`
----------------------
- returns the same as `curlx_tvdiff` but with full usec resolution (as a
- double)
-
Future
------
@@ -656,29 +642,29 @@ Content Encoding
## About content encodings
[HTTP/1.1][4] specifies that a client may request that a server encode its
- response. This is usually used to compress a response using one of a set of
- commonly available compression techniques. These schemes are 'deflate' (the
- zlib algorithm), 'gzip' and 'compress'. A client requests that the server
- perform an encoding by including an Accept-Encoding header in the request
- document. The value of the header should be one of the recognized tokens
- 'deflate', ... (there's a way to register new schemes/tokens, see sec 3.5 of
- the spec). A server MAY honor the client's encoding request. When a response
- is encoded, the server includes a Content-Encoding header in the
- response. The value of the Content-Encoding header indicates which scheme was
- used to encode the data.
-
- A client may tell a server that it can understand several different encoding
- schemes. In this case the server may choose any one of those and use it to
- encode the response (indicating which one using the Content-Encoding header).
+ response. This is usually used to compress a response using one (or more)
+ encodings from a set of commonly available compression techniques. These
+ schemes include 'deflate' (the zlib algorithm), 'gzip' 'br' (brotli) and
+ 'compress'. A client requests that the server perform an encoding by including
+ an Accept-Encoding header in the request document. The value of the header
+ should be one of the recognized tokens 'deflate', ... (there's a way to
+ register new schemes/tokens, see sec 3.5 of the spec). A server MAY honor
+ the client's encoding request. When a response is encoded, the server
+ includes a Content-Encoding header in the response. The value of the
+ Content-Encoding header indicates which encodings were used to encode the
+ data, in the order in which they were applied.
+
It's also possible for a client to attach priorities to different schemes so
that the server knows which it prefers. See sec 14.3 of RFC 2616 for more
- information on the Accept-Encoding header.
+ information on the Accept-Encoding header. See sec [3.1.2.2 of RFC 7231][15]
+ for more information on the Content-Encoding header.
## Supported content encodings
- The 'deflate' and 'gzip' content encoding are supported by libcurl. Both
- regular and chunked transfers work fine. The zlib library is required for
- this feature.
+ The 'deflate', 'gzip' and 'br' content encodings are supported by libcurl.
+ Both regular and chunked transfers work fine. The zlib library is required
+ for the 'deflate' and 'gzip' encodings, while the brotli decoding library is
+ for the 'br' encoding.
## The libcurl interface
@@ -688,14 +674,15 @@ Content Encoding
where string is the intended value of the Accept-Encoding header.
- Currently, libcurl only understands how to process responses that use the
- "deflate" or "gzip" Content-Encoding, so the only values for
- [`CURLOPT_ACCEPT_ENCODING`][5] that will work (besides "identity," which does
- nothing) are "deflate" and "gzip" If a response is encoded using the
- "compress" or methods, libcurl will return an error indicating that the
- response could not be decoded. If <string> is NULL no Accept-Encoding header
- is generated. If <string> is a zero-length string, then an Accept-Encoding
- header containing all supported encodings will be generated.
+ Currently, libcurl does support multiple encodings but only
+ understands how to process responses that use the "deflate", "gzip" and/or
+ "br" content encodings, so the only values for [`CURLOPT_ACCEPT_ENCODING`][5]
+ that will work (besides "identity," which does nothing) are "deflate",
+ "gzip" and "br". If a response is encoded using the "compress" or methods,
+ libcurl will return an error indicating that the response could
+ not be decoded. If <string> is NULL no Accept-Encoding header is generated.
+ If <string> is a zero-length string, then an Accept-Encoding header
+ containing all supported encodings will be generated.
The [`CURLOPT_ACCEPT_ENCODING`][5] must be set to any non-NULL value for
content to be automatically decoded. If it is not set and the server still
@@ -1091,3 +1078,4 @@ for older and later versions as things don't change drastically that often.
[12]: https://curl.haxx.se/libcurl/c/curl_multi_fdset.html
[13]: https://curl.haxx.se/libcurl/c/curl_multi_add_handle.html
[14]: https://curl.haxx.se/libcurl/c/curl_multi_info_read.html
+[15]: https://tools.ietf.org/html/rfc7231#section-3.1.2.2
diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS
index 1773194..961a628 100644
--- a/docs/KNOWN_BUGS
+++ b/docs/KNOWN_BUGS
@@ -18,7 +18,6 @@ problems may have been fixed or changed somewhat since this was written!
1.4 multipart formposts file name encoding
1.5 Expect-100 meets 417
1.6 Unnecessary close when 401 received waiting for 100
- 1.8 DNS timing is wrong for HTTP redirects
1.9 HTTP/2 frames while in the connection pool kill reuse
1.10 Strips trailing dot from host name
1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM
@@ -83,6 +82,7 @@ problems may have been fixed or changed somewhat since this was written!
11.1 Curl leaks .onion hostnames in DNS
11.2 error buffer not set if connection to multiple addresses fails
11.3 c-ares deviates from stock resolver on http://1346569778
+ 11.4 HTTP test server 'connection-monitor' problems
12. LDAP and OpenLDAP
12.1 OpenLDAP hangs after returning results
@@ -140,12 +140,6 @@ problems may have been fixed or changed somewhat since this was written!
waiting for the the 100-continue response.
https://curl.haxx.se/mail/lib-2008-08/0462.html
-1.8 DNS timing is wrong for HTTP redirects
-
- When extracting timing information after HTTP redirects, only the last
- transfer's results are returned and not the totals:
- https://github.com/curl/curl/issues/522
-
1.9 HTTP/2 frames while in the connection pool kill reuse
If the server sends HTTP/2 frames (like for example an HTTP/2 PING frame) to
@@ -322,7 +316,6 @@ problems may have been fixed or changed somewhat since this was written!
The cmake build setup lacks several features that the autoconf build
offers. This includes:
- - symbol hiding when the shared library is built
- use of correct soname for the shared library build
- support for several TLS backends are missing
- the unit tests cause link failures in regular non-static builds
@@ -559,6 +552,13 @@ problems may have been fixed or changed somewhat since this was written!
See https://github.com/curl/curl/issues/893
+11.4 HTTP test server 'connection-monitor' problems
+
+ The 'connection-monitor' feature of the sws HTTP test server doesn't work
+ properly if some tests are run in unexpected order. Like 1509 and then 1525.
+
+ See https://github.com/curl/curl/issues/868
+
12. LDAP and OpenLDAP
diff --git a/docs/MAIL-ETIQUETTE b/docs/MAIL-ETIQUETTE
index 897fc9f..54f1090 100644
--- a/docs/MAIL-ETIQUETTE
+++ b/docs/MAIL-ETIQUETTE
@@ -15,6 +15,7 @@ MAIL ETIQUETTE
1.6 Handling trolls and spam
1.7 How to unsubscribe
1.8 I posted, now what?
+ 1.9 Your emails are public
2. Sending mail
2.1 Reply or New Mail
@@ -118,9 +119,9 @@ MAIL ETIQUETTE
to the page for the particular mailing list you're subscribed to and you enter
your email address and password and press the unsubscribe button.
- Also, the instructions to unsubscribe are included in the headers of every
- mail that is sent out to all curl related mailing lists and there's a footer
- in each mail that links to the "admin" page on which you can unsubscribe and
+ Also, the instructions to unsubscribe are included in the headers of every
+ mail that is sent out to all curl related mailing lists and there's a footer
+ in each mail that links to the "admin" page on which you can unsubscribe and
change other options.
You NEVER EVER email the mailing list requesting someone else to take you off
@@ -151,7 +152,7 @@ MAIL ETIQUETTE
or repeat the same steps in their locations.
Failing to include details will only delay responses and make people respond
- and ask for more details and you will have to send a follow-up email that
+ and ask for more details and you will have to send a follow-up email that
includes them.
Expect the responses to primarily help YOU debug the issue, or ask YOU
@@ -162,6 +163,27 @@ MAIL ETIQUETTE
chances are that people will ignore you at will and your chances to get
responses in the future will greatly diminish.
+ 1.9 Your emails are public
+
+ Your email, its contents and all its headers and the details in those
+ headers will be received by every subscriber of the mailing list that you
+ send your email to.
+
+ Your email as sent to a curl mailing list will end up in mail archives, on
+ the curl web site and elsewhere, for others to see and read. Today and in
+ the future. In addition to the archives, the mail is sent out to thousands
+ of individuals. There is no way to undo a sent email.
+
+ When sending emails to a curl mailing list, do not include sensitive
+ information such as user names and passwords; use fake ones, temporary ones
+ or just remove them completely from the mail. Note that this includes base64
+ encoded HTTP Basic auth headers.
+
+ This public nature of the curl mailing lists makes automaticly inserted mail
+ footers about mails being "private" or "only meant for the receipient" or
+ similar even more silly than usual. Because they are absolutely not private
+ when sent to a public mailing list.
+
2. Sending mail
@@ -261,4 +283,3 @@ MAIL ETIQUETTE
Getting the solution posted also helps other users that experience the same
problem(s). They get to see (possibly in the web archives) that the
suggested fixes actually has helped at least one person.
-
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 086b8c1..ae5ceec 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -46,7 +46,7 @@ EXTRA_DIST = MANUAL BUGS CONTRIBUTE.md FAQ FEATURES INTERNALS.md SSLCERTS.md
README.netware MAIL-ETIQUETTE HTTP-COOKIES.md SECURITY.md RELEASE-PROCEDURE \
SSL-PROBLEMS.md HTTP2.md ROADMAP.md CODE_OF_CONDUCT.md CODE_STYLE.md \
CHECKSRC.md CMakeLists.txt README.md CIPHERS.md INSTALL.cmake README.cmake \
- $(noinst_man_MANS)
+ $(noinst_man_MANS) HELP-US.md
MAN2HTML= roffit $< >$@
@@ -81,3 +81,6 @@ pdf: $(PDFPAGES)
rm $$foo.ps; \
echo "converted $< to $@")
+distclean:
+ rm -f $(CLEANFILES)
+
diff --git a/docs/RELEASE-PROCEDURE b/docs/RELEASE-PROCEDURE
index 5137f55..b7f8fcd 100644
--- a/docs/RELEASE-PROCEDURE
+++ b/docs/RELEASE-PROCEDURE
@@ -83,10 +83,13 @@ Coming dates
Based on the description above, here are some planned release dates (at the
time of this writing):
-- June 14, 2017 (version 7.54.1)
-- August 9, 2017
-- October 4, 2017
- November 29, 2017
- January 24, 2018
- March 21, 2018
- May 16, 2018
+- July 11, 2018
+- September 5, 2018
+- October 31, 2018
+- December 26, 2018
+- February 20, 2019
+- April 17, 2019
diff --git a/docs/RESOURCES b/docs/RESOURCES
index 1ad8aac..2880b8f 100644
--- a/docs/RESOURCES
+++ b/docs/RESOURCES
@@ -81,3 +81,5 @@ This document lists documents and standards used by curl.
RFC 4616 - PLAIN authentication
RFC 4954 - SMTP Authentication
+
+ RFC 7932 - Brotli Compressed Data Format
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index 1007ccb..64989b1 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -1,20 +1,14 @@
curl the next few years - perhaps
=================================
-Roadmap of things Daniel Stenberg and Steve Holme want to work on next. It is
-intended to serve as a guideline for others for information, feedback and
-possible participation.
+Roadmap of things Daniel Stenberg wants to work on next. It is intended to
+serve as a guideline for others for information, feedback and possible
+participation.
QUIC
----
-The standardization process of QUIC has been taken to the IETF and can be
-followed on the [IETF QUIC Mailing
-list](https://www.ietf.org/mailman/listinfo/quic). I'd like us to get on the
-bandwagon. Ideally, this would be done with a separate library/project to
-handle the binary/framing layer in a similar fashion to how HTTP/2 is
-implemented. This, to allow other projects to benefit from the work and to
-thus broaden the interest and chance of others to participate.
+ See the [QUIC wiki page](https://github.com/curl/curl/wiki/QUIC).
HTTP cookies
------------
@@ -34,85 +28,15 @@ SRV records
How to find services for specific domains/hosts.
-curl_formadd()
---------------
-
-make sure there's an easy handle passed in to `curl_formadd()`,
-`curl_formget()` and `curl_formfree()` by adding replacement functions and
-deprecating the old ones to allow custom mallocs and more.
-
-Or perhaps even better: revamp the formpost API completely while we're at it
-and making something that is easier to use and understand:
-
- https://github.com/curl/curl/wiki/formpost-API-redesigned
-
-Third-party SASL
-----------------
-
-Add support for third-party SASL libraries such as Cyrus SASL.
-
-SASL authentication in LDAP
----------------------------
-
-...
-
-Simplify the SMTP email
------------------------
-
-Simplify the SMTP email interface so that programmers don't have to
-construct the body of an email that contains all the headers, alternative
-content, images and attachments - maintain raw interface so that
-programmers that want to do this can
-
-email capabilities
-------------------
-
-Allow the email protocols to return the capabilities before
-authenticating. This will allow an application to decide on the best
-authentication mechanism
-
-Win32 pthreads
---------------
-
-Allow Windows threading model to be replaced by Win32 pthreads port
-
-dynamic buffer size
--------------------
-
-Implement a dynamic buffer size to allow SFTP to use much larger buffers and
-possibly allow the size to be customizable by applications. Use less memory
-when handles are not in use?
-
-New stuff - curl
-----------------
-
-1. Embed a language interpreter (lua?). For that middle ground where curl
- isn’t enough and a libcurl binding feels “too muchâ€. Build-time conditional
- of course.
-
-2. Simplify the SMTP command line so that the headers and multi-part content
- don't have to be constructed before calling curl
-
Improve
-------
-1. build for windows (considered hard by many users)
-
-2. curl -h output (considered overwhelming to users)
+1. curl -h output (considered overwhelming to users).
-3. we have > 200 command line options, is there a way to redo things to
+2. We have > 200 command line options, is there a way to redo things to
simplify or improve the situation as we are likely to keep adding
- features/options in the future too
-
-4. authentication framework (consider merging HTTP and SASL authentication to
- give one API for protocols to call)
+ features/options in the future too.
-5. Perform some of the clean up from the TODO document, removing old
+3. Perform some of the clean up from the TODO document, removing old
definitions and such like that are currently earmarked to be removed years
- ago
-
-Remove
-------
-
-1. makefile.vc files as there is no point in maintaining two sets of Windows
- makefiles. Note: These are currently being used by the Windows autobuilds
+ ago.
diff --git a/docs/THANKS b/docs/THANKS
index 5e4a98e..f71a3f1 100644
--- a/docs/THANKS
+++ b/docs/THANKS
@@ -40,8 +40,10 @@ Alex Bligh
Alex Chan
Alex Fishman
Alex Gruz
+Alex Malinovich
Alex McLellan
Alex Neblett
+Alex Nichols
Alex Potapenko
Alex Rousskov
Alex Suykov
@@ -60,11 +62,13 @@ Alexander Sinditskiy
Alexander Traud
Alexander Zhuravlev
Alexey Borzov
+Alexey Melnichuk
Alexey Pesternikov
Alexey Simak
Alexey Zakhlestin
Alexis Carvalho
Alexis La Goutte
+Alfonso Martone
Alfred Gebert
Allen Pulsifer
Alona Rossen
@@ -92,6 +96,7 @@ Andreas Streichardt
Andreas Wurf
Andrei Benea
Andrei Cipu
+Andrei Karas
Andrei Kurushin
Andrei Sedoi
Andrej E Baranov
@@ -102,6 +107,7 @@ Andrew Francis
Andrew Fuller
Andrew Krieger
Andrew Kurushin
+Andrew Lambert
Andrew Moise
Andrew Robbins
Andrew Wansink
@@ -130,6 +136,7 @@ Arkadiusz Miskiewicz
Armel Asselin
Arnaud Compan
Arnaud Ebalard
+Artak Galoyan
Arthur Murray
Arve Knudsen
Arvid Norberg
@@ -158,6 +165,7 @@ Benjamin Gerard
Benjamin Gilbert
Benjamin Johnson
Benjamin Kircher
+Benjamin Sergeant
Benoit Neil
Benoit Sigoure
Bernard Leak
@@ -172,6 +180,7 @@ Bill Egert
Bill Hoffman
Bill Middlecamp
Bill Nagel
+Bill Pyne
Bjoern Sikora
Bjorn Augustsson
Bjorn Reese
@@ -302,6 +311,7 @@ Dan Nelson
Dan Petitt
Dan Torop
Dan Zitter
+Daniel Bankhead
Daniel Black
Daniel Cater
Daniel Egger
@@ -384,8 +394,10 @@ Dimitrios Siganos
Dimitris Sarris
Dinar
Dirk Eddelbuettel
+Dirk Feytons
Dirk Manske
Dmitri Shubin
+Dmitri Tikhonov
Dmitriy Sergeyev
Dmitry Bartsevich
Dmitry Eremin-Solenikov
@@ -477,6 +489,7 @@ Fabrizio Ammollo
Fahim Chandurwala
Fedor Karpelevitch
Feist Josselin
+Felix Kaiser
Felix Yan
Felix von Leitner
Feng Tu
@@ -487,6 +500,7 @@ Florian Weimer
Forrest Cahoon
Francisco Moraes
Francois Petitjean
+Frank Denis
Frank Gevaerts
Frank Hempel
Frank Keeney
@@ -595,6 +609,7 @@ Howard Chu
Hubert Kario
Hzhijun
Ian D Allen
+Ian Fette
Ian Ford
Ian Gulliver
Ian Lynagh
@@ -618,6 +633,7 @@ Ishan SinghLevett
Ivan Avdeev
Ivo Bellin Salarin
Jack Zhang
+Jackarain on github
Jacky Lam
Jacob Meuser
Jacob Moshenko
@@ -640,6 +656,7 @@ James Slaughter
Jamie Lokier
Jamie Newton
Jamie Wilkinson
+Jan Alexander Steffens
Jan Ehrhardt
Jan Koen Annot
Jan Kunder
@@ -656,6 +673,7 @@ Jason McDonald
Jason S. Priebe
Javier Barroso
Javier G. Sogo
+Javier Sixto
Jay Austin
Jayesh A Shah
Jaz Fresh
@@ -721,6 +739,7 @@ Johannes Schindelin
John Bradshaw
John Coffey
John Crow
+John David Anglin
John Dennis
John Dunn
John E. Malmberg
@@ -736,11 +755,13 @@ John Marino
John Marshall
John McGowan
John P. McCaskey
+John Starks
John Suprock
John Wanghui
John Wilkinson
John-Mark Bell
Johnny Luong
+Jon DeVree
Jon Grubbs
Jon Nelson
Jon Sargeant
@@ -782,6 +803,7 @@ Julien Nabet
Julien Royer
Jun-ichiro itojun Hagino
Jurij Smakov
+Juro Bystricky
Justin Clift
Justin Ehlert
Justin Fletcher
@@ -819,6 +841,7 @@ Kevin Ji
Kevin Lussier
Kevin Reed
Kevin Roth
+Kevin Smith
Kim Minjoong
Kim Rinnewitz
Kim Vandry
@@ -832,6 +855,7 @@ Krishnendu Majumdar
Krister Johansen
Kristian Gunstone
Kristian Köhntopp
+Kristiyan Tsaklev
Kurt Fankhauser
Kyle J. McKay
Kyle L. Huff
@@ -852,6 +876,7 @@ Lars Torben Wilson
Lau Hang Kin
Laurent Rabret
Lauri Kasanen
+Lawrence Wagerfield
Legoff Vincent
Lehel Bernadt
Leif W
@@ -878,6 +903,7 @@ Loic Dachary
Loren Kirkby
Luan Cestari
Luca Altea
+Luca Boccassi
Lucas Adamski
Lucas Pardue
Ludek Finstrle
@@ -903,6 +929,7 @@ Mamoru Tasaka
Mandy Wu
Manfred Schwarb
Manuel Massing
+Marc Aldorasi
Marc Boucher
Marc Deslauriers
Marc Doughty
@@ -974,6 +1001,7 @@ Matteo Rocco
Matthew Blain
Matthew Clarke
Matthew Hall
+Matthew Kerwin
Matthias Bolte
Maurice Barnum
Mauro Iorio
@@ -994,6 +1022,7 @@ Michael Calmer
Michael Cronenworth
Michael Curtis
Michael Day
+Michael Felt
Michael Goffioul
Michael Jahn
Michael Jerris
@@ -1069,6 +1098,7 @@ Nico Baggus
Nicolas Berloquin
Nicolas Croiset
Nicolas François
+Nicolas Morey-Chaisemartin
Niels van Tongeren
Nikita Schmidt
Nikitinskit Dmitriy
@@ -1090,6 +1120,7 @@ Ola Mork
Olaf Flebbe
Olaf Stüben
Oleg Pudeyev
+Oli Kingshott
Oliver Gondža
Oliver Graute
Oliver Kuckertz
@@ -1136,13 +1167,17 @@ Paul Oliver
Paul Querna
Paul Saab
Pavel Cenek
+Pavel Gushchin
Pavel Orehov
+Pavel P
Pavel Raiskup
Pavel Rochnyak
+Pavol Markovic
Pawel A. Gajda
Pawel Kierski
Pedro Larroy
Pedro Neves
+Per Lundberg
Per Malmberg
Peter Bray
Peter Forret
@@ -1151,10 +1186,12 @@ Peter Gal
Peter Heuchert
Peter Hjalmarsson
Peter Korsgaard
+Peter Lamare
Peter Lamberg
Peter Laser
Peter O'Gorman
Peter Pentchev
+Peter Piekarski
Peter Silva
Peter Su
Peter Sylvester
@@ -1167,6 +1204,7 @@ Peteris Krumins
Petr Bahula
Petr Novak
Petr Pisar
+Petr Voytsik
Phil Blundell
Phil Crump
Phil Karn
@@ -1253,6 +1291,7 @@ Rick Jones
Rick Richardson
Ricki Hirner
Rider Linden
+Rob Cotrone
Rob Crittenden
Rob Davies
Rob Jones
@@ -1303,6 +1342,7 @@ Ryan Winograd
Ryuichi KAWAMATA
Rémy Léone
S. Moonesamy
+SBKarr on github
Salah-Eddin Shaban
Salvador Dávila
Salvatore Sorrentino
@@ -1544,6 +1584,7 @@ William Ahern
Wojciech Zwiefka
Wouter Van Rooy
Wu Yongzheng
+Wyatt O'Day
Xavier Bouchoux
Xiangbin Li
Yaakov Selkowitz
@@ -1564,18 +1605,23 @@ Yves Arrouye
Yves Lejeune
Zdenek Pavlas
Zekun Ni
+Zenju on github
Zmey Petroff
Zvi Har'El
afrind on github
+arainchik on github
asavah on github
baumanj on github
bsammon on github
-canavan at github
-destman at github
+canavan on github
+cbartl on github
+destman on github
dkjjr89 on github
eXeC64 on github
-jonrumsey at github
+hsiao yi
+imilli on github
jonrumsey on github
+joshhe on github
jveazey on github
ka7 on github
kreshano on github
@@ -1585,21 +1631,24 @@ madblobfish on github
marc-groundctl on github
mccormickt12 on github
mkzero on github
+moohoorama on github
neex on github
neheb on github
nk
nopjmp on github
-olesteban at github
+olesteban on github
+omau on github
ovidiu-benea on github
paulharris on github
silveja1 on github
-stootill at github
+stootill on github
swalkaus at yahoo.com
tarek112 on github
tommink[at]post.pl
vanillajonathan on github
wmsch on github
-wyattoday at github
+wyattoday on github
+youngchopin on github
zelinchen on github
İsmail Dönmez
Štefan Kremeň
diff --git a/docs/TODO b/docs/TODO
index dde2994..4a0d4ae 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -27,7 +27,6 @@
1.9 Cache negative name resolves
1.10 auto-detect proxy
1.11 minimize dependencies with dynamically loaded modules
- 1.12 have form functions use CURL handle argument
1.14 Typesafe curl_easy_setopt()
1.15 Monitor connections in the connection pool
1.16 Try to URL encode given URL
@@ -57,6 +56,7 @@
4.5 ASCII support
4.6 GSSAPI via Windows SSPI
4.7 STAT for LIST without data connection
+ 4.8 Option to ignore private IP addresses in PASV response
5. HTTP
5.1 Better persistency for HTTP 1.0
@@ -65,11 +65,8 @@
5.4 HTTP Digest using SHA-256
5.5 auth= in URLs
5.6 Refuse "downgrade" redirects
- 5.7 Brotli compression
- 5.8 QUIC
- 5.9 Improve formpost API
- 5.10 Leave secure cookies alone
- 5.11 Chunked transfer multipart formpost
+ 5.7 QUIC
+ 5.8 Leave secure cookies alone
6. TELNET
6.1 ditch stdin
@@ -139,7 +136,6 @@
18.2 glob posts
18.3 prevent file overwriting
18.4 simultaneous parallel transfers
- 18.5 provide formpost headers
18.6 warning when setting an option
18.8 offer color-coded HTTP header output
18.9 Choose the name of file in braces for complex URLs
@@ -210,7 +206,7 @@
1.5 get rid of PATH_MAX
Having code use and rely on PATH_MAX is not nice:
- http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
+ https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
Currently the SSH based code uses it a bit, but to remove PATH_MAX from there
we need libssh2 to properly tell us when we pass in a too small buffer and
@@ -276,18 +272,6 @@
app/invoke/used protocols would be necessary to load. See
https://github.com/curl/curl/issues/349
-1.12 have form functions use CURL handle argument
-
- curl_formadd() and curl_formget() both currently have no CURL handle
- argument, but both can use a callback that is set in the easy handle, and
- thus curl_formget() with callback cannot function without first having
- curl_easy_perform() (or similar) called - which is hard to grasp and a design
- mistake.
-
- The curl_formadd() design can probably also be reconsidered to make it easier
- to use and less error-prone. Probably easiest by splitting it into several
- function calls.
-
1.14 Typesafe curl_easy_setopt()
One of the most common problems in libcurl using applications is the lack of
@@ -465,17 +449,23 @@
4.6 GSSAPI via Windows SSPI
-In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5)
-via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add
-support for GSSAPI authentication via Windows SSPI.
+ In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5)
+ via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add
+ support for GSSAPI authentication via Windows SSPI.
4.7 STAT for LIST without data connection
-Some FTP servers allow STAT for listing directories instead of using LIST, and
-the response is then sent over the control connection instead of as the
-otherwise usedw data connection: http://www.nsftools.com/tips/RawFTP.htm#STAT
+ Some FTP servers allow STAT for listing directories instead of using LIST,
+ and the response is then sent over the control connection instead of as the
+ otherwise usedw data connection: http://www.nsftools.com/tips/RawFTP.htm#STAT
+
+ This is not detailed in any FTP specification.
+
+4.8 Option to ignore private IP addresses in PASV response
-This is not detailed in any FTP specification.
+ Some servers respond with and some other FTP client implementations can
+ ignore private (RFC 1918 style) IP addresses when received in PASV responses.
+ To consider for libcurl as well. See https://github.com/curl/curl/issues/1455
5. HTTP
@@ -530,13 +520,7 @@ This is not detailed in any FTP specification.
Consider a way to tell curl to refuse to "downgrade" protocol with a redirect
and/or possibly a bit that refuses redirect to change protocol completely.
-5.7 Brotli compression
-
- Brotli compression performs better than gzip and is being implemented by
- browsers and servers widely. The algorithm: https://github.com/google/brotli
- The Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=366559
-
-5.8 QUIC
+5.7 QUIC
The standardization process of QUIC has been taken to the IETF and can be
followed on the [IETF QUIC Mailing
@@ -546,29 +530,13 @@ This is not detailed in any FTP specification.
implemented. This, to allow other projects to benefit from the work and to
thus broaden the interest and chance of others to participate.
-5.9 Improve formpost API
-
- Revamp the formpost API and making something that is easier to use and
- understand:
-
- https://github.com/curl/curl/wiki/formpost-API-redesigned
-
-5.10 Leave secure cookies alone
+5.8 Leave secure cookies alone
Non-secure origins (HTTP sites) should not be allowed to set or modify
cookies with the 'secure' property:
https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01
-5.11 Chunked transfer multipart formpost
-
- For a case where the file is being made during the upload is progressing
- (like passed on stdin to the curl tool), we cannot know the size before-hand
- and we rather not read the entire thing into memory before it can start the
- upload.
-
- https://github.com/curl/curl/issues/1139
-
6. TELNET
@@ -911,20 +879,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Using the multi interface would also allow properly using parallel transfers
with HTTP/2 and supporting HTTP/2 server push from the command line.
-18.5 provide formpost headers
-
- Extending the capabilities of the multipart formposting. How about leaving
- the ';type=foo' syntax as it is and adding an extra tag (headers) which
- works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where
- fil1.hdr contains extra headers like
-
- Content-Type: text/plain; charset=KOI8-R"
- Content-Transfer-Encoding: base64
- X-User-Comment: Please don't use browser specific HTML code
-
- which should overwrite the program reasonable defaults (plain/text,
- 8bit...)
-
18.6 warning when setting an option
Display a warning when libcurl returns an error when setting an option.
diff --git a/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc
index 7eea5c6..e8f4641 100644
--- a/docs/cmdline-opts/Makefile.inc
+++ b/docs/cmdline-opts/Makefile.inc
@@ -1,7 +1,8 @@
# Shared between Makefile.am and CMakeLists.txt
DPAGES = abstract-unix-socket.d anyauth.d append.d basic.d cacert.d capath.d cert.d \
- cert-status.d cert-type.d ciphers.d compressed.d config.d \
+ cert-status.d cert-type.d ciphers.d compressed.d compressed-ssh.d \
+ config.d \
connect-timeout.d connect-to.d continue-at.d cookie.d cookie-jar.d \
create-dirs.d crlf.d crlfile.d data-ascii.d data-binary.d data.d \
data-raw.d data-urlencode.d delegation.d digest.d disable.d \
diff --git a/docs/cmdline-opts/cacert.d b/docs/cmdline-opts/cacert.d
index 04e1139..b2ecf90 100644
--- a/docs/cmdline-opts/cacert.d
+++ b/docs/cmdline-opts/cacert.d
@@ -1,5 +1,5 @@
Long: cacert
-Arg: <CA certificate>
+Arg: <file>
Help: CA certificate to verify peer against
Protocols: TLS
---
diff --git a/docs/cmdline-opts/compressed-ssh.d b/docs/cmdline-opts/compressed-ssh.d
new file mode 100644
index 0000000..583452a
--- /dev/null
+++ b/docs/cmdline-opts/compressed-ssh.d
@@ -0,0 +1,7 @@
+Long: compressed-ssh
+Help: Enable SSH compression
+Protocols: SCP SFTP
+Added: 7.56.0
+---
+Enables built-in SSH compression.
+This is a request, not an order; the server may or may not do it.
diff --git a/docs/cmdline-opts/form-string.d b/docs/cmdline-opts/form-string.d
index 8079055..49d0d44 100644
--- a/docs/cmdline-opts/form-string.d
+++ b/docs/cmdline-opts/form-string.d
@@ -1,6 +1,6 @@
Long: form-string
-Help: Specify HTTP multipart POST data
-Protocols: HTTP
+Help: Specify multipart MIME data
+Protocols: HTTP SMTP IMAP
Arg: <name=string>
See-also: form
---
diff --git a/docs/cmdline-opts/form.d b/docs/cmdline-opts/form.d
index 87a7d07..d95d0cc 100644
--- a/docs/cmdline-opts/form.d
+++ b/docs/cmdline-opts/form.d
@@ -1,28 +1,36 @@
Long: form
Short: F
Arg: <name=content>
-Help: Specify HTTP multipart POST data
-Protocols: HTTP
+Help: Specify multipart MIME data
+Protocols: HTTP SMTP IMAP
Mutexed: data head upload
---
-This lets curl emulate a filled-in form in which a user has pressed the submit
-button. This causes curl to POST data using the Content-Type
-multipart/form-data according to RFC 2388. This enables uploading of binary
+For HTTP protocol family, this lets curl emulate a filled-in form in which a
+user has pressed the submit button. This causes curl to POST data using the
+Content-Type multipart/form-data according to RFC 2388.
+
+For SMTP and IMAP protocols, this is the mean to compose a multipart mail
+message to transmit.
+
+This enables uploading of binary
files etc. To force the 'content' part to be a file, prefix the file name with
an @ sign. To just get the content part from a file, prefix the file name with
the symbol <. The difference between @ and < is then that @ makes a file get
attached in the post as a file upload, while the < makes a text field and just
get the contents for that text field from a file.
-Example: to send an image to a server, where \&'profile' is the name of the
-form-field to which portrait.jpg will be the input:
+Example: to send an image to an HTTP server, where \&'profile' is the name of
+the form-field to which portrait.jpg will be the input:
curl -F profile=@portrait.jpg https://example.com/upload.cgi
To read content from stdin instead of a file, use - as the filename. This goes
-for both @ and < constructs. Unfortunately it does not support reading the
-file from a named pipe or similar, as it needs the full size before the
-transfer starts.
+for both @ and < constructs. If stdin is not attached to a regular file, it is
+buffered first to determine its size and allow a possible resend. Defining a
+part's data from a named non-regular file (such as a named pipe or similar) is
+unfortunately not subject to buffering and will be effectively read at
+transmission time; since the full size is unknown before the transfer starts,
+data is sent as chunks by HTTP and rejected by IMAP.
You can also tell curl what Content-Type to use by using 'type=', in a manner
similar to:
@@ -49,6 +57,72 @@ or
Note that if a filename/path is quoted by double-quotes, any double-quote
or backslash within the filename must be escaped by backslash.
+Quoting must also be applied to non-file data if it contains semicolons,
+leading/trailing spaces or leading double quotes:
+
+ curl -F 'colors="red; green; blue";type=text/x-myapp' example.com
+
+You can add custom headers to the field by setting headers=, like
+
+ curl -F "submit=OK;headers=\\"X-submit-type: OK\\"" example.com
+
+or
+
+ curl -F "submit=OK;headers=@headerfile" example.com
+
+The headers= keyword may appear more that once and above notes about quoting
+apply. When headers are read from a file, Empty lines and lines starting
+with '#' are comments and ignored; each header can be folded by splitting
+between two words and starting the continuation line with a space; embedded
+carriage-returns and trailing spaces are stripped.
+Here is an example of a header file contents:
+
+ # This file contain two headers.
+.br
+ X-header-1: this is a header
+
+ # The following header is folded.
+.br
+ X-header-2: this is
+.br
+ another header
+
+
+To support sending multipart mail messages, the syntax is extended as follows:
+.br
+- name can be omitted: the equal sign is the first character of the argument,
+.br
+- if data starts with '(', this signals to start a new multipart: it can be
+followed by a content type specification.
+.br
+- a multipart can be terminated with a '=)' argument.
+
+Example: the following command sends an SMTP mime e-mail consisting in an
+inline part in two alternative formats: plain text and HTML. It attaches a
+text file:
+
+ curl -F '=(;type=multipart/alternative' \\
+.br
+ -F '=plain text message' \\
+.br
+ -F '= <body>HTML message</body>;type=text/html' \\
+.br
+ -F '=)' -F '=@textfile.txt' ... smtp://example.com
+
+Data can be encoded for transfer using encoder=. Available encodings are
+\fIbinary\fP and \fI8bit\fP that do nothing else than adding the corresponding
+Content-Transfer-Encoding header, \fI7bit\fP that only rejects 8-bit characters
+with a transfer error, \fIquoted-printable\fP and \fIbase64\fP that encodes
+data according to the corresponding schemes, limiting lines length to
+76 characters.
+
+Example: send multipart mail with a quoted-printable text message and a
+base64 attached file:
+
+ curl -F '=text message;encoder=quoted-printable' \\
+.br
+ -F '=@localfile;encoder=base64' ... smtp://example.com
+
See further examples and details in the MANUAL.
This option can be used multiple times.
diff --git a/docs/cmdline-opts/interface.d b/docs/cmdline-opts/interface.d
index da84cd2..bd08176 100644
--- a/docs/cmdline-opts/interface.d
+++ b/docs/cmdline-opts/interface.d
@@ -10,3 +10,7 @@ name, IP address or host name. An example could look like:
curl --interface eth0:1 https://www.example.com/
If this option is used several times, the last one will be used.
+
+On Linux it can be used to specify a VRF, but the binary needs to either
+have CAP_NET_RAW or to be ran as root. More information about Linux VRF:
+https://www.kernel.org/doc/Documentation/networking/vrf.txt
diff --git a/docs/cmdline-opts/request-target.d b/docs/cmdline-opts/request-target.d
index 630f8b3..b46b4af 100644
--- a/docs/cmdline-opts/request-target.d
+++ b/docs/cmdline-opts/request-target.d
@@ -1,6 +1,7 @@
Long: request-target
Help: Specify the target for this request
Protocols: HTTP
+Added: 7.55.0
---
Tells curl to use an alternative "target" (path) instead of using the path as
provided in the URL. Particularly useful when wanting to issue HTTP requests
diff --git a/docs/cmdline-opts/resolve.d b/docs/cmdline-opts/resolve.d
index ba3967a..91539b8 100644
--- a/docs/cmdline-opts/resolve.d
+++ b/docs/cmdline-opts/resolve.d
@@ -14,4 +14,6 @@ different ports.
The provided address set by this option will be used even if --ipv4 or --ipv6
is set to make curl use another IP version.
+Support for providing the IP address within [brackets] was added in 7.57.0.
+
This option can be used many times to add many host names to resolve.
diff --git a/docs/cmdline-opts/tlsv1.3.d b/docs/cmdline-opts/tlsv1.3.d
index 7d9640e..1235896 100644
--- a/docs/cmdline-opts/tlsv1.3.d
+++ b/docs/cmdline-opts/tlsv1.3.d
@@ -6,4 +6,5 @@ Added: 7.52.0
Forces curl to use TLS version 1.3 when connecting to a remote TLS server.
Note that TLS 1.3 is only supported by a subset of TLS backends. At the time
-of writing this, those are BoringSSL and NSS only.
+of this writing, they are BoringSSL, NSS, and Secure Transport (on iOS 11 or
+later, and macOS 10.13 or later).
diff --git a/docs/curl-config.1 b/docs/curl-config.1
index f1e7e9d..9285346 100644
--- a/docs/curl-config.1
+++ b/docs/curl-config.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl-config 1 "February 03, 2016" "Curl 7.55.1" "curl-config manual"
+.TH curl-config 1 "February 03, 2016" "Curl 7.57.0" "curl-config manual"
.SH NAME
curl-config \- Get information about a libcurl installation
diff --git a/docs/curl.1 b/docs/curl.1
index 4ad2b3c..dadc432 100644
--- a/docs/curl.1
+++ b/docs/curl.1
@@ -22,7 +22,7 @@
.\"
.\" DO NOT EDIT. Generated by the curl project gen.pl man page generator.
.\"
-.TH curl 1 "November 16, 2016" "Curl 7.55.1" "Curl Manual"
+.TH curl 1 "November 16, 2016" "Curl 7.57.0" "Curl Manual"
.SH NAME
curl \- transfer a URL
@@ -174,7 +174,7 @@ previously set option that sets a different authentication method (such as
Used together with \fI-u, --user\fP.
See also \fI--proxy-basic\fP.
-.IP "--cacert <CA certificate>"
+.IP "--cacert <file>"
(TLS) Tells curl to use the specified certificate file to verify the peer. The file
may contain multiple CA certificates. The certificate(s) must be in PEM
format. Normally curl is built to use a default file for this, so this option
@@ -262,6 +262,11 @@ specify valid ciphers. Read up on SSL cipher list details on this URL:
https://curl.haxx.se/docs/ssl-ciphers.html
If this option is used several times, the last one will be used.
+.IP "--compressed-ssh"
+(SCP SFTP) Enables built-in SSH compression.
+This is a request, not an order; the server may or may not do it.
+
+Added in 7.56.0.
.IP "--compressed"
(HTTP) Request a compressed response using one of the algorithms curl supports, and
save the uncompressed document. If this option is used and the server sends
@@ -649,7 +654,7 @@ or later, or OS X 10.9 or later) backends.
Added in 7.42.0.
.IP "--form-string <name=string>"
-(HTTP) Similar to \fI-F, --form\fP except that the value string for the named parameter is used
+(HTTP SMTP IMAP) Similar to \fI-F, --form\fP except that the value string for the named parameter is used
literally. Leading \&'@' and \&'<' characters, and the \&';type=' string in
the value have no special meaning. Use this in preference to \fI-F, --form\fP if
there's any possibility that the string value may accidentally trigger the
@@ -657,24 +662,32 @@ there's any possibility that the string value may accidentally trigger the
See also \fI-F, --form\fP.
.IP "-F, --form <name=content>"
-(HTTP) This lets curl emulate a filled-in form in which a user has pressed the submit
-button. This causes curl to POST data using the Content-Type
-multipart/form-data according to RFC 2388. This enables uploading of binary
+(HTTP SMTP IMAP) For HTTP protocol family, this lets curl emulate a filled-in form in which a
+user has pressed the submit button. This causes curl to POST data using the
+Content-Type multipart/form-data according to RFC 2388.
+
+For SMTP and IMAP protocols, this is the mean to compose a multipart mail
+message to transmit.
+
+This enables uploading of binary
files etc. To force the 'content' part to be a file, prefix the file name with
an @ sign. To just get the content part from a file, prefix the file name with
the symbol <. The difference between @ and < is then that @ makes a file get
attached in the post as a file upload, while the < makes a text field and just
get the contents for that text field from a file.
-Example: to send an image to a server, where \&'profile' is the name of the
-form-field to which portrait.jpg will be the input:
+Example: to send an image to an HTTP server, where \&'profile' is the name of
+the form-field to which portrait.jpg will be the input:
curl -F profile=@portrait.jpg https://example.com/upload.cgi
To read content from stdin instead of a file, use - as the filename. This goes
-for both @ and < constructs. Unfortunately it does not support reading the
-file from a named pipe or similar, as it needs the full size before the
-transfer starts.
+for both @ and < constructs. If stdin is not attached to a regular file, it is
+buffered first to determine its size and allow a possible resend. Defining a
+part's data from a named non-regular file (such as a named pipe or similar) is
+unfortunately not subject to buffering and will be effectively read at
+transmission time; since the full size is unknown before the transfer starts,
+data is sent as chunks by HTTP and rejected by IMAP.
You can also tell curl what Content-Type to use by using 'type=', in a manner
similar to:
@@ -701,6 +714,72 @@ or
Note that if a filename/path is quoted by double-quotes, any double-quote
or backslash within the filename must be escaped by backslash.
+Quoting must also be applied to non-file data if it contains semicolons,
+leading/trailing spaces or leading double quotes:
+
+ curl -F 'colors="red; green; blue";type=text/x-myapp' example.com
+
+You can add custom headers to the field by setting headers=, like
+
+ curl -F "submit=OK;headers=\\"X-submit-type: OK\\"" example.com
+
+or
+
+ curl -F "submit=OK;headers=@headerfile" example.com
+
+The headers= keyword may appear more that once and above notes about quoting
+apply. When headers are read from a file, Empty lines and lines starting
+with '#' are comments and ignored; each header can be folded by splitting
+between two words and starting the continuation line with a space; embedded
+carriage-returns and trailing spaces are stripped.
+Here is an example of a header file contents:
+
+ # This file contain two headers.
+.br
+ X-header-1: this is a header
+
+ # The following header is folded.
+.br
+ X-header-2: this is
+.br
+ another header
+
+
+To support sending multipart mail messages, the syntax is extended as follows:
+.br
+- name can be omitted: the equal sign is the first character of the argument,
+.br
+- if data starts with '(', this signals to start a new multipart: it can be
+followed by a content type specification.
+.br
+- a multipart can be terminated with a '=)' argument.
+
+Example: the following command sends an SMTP mime e-mail consisting in an
+inline part in two alternative formats: plain text and HTML. It attaches a
+text file:
+
+ curl -F '=(;type=multipart/alternative' \\
+.br
+ -F '=plain text message' \\
+.br
+ -F '= <body>HTML message</body>;type=text/html' \\
+.br
+ -F '=)' -F '=@textfile.txt' ... smtp://example.com
+
+Data can be encoded for transfer using encoder=. Available encodings are
+\fIbinary\fP and \fI8bit\fP that do nothing else than adding the corresponding
+Content-Transfer-Encoding header, \fI7bit\fP that only rejects 8-bit characters
+with a transfer error, \fIquoted-printable\fP and \fIbase64\fP that encodes
+data according to the corresponding schemes, limiting lines length to
+76 characters.
+
+Example: send multipart mail with a quoted-printable text message and a
+base64 attached file:
+
+ curl -F '=text message;encoder=quoted-printable' \\
+.br
+ -F '=@localfile;encoder=base64' ... smtp://example.com
+
See further examples and details in the MANUAL.
This option can be used multiple times.
@@ -943,6 +1022,10 @@ name, IP address or host name. An example could look like:
If this option is used several times, the last one will be used.
+On Linux it can be used to specify a VRF, but the binary needs to either
+have CAP_NET_RAW or to be ran as root. More information about Linux VRF:
+https://www.kernel.org/doc/Documentation/networking/vrf.txt
+
See also \fI--dns-interface\fP.
.IP "-4, --ipv4"
This option tells curl to resolve names to IPv4 addresses only, and not for
@@ -1820,6 +1903,8 @@ timestamp.
provided in the URL. Particularly useful when wanting to issue HTTP requests
without leading slash or other data that doesn't follow the regular URL
pattern, like "OPTIONS *".
+
+Added in 7.55.0.
.IP "-X, --request <command>"
(HTTP) Specifies a custom request method to use when communicating with the
HTTP server. The specified request method will be used instead of the method
@@ -1867,6 +1952,8 @@ different ports.
The provided address set by this option will be used even if \fI-4, --ipv4\fP or \fI-6, --ipv6\fP
is set to make curl use another IP version.
+Support for providing the IP address within [brackets] was added in 7.57.0.
+
This option can be used many times to add many host names to resolve.
Added in 7.21.3.
@@ -2201,7 +2288,8 @@ Added in 7.34.0.
(TLS) Forces curl to use TLS version 1.3 when connecting to a remote TLS server.
Note that TLS 1.3 is only supported by a subset of TLS backends. At the time
-of writing this, those are BoringSSL and NSS only.
+of this writing, they are BoringSSL, NSS, and Secure Transport (on iOS 11 or
+later, and macOS 10.13 or later).
Added in 7.52.0.
.IP "-1, --tlsv1"
diff --git a/docs/examples/10-at-a-time.c b/docs/examples/10-at-a-time.c
index 4555291..1da0ee2 100644
--- a/docs/examples/10-at-a-time.c
+++ b/docs/examples/10-at-a-time.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -114,7 +114,7 @@ int main(void)
CURLM *cm;
CURLMsg *msg;
long L;
- unsigned int C=0;
+ unsigned int C = 0;
int M, Q, U = -1;
fd_set R, W, E;
struct timeval T;
@@ -162,9 +162,9 @@ int main(void)
T.tv_sec = L/1000;
T.tv_usec = (L%1000)*1000;
- if(0 > select(M+1, &R, &W, &E, &T)) {
+ if(0 > select(M + 1, &R, &W, &E, &T)) {
fprintf(stderr, "E: select(%i,,,,%li): %i: %s\n",
- M+1, L, errno, strerror(errno));
+ M + 1, L, errno, strerror(errno));
return EXIT_FAILURE;
}
}
diff --git a/docs/examples/Makefile.inc b/docs/examples/Makefile.inc
index b92ad6b..075df9e 100644
--- a/docs/examples/Makefile.inc
+++ b/docs/examples/Makefile.inc
@@ -26,18 +26,20 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
https multi-app multi-debugcallback multi-double multi-post multi-single \
persistant post-callback postit2 sepheaders simple simplepost simplessl \
sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard \
- smtp-mail smtp-multi smtp-ssl smtp-tls smtp-vrfy smtp-expn rtsp \
- externalsocket resolve progressfunc pop3-retr pop3-list pop3-uidl \
+ smtp-mail smtp-mime smtp-multi smtp-ssl smtp-tls smtp-vrfy smtp-expn \
+ rtsp externalsocket resolve progressfunc pop3-retr pop3-list pop3-uidl \
pop3-dele pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi \
imap-list imap-lsub imap-fetch imap-store imap-append imap-examine \
imap-search imap-create imap-delete imap-copy imap-noop imap-ssl \
imap-tls imap-multi url2file sftpget ftpsget postinmemory http2-download \
- http2-upload http2-serverpush getredirect ftpuploadfrommem
+ http2-upload http2-serverpush getredirect ftpuploadfrommem \
+ ftpuploadresume sslbackend postit2-formadd multi-formadd \
+ shared-connection-cache
# These examples require external dependencies that may not be commonly
# available on POSIX systems, so don't bother attempting to compile them here.
COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \
- ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c \
+ ghiper.c hiperfifo.c htmltidy.c multithread.c \
opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \
multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c
diff --git a/docs/examples/anyauthput.c b/docs/examples/anyauthput.c
index 243a367..eb91d99 100644
--- a/docs/examples/anyauthput.c
+++ b/docs/examples/anyauthput.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -106,7 +106,7 @@ int main(int argc, char **argv)
if(argc < 3)
return 1;
- file= argv[1];
+ file = argv[1];
url = argv[2];
/* get the file size of the local file */
diff --git a/docs/examples/cacertinmem.c b/docs/examples/cacertinmem.c
index e3c49e0..43bb901 100644
--- a/docs/examples/cacertinmem.c
+++ b/docs/examples/cacertinmem.c
@@ -37,7 +37,7 @@ size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
{
X509_STORE *store;
- X509 *cert=NULL;
+ X509 *cert = NULL;
BIO *bio;
char *mypem = /* www.cacert.org */
"-----BEGIN CERTIFICATE-----\n"\
@@ -82,7 +82,7 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
"omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\n"\
"-----END CERTIFICATE-----\n";
/* get a BIO */
- bio=BIO_new_mem_buf(mypem, -1);
+ bio = BIO_new_mem_buf(mypem, -1);
/* use it to read the PEM formatted certificate from memory into an X509
* structure that SSL can use
*/
@@ -91,10 +91,10 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
printf("PEM_read_bio_X509 failed...\n");
/* get a pointer to the X509 certificate store (which may be empty!) */
- store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
+ store = SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
/* add our certificate to this store */
- if(X509_STORE_add_cert(store, cert)==0)
+ if(X509_STORE_add_cert(store, cert) == 0)
printf("error adding certificate\n");
/* decrease reference counts */
@@ -110,24 +110,24 @@ int main(void)
CURL *ch;
CURLcode rv;
- rv=curl_global_init(CURL_GLOBAL_ALL);
- ch=curl_easy_init();
- rv=curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
- rv=curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
- rv=curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
- rv=curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
- rv=curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, *writefunction);
- rv=curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
- rv=curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, *writefunction);
- rv=curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
- rv=curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
- rv=curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
- rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+ rv = curl_global_init(CURL_GLOBAL_ALL);
+ ch = curl_easy_init();
+ rv = curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
+ rv = curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+ rv = curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
+ rv = curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+ rv = curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, *writefunction);
+ rv = curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
+ rv = curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, *writefunction);
+ rv = curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
+ rv = curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+ rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
+ rv = curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
/* first try: retrieve page without cacerts' certificate -> will fail
*/
- rv=curl_easy_perform(ch);
- if(rv==CURLE_OK)
+ rv = curl_easy_perform(ch);
+ if(rv == CURLE_OK)
printf("*** transfer succeeded ***\n");
else
printf("*** transfer failed ***\n");
@@ -136,9 +136,9 @@ int main(void)
* load the certificate by installing a function doing the necessary
* "modifications" to the SSL CONTEXT just before link init
*/
- rv=curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
- rv=curl_easy_perform(ch);
- if(rv==CURLE_OK)
+ rv = curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+ rv = curl_easy_perform(ch);
+ if(rv == CURLE_OK)
printf("*** transfer succeeded ***\n");
else
printf("*** transfer failed ***\n");
diff --git a/docs/examples/chkspeed.c b/docs/examples/chkspeed.c
index de20567..f3dd1e9 100644
--- a/docs/examples/chkspeed.c
+++ b/docs/examples/chkspeed.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -93,7 +93,7 @@ int main(int argc, char *argv[])
prttime = 1;
}
else if(strncasecmp(*argv, "-M=", 3) == 0) {
- long m = strtol((*argv)+3, NULL, 10);
+ long m = strtol((*argv) + 3, NULL, 10);
switch(m) {
case 1:
url = URL_1M;
diff --git a/docs/examples/curlx.c b/docs/examples/curlx.c
index db0ed24..2aa10aa 100644
--- a/docs/examples/curlx.c
+++ b/docs/examples/curlx.c
@@ -195,7 +195,8 @@ static int ssl_app_verify_callback(X509_STORE_CTX *ctx, void *arg)
if(p->verbose > 2)
BIO_printf(p->errorbio, "entering ssl_app_verify_callback\n");
- if((ok= X509_verify_cert(ctx)) && ctx->cert) {
+ ok = X509_verify_cert(ctx);
+ if(ok && ctx->cert) {
unsigned char *accessinfo;
if(p->verbose > 1)
X509_print_ex(p->errorbio, ctx->cert, 0, 0);
@@ -268,16 +269,16 @@ static CURLcode sslctxfun(CURL *curl, void *sslctx, void *parm)
int main(int argc, char **argv)
{
- BIO* in=NULL;
- BIO* out=NULL;
+ BIO* in = NULL;
+ BIO* out = NULL;
char *outfile = NULL;
char *infile = NULL;
- int tabLength=100;
+ int tabLength = 100;
char *binaryptr;
char *mimetype;
- char *mimetypeaccept=NULL;
+ char *mimetypeaccept = NULL;
char *contenttype;
const char **pp;
unsigned char *hostporturl = NULL;
@@ -288,8 +289,8 @@ int main(int argc, char **argv)
char *response;
CURLcode res;
- struct curl_slist *headers=NULL;
- int badarg=0;
+ struct curl_slist *headers = NULL;
+ int badarg = 0;
binaryptr = malloc(tabLength);
@@ -307,75 +308,75 @@ int main(int argc, char **argv)
while(*args && *args[0] == '-') {
if(!strcmp (*args, "-in")) {
if(args[1]) {
- infile=*(++args);
+ infile = *(++args);
}
else
- badarg=1;
+ badarg = 1;
}
else if(!strcmp (*args, "-out")) {
if(args[1]) {
- outfile=*(++args);
+ outfile = *(++args);
}
else
- badarg=1;
+ badarg = 1;
}
else if(!strcmp (*args, "-p12")) {
if(args[1]) {
p.p12file = *(++args);
}
else
- badarg=1;
+ badarg = 1;
}
else if(strcmp(*args, "-envpass") == 0) {
if(args[1]) {
p.pst = getenv(*(++args));
}
else
- badarg=1;
+ badarg = 1;
}
else if(strcmp(*args, "-connect") == 0) {
if(args[1]) {
hostporturl = *(++args);
}
else
- badarg=1;
+ badarg = 1;
}
else if(strcmp(*args, "-mimetype") == 0) {
if(args[1]) {
mimetype = *(++args);
}
else
- badarg=1;
+ badarg = 1;
}
else if(strcmp(*args, "-acceptmime") == 0) {
if(args[1]) {
mimetypeaccept = *(++args);
}
else
- badarg=1;
+ badarg = 1;
}
else if(strcmp(*args, "-accesstype") == 0) {
if(args[1]) {
p.accesstype = OBJ_obj2nid(OBJ_txt2obj(*++args, 0));
if(p.accesstype == 0)
- badarg=1;
+ badarg = 1;
}
else
- badarg=1;
+ badarg = 1;
}
else if(strcmp(*args, "-verbose") == 0) {
p.verbose++;
}
else
- badarg=1;
+ badarg = 1;
args++;
}
- if(mimetype==NULL || mimetypeaccept == NULL)
+ if(mimetype == NULL || mimetypeaccept == NULL)
badarg = 1;
if(badarg) {
- for(pp=curlx_usage; (*pp != NULL); pp++)
+ for(pp = curlx_usage; (*pp != NULL); pp++)
BIO_printf(p.errorbio, "%s\n", *pp);
BIO_printf(p.errorbio, "\n");
goto err;
@@ -383,7 +384,8 @@ int main(int argc, char **argv)
/* set input */
- if((in=BIO_new(BIO_s_file())) == NULL) {
+ in = BIO_new(BIO_s_file());
+ if(in == NULL) {
BIO_printf(p.errorbio, "Error setting input bio\n");
goto err;
}
@@ -397,7 +399,8 @@ int main(int argc, char **argv)
/* set output */
- if((out=BIO_new(BIO_s_file())) == NULL) {
+ out = BIO_new(BIO_s_file());
+ if(out == NULL) {
BIO_printf(p.errorbio, "Error setting output bio.\n");
goto err;
}
@@ -429,7 +432,7 @@ int main(int argc, char **argv)
goto err;
}
- p.ca= NULL;
+ p.ca = NULL;
if(!(PKCS12_parse (p.p12, p.pst, &(p.pkey), &(p.usercert), &(p.ca) ) )) {
BIO_printf(p.errorbio, "Invalid P12 structure in %s\n", p.p12file);
goto err;
@@ -454,10 +457,10 @@ int main(int argc, char **argv)
given access type */
serverurl = my_get_ext(p.usercert, p.accesstype, NID_info_access);
if(!serverurl) {
- int j=0;
+ int j = 0;
BIO_printf(p.errorbio, "no service URL in user cert "
"cherching in others certificats\n");
- for(j=0; j<sk_X509_num(p.ca); j++) {
+ for(j = 0; j<sk_X509_num(p.ca); j++) {
serverurl = my_get_ext(sk_X509_value(p.ca, j), p.accesstype,
NID_info_access);
if(serverurl)
@@ -489,8 +492,8 @@ int main(int argc, char **argv)
/* pass our list of custom made headers */
- contenttype = malloc(15+strlen(mimetype));
- snprintf(contenttype, 15+strlen(mimetype), "Content-type: %s", mimetype);
+ contenttype = malloc(15 + strlen(mimetype));
+ snprintf(contenttype, 15 + strlen(mimetype), "Content-type: %s", mimetype);
headers = curl_slist_append(headers, contenttype);
curl_easy_setopt(p.curl, CURLOPT_HTTPHEADER, headers);
@@ -512,12 +515,12 @@ int main(int argc, char **argv)
curl_easy_setopt(p.curl, CURLOPT_SSL_CTX_DATA, &p);
{
- int lu; int i=0;
+ int lu; int i = 0;
while((lu = BIO_read(in, &binaryptr[i], tabLength-i)) >0) {
- i+=lu;
- if(i== tabLength) {
- tabLength+=100;
- binaryptr=realloc(binaryptr, tabLength); /* should be more careful */
+ i += lu;
+ if(i == tabLength) {
+ tabLength += 100;
+ binaryptr = realloc(binaryptr, tabLength); /* should be more careful */
}
}
tabLength = i;
@@ -533,8 +536,8 @@ int main(int argc, char **argv)
BIO_printf(p.errorbio, "%d %s %d\n", __LINE__, "curl_easy_perform",
res = curl_easy_perform(p.curl));
{
- int result =curl_easy_getinfo(p.curl, CURLINFO_CONTENT_TYPE, &response);
- if(mimetypeaccept && p.verbose)
+ int result = curl_easy_getinfo(p.curl, CURLINFO_CONTENT_TYPE, &response);
+ if(mimetypeaccept && p.verbose) {
if(!strcmp(mimetypeaccept, response))
BIO_printf(p.errorbio, "the response has a correct mimetype : %s\n",
response);
@@ -542,6 +545,7 @@ int main(int argc, char **argv)
BIO_printf(p.errorbio, "the response doesn\'t have an acceptable "
"mime type, it is %s instead of %s\n",
response, mimetypeaccept);
+ }
}
/*** code d'erreur si accept mime ***, egalement code return HTTP != 200 ***/
diff --git a/docs/examples/debug.c b/docs/examples/debug.c
index e8a87ea..554eb3e 100644
--- a/docs/examples/debug.c
+++ b/docs/examples/debug.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -38,7 +38,7 @@ void dump(const char *text,
size_t i;
size_t c;
- unsigned int width=0x10;
+ unsigned int width = 0x10;
if(nohex)
/* without the hex output, we can fit more on screen */
@@ -47,30 +47,32 @@ void dump(const char *text,
fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n",
text, (long)size, (long)size);
- for(i=0; i<size; i+= width) {
+ for(i = 0; i<size; i += width) {
fprintf(stream, "%4.4lx: ", (long)i);
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
- if(i+c < size)
- fprintf(stream, "%02x ", ptr[i+c]);
+ if(i + c < size)
+ fprintf(stream, "%02x ", ptr[i + c]);
else
fputs(" ", stream);
}
- for(c = 0; (c < width) && (i+c < size); c++) {
+ for(c = 0; (c < width) && (i + c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
- if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
- i+=(c+2-width);
+ if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+ ptr[i + c + 1] == 0x0A) {
+ i += (c + 2 - width);
break;
}
fprintf(stream, "%c",
- (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
+ (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
- if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
- i+=(c+3-width);
+ if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+ ptr[i + c + 2] == 0x0A) {
+ i += (c + 3 - width);
break;
}
}
diff --git a/docs/examples/evhiperfifo.c b/docs/examples/evhiperfifo.c
index 9cb8eae..257c127 100644
--- a/docs/examples/evhiperfifo.c
+++ b/docs/examples/evhiperfifo.c
@@ -136,28 +136,28 @@ static void mcode_or_die(const char *where, CURLMcode code)
const char *s;
switch(code) {
case CURLM_BAD_HANDLE:
- s="CURLM_BAD_HANDLE";
+ s = "CURLM_BAD_HANDLE";
break;
case CURLM_BAD_EASY_HANDLE:
- s="CURLM_BAD_EASY_HANDLE";
+ s = "CURLM_BAD_EASY_HANDLE";
break;
case CURLM_OUT_OF_MEMORY:
- s="CURLM_OUT_OF_MEMORY";
+ s = "CURLM_OUT_OF_MEMORY";
break;
case CURLM_INTERNAL_ERROR:
- s="CURLM_INTERNAL_ERROR";
+ s = "CURLM_INTERNAL_ERROR";
break;
case CURLM_UNKNOWN_OPTION:
- s="CURLM_UNKNOWN_OPTION";
+ s = "CURLM_UNKNOWN_OPTION";
break;
case CURLM_LAST:
- s="CURLM_LAST";
+ s = "CURLM_LAST";
break;
default:
- s="CURLM_unknown";
+ s = "CURLM_unknown";
break;
case CURLM_BAD_SOCKET:
- s="CURLM_BAD_SOCKET";
+ s = "CURLM_BAD_SOCKET";
fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
/* ignore this error */
return;
@@ -257,7 +257,7 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
ev_io_stop(g->loop, &f->ev);
ev_io_init(&f->ev, event_cb, f->sockfd, kind);
f->ev.data = g;
- f->evset=1;
+ f->evset = 1;
ev_io_start(g->loop, &f->ev);
}
@@ -371,13 +371,13 @@ static void new_conn(char *url, GlobalInfo *g)
static void fifo_cb(EV_P_ struct ev_io *w, int revents)
{
char s[1024];
- long int rv=0;
- int n=0;
+ long int rv = 0;
+ int n = 0;
GlobalInfo *g = (GlobalInfo *)w->data;
do {
s[0]='\0';
- rv=fscanf(g->input, "%1023s%n", s, &n);
+ rv = fscanf(g->input, "%1023s%n", s, &n);
s[n]='\0';
if(n && s[0]) {
new_conn(s, g); /* if we read a URL, go get it! */
diff --git a/docs/examples/fopen.c b/docs/examples/fopen.c
index 1e0a09a..eb27c6a 100644
--- a/docs/examples/fopen.c
+++ b/docs/examples/fopen.c
@@ -13,7 +13,7 @@
* See the main() function at the bottom that shows an app that retrieves from
* a specified url using fgets() and fread() and saves as two output files.
*
- * Copyright (c) 2003 Simtec Electronics
+ * Copyright (c) 2003, 2017 Simtec Electronics
*
* Re-implemented by Vincent Sanders <vince@kyllikki.org> with extensive
* reference to original curl example code
@@ -58,9 +58,9 @@
#include <curl/curl.h>
enum fcurl_type_e {
- CFTYPE_NONE=0,
- CFTYPE_FILE=1,
- CFTYPE_CURL=2
+ CFTYPE_NONE = 0,
+ CFTYPE_FILE = 1,
+ CFTYPE_CURL = 2
};
struct fcurl_data
@@ -102,19 +102,19 @@ static size_t write_callback(char *buffer,
URL_FILE *url = (URL_FILE *)userp;
size *= nitems;
- rembuff=url->buffer_len - url->buffer_pos; /* remaining space in buffer */
+ rembuff = url->buffer_len - url->buffer_pos; /* remaining space in buffer */
if(size > rembuff) {
/* not enough space in buffer */
- newbuff=realloc(url->buffer, url->buffer_len + (size - rembuff));
- if(newbuff==NULL) {
+ newbuff = realloc(url->buffer, url->buffer_len + (size - rembuff));
+ if(newbuff == NULL) {
fprintf(stderr, "callback buffer grow failed\n");
- size=rembuff;
+ size = rembuff;
}
else {
/* realloc succeeded increase buffer size*/
- url->buffer_len+=size - rembuff;
- url->buffer=newbuff;
+ url->buffer_len += size - rembuff;
+ url->buffer = newbuff;
}
}
@@ -189,7 +189,7 @@ static int fill_buffer(URL_FILE *file, size_t want)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
@@ -211,12 +211,12 @@ static int fill_buffer(URL_FILE *file, size_t want)
static int use_buffer(URL_FILE *file, size_t want)
{
/* sort out buffer */
- if((file->buffer_pos - want) <=0) {
+ if((file->buffer_pos - want) <= 0) {
/* ditch buffer - write will recreate */
free(file->buffer);
- file->buffer=NULL;
- file->buffer_pos=0;
- file->buffer_len=0;
+ file->buffer = NULL;
+ file->buffer_pos = 0;
+ file->buffer_len = 0;
}
else {
/* move rest down make it available for later */
@@ -243,7 +243,8 @@ URL_FILE *url_fopen(const char *url, const char *operation)
memset(file, 0, sizeof(URL_FILE));
- if((file->handle.file=fopen(url, operation)))
+ file->handle.file = fopen(url, operation);
+ if(file->handle.file)
file->type = CFTYPE_FILE; /* marked as URL */
else {
@@ -282,11 +283,11 @@ URL_FILE *url_fopen(const char *url, const char *operation)
int url_fclose(URL_FILE *file)
{
- int ret=0;/* default is good return */
+ int ret = 0;/* default is good return */
switch(file->type) {
case CFTYPE_FILE:
- ret=fclose(file->handle.file); /* passthrough */
+ ret = fclose(file->handle.file); /* passthrough */
break;
case CFTYPE_CURL:
@@ -298,8 +299,8 @@ int url_fclose(URL_FILE *file)
break;
default: /* unknown or supported type - oh dear */
- ret=EOF;
- errno=EBADF;
+ ret = EOF;
+ errno = EBADF;
break;
}
@@ -311,11 +312,11 @@ int url_fclose(URL_FILE *file)
int url_feof(URL_FILE *file)
{
- int ret=0;
+ int ret = 0;
switch(file->type) {
case CFTYPE_FILE:
- ret=feof(file->handle.file);
+ ret = feof(file->handle.file);
break;
case CFTYPE_CURL:
@@ -324,8 +325,8 @@ int url_feof(URL_FILE *file)
break;
default: /* unknown or supported type - oh dear */
- ret=-1;
- errno=EBADF;
+ ret = -1;
+ errno = EBADF;
break;
}
return ret;
@@ -337,7 +338,7 @@ size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
switch(file->type) {
case CFTYPE_FILE:
- want=fread(ptr, size, nmemb, file->handle.file);
+ want = fread(ptr, size, nmemb, file->handle.file);
break;
case CFTYPE_CURL:
@@ -363,8 +364,8 @@ size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
break;
default: /* unknown or supported type - oh dear */
- want=0;
- errno=EBADF;
+ want = 0;
+ errno = EBADF;
break;
}
@@ -395,24 +396,24 @@ char *url_fgets(char *ptr, size_t size, URL_FILE *file)
/*buffer contains data */
/* look for newline or eof */
- for(loop=0;loop < want;loop++) {
+ for(loop = 0; loop < want; loop++) {
if(file->buffer[loop] == '\n') {
- want=loop+1;/* include newline */
+ want = loop + 1;/* include newline */
break;
}
}
/* xfer data to caller */
memcpy(ptr, file->buffer, want);
- ptr[want]=0;/* always null terminate */
+ ptr[want] = 0;/* always null terminate */
use_buffer(file, want);
break;
default: /* unknown or supported type - oh dear */
- ptr=NULL;
- errno=EBADF;
+ ptr = NULL;
+ errno = EBADF;
break;
}
@@ -435,9 +436,9 @@ void url_rewind(URL_FILE *file)
/* ditch buffer - write will recreate - resets stream pos*/
free(file->buffer);
- file->buffer=NULL;
- file->buffer_pos=0;
- file->buffer_len=0;
+ file->buffer = NULL;
+ file->buffer_pos = 0;
+ file->buffer_len = 0;
break;
@@ -463,12 +464,12 @@ int main(int argc, char *argv[])
const char *url;
if(argc < 2)
- url="http://192.168.7.3/testfile";/* default to testurl */
+ url = "http://192.168.7.3/testfile";/* default to testurl */
else
- url=argv[1];/* use passed url */
+ url = argv[1];/* use passed url */
/* copy from url line by line with fgets */
- outf=fopen(FGETSFILE, "wb+");
+ outf = fopen(FGETSFILE, "wb+");
if(!outf) {
perror("couldn't open fgets output file\n");
return 1;
@@ -492,7 +493,7 @@ int main(int argc, char *argv[])
/* Copy from url with fread */
- outf=fopen(FREADFILE, "wb+");
+ outf = fopen(FREADFILE, "wb+");
if(!outf) {
perror("couldn't open fread output file\n");
return 1;
@@ -516,7 +517,7 @@ int main(int argc, char *argv[])
/* Test rewind */
- outf=fopen(REWINDFILE, "wb+");
+ outf = fopen(REWINDFILE, "wb+");
if(!outf) {
perror("couldn't open fread output file\n");
return 1;
diff --git a/docs/examples/ftpget.c b/docs/examples/ftpget.c
index 9b7dc02..a2a7da0 100644
--- a/docs/examples/ftpget.c
+++ b/docs/examples/ftpget.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,10 +35,10 @@ struct FtpFile {
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
- struct FtpFile *out=(struct FtpFile *)stream;
+ struct FtpFile *out = (struct FtpFile *)stream;
if(out && !out->stream) {
/* open file for writing */
- out->stream=fopen(out->filename, "wb");
+ out->stream = fopen(out->filename, "wb");
if(!out->stream)
return -1; /* failure, can't open file to write */
}
@@ -50,7 +50,7 @@ int main(void)
{
CURL *curl;
CURLcode res;
- struct FtpFile ftpfile={
+ struct FtpFile ftpfile = {
"curl.tar.gz", /* name to store the file as if successful */
NULL
};
diff --git a/docs/examples/ftpsget.c b/docs/examples/ftpsget.c
index d53f088..fb7489f 100644
--- a/docs/examples/ftpsget.c
+++ b/docs/examples/ftpsget.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,10 +37,10 @@ struct FtpFile {
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
void *stream)
{
- struct FtpFile *out=(struct FtpFile *)stream;
+ struct FtpFile *out = (struct FtpFile *)stream;
if(out && !out->stream) {
/* open file for writing */
- out->stream=fopen(out->filename, "wb");
+ out->stream = fopen(out->filename, "wb");
if(!out->stream)
return -1; /* failure, can't open file to write */
}
@@ -52,7 +52,7 @@ int main(void)
{
CURL *curl;
CURLcode res;
- struct FtpFile ftpfile={
+ struct FtpFile ftpfile = {
"yourfile.bin", /* name to store the file as if successful */
NULL
};
diff --git a/docs/examples/ftpupload.c b/docs/examples/ftpupload.c
index 41e2d80..5fc41ef 100644
--- a/docs/examples/ftpupload.c
+++ b/docs/examples/ftpupload.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -71,7 +71,7 @@ int main(void)
struct stat file_info;
curl_off_t fsize;
- struct curl_slist *headerlist=NULL;
+ struct curl_slist *headerlist = NULL;
static const char buf_1 [] = "RNFR " UPLOAD_FILE_AS;
static const char buf_2 [] = "RNTO " RENAME_FILE_TO;
diff --git a/docs/examples/ftpuploadresume.c b/docs/examples/ftpuploadresume.c
index 8f7f45d..fc7f803 100644
--- a/docs/examples/ftpuploadresume.c
+++ b/docs/examples/ftpuploadresume.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,44 +26,32 @@
#include <stdlib.h>
#include <stdio.h>
-
#include <curl/curl.h>
-#if defined(_MSC_VER) && (_MSC_VER < 1300)
-# error _snscanf requires MSVC 7.0 or later.
-#endif
-
-/* The MinGW headers are missing a few Win32 function definitions,
- you shouldn't need this if you use VC++ */
-#if defined(__MINGW32__) && !defined(__MINGW64__)
-int __cdecl _snscanf(const char *input, size_t length,
- const char *format, ...);
-#endif
-
-
/* parse headers for Content-Length */
-size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream)
+static size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb,
+ void *stream)
{
int r;
long len = 0;
- /* _snscanf() is Win32 specific */
- r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len);
-
- if(r) /* Microsoft: we don't read the specs */
+ r = sscanf(ptr, "Content-Length: %ld\n", &len);
+ if(r)
*((long *) stream) = len;
return size * nmemb;
}
/* discard downloaded data */
-size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream)
+static size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
+ (void)ptr;
+ (void)stream;
return size * nmemb;
}
/* read data to upload */
-size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
+static size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
FILE *f = stream;
size_t n;
@@ -77,8 +65,8 @@ size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
}
-int upload(CURL *curlhandle, const char *remotepath, const char *localpath,
- long timeout, long tries)
+static int upload(CURL *curlhandle, const char *remotepath,
+ const char *localpath, long timeout, long tries)
{
FILE *f;
long uploaded_len = 0;
@@ -156,7 +144,7 @@ int upload(CURL *curlhandle, const char *remotepath, const char *localpath,
}
}
-int main(int c, char **argv)
+int main(void)
{
CURL *curlhandle = NULL;
diff --git a/docs/examples/ghiper.c b/docs/examples/ghiper.c
index 505e90a..fd643fc 100644
--- a/docs/examples/ghiper.c
+++ b/docs/examples/ghiper.c
@@ -99,14 +99,14 @@ static void mcode_or_die(const char *where, CURLMcode code)
if(CURLM_OK != code) {
const char *s;
switch(code) {
- case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
- case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
- case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
- case CURLM_INTERNAL_ERROR: s="CURLM_INTERNAL_ERROR"; break;
- case CURLM_BAD_SOCKET: s="CURLM_BAD_SOCKET"; break;
- case CURLM_UNKNOWN_OPTION: s="CURLM_UNKNOWN_OPTION"; break;
- case CURLM_LAST: s="CURLM_LAST"; break;
- default: s="CURLM_unknown";
+ case CURLM_BAD_HANDLE: s = "CURLM_BAD_HANDLE"; break;
+ case CURLM_BAD_EASY_HANDLE: s = "CURLM_BAD_EASY_HANDLE"; break;
+ case CURLM_OUT_OF_MEMORY: s = "CURLM_OUT_OF_MEMORY"; break;
+ case CURLM_INTERNAL_ERROR: s = "CURLM_INTERNAL_ERROR"; break;
+ case CURLM_BAD_SOCKET: s = "CURLM_BAD_SOCKET"; break;
+ case CURLM_UNKNOWN_OPTION: s = "CURLM_UNKNOWN_OPTION"; break;
+ case CURLM_LAST: s = "CURLM_LAST"; break;
+ default: s = "CURLM_unknown";
}
MSG_OUT("ERROR: %s returns %s\n", where, s);
exit(code);
@@ -156,7 +156,7 @@ static gboolean timer_cb(gpointer data)
static int update_timeout_cb(CURLM *multi, long timeout_ms, void *userp)
{
struct timeval timeout;
- GlobalInfo *g=(GlobalInfo *)userp;
+ GlobalInfo *g = (GlobalInfo *)userp;
timeout.tv_sec = timeout_ms/1000;
timeout.tv_usec = (timeout_ms%1000)*1000;
@@ -181,7 +181,7 @@ static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
{
GlobalInfo *g = (GlobalInfo*) data;
CURLMcode rc;
- int fd=g_io_channel_unix_get_fd(ch);
+ int fd = g_io_channel_unix_get_fd(ch);
int action =
(condition & G_IO_IN ? CURL_CSELECT_IN : 0) |
@@ -228,7 +228,7 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
if(f->ev) {
g_source_remove(f->ev);
}
- f->ev=g_io_add_watch(f->ch, kind, event_cb, g);
+ f->ev = g_io_add_watch(f->ch, kind, event_cb, g);
}
/* Initialize a new SockInfo structure */
@@ -237,7 +237,7 @@ static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
SockInfo *fdp = g_malloc0(sizeof(SockInfo));
fdp->global = g;
- fdp->ch=g_io_channel_unix_new(s);
+ fdp->ch = g_io_channel_unix_new(s);
setsock(fdp, s, easy, action, g);
curl_multi_assign(g->multi, s, fdp);
}
@@ -319,7 +319,7 @@ static void new_conn(char *url, GlobalInfo *g)
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 30L);
MSG_OUT("Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
- rc =curl_multi_add_handle(g->multi, conn->easy);
+ rc = curl_multi_add_handle(g->multi, conn->easy);
mcode_or_die("new_conn: curl_multi_add_handle", rc);
/* note that the add_handle() will set a time-out to trigger very soon so
@@ -331,11 +331,11 @@ static gboolean fifo_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
{
#define BUF_SIZE 1024
gsize len, tp;
- gchar *buf, *tmp, *all=NULL;
+ gchar *buf, *tmp, *all = NULL;
GIOStatus rv;
do {
- GError *err=NULL;
+ GError *err = NULL;
rv = g_io_channel_read_line(ch, &buf, &len, &tp, &err);
if(buf) {
if(tp) {
@@ -345,15 +345,15 @@ static gboolean fifo_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
g_free(buf);
}
else {
- buf = g_malloc(BUF_SIZE+1);
+ buf = g_malloc(BUF_SIZE + 1);
while(TRUE) {
buf[BUF_SIZE]='\0';
g_io_channel_read_chars(ch, buf, BUF_SIZE, &len, &err);
if(len) {
buf[len]='\0';
if(all) {
- tmp=all;
- all=g_strdup_printf("%s%s", tmp, buf);
+ tmp = all;
+ all = g_strdup_printf("%s%s", tmp, buf);
g_free(tmp);
}
else {
@@ -417,12 +417,12 @@ int main(int argc, char **argv)
GMainLoop*gmain;
int fd;
GIOChannel* ch;
- g=g_malloc0(sizeof(GlobalInfo));
+ g = g_malloc0(sizeof(GlobalInfo));
- fd=init_fifo();
- ch=g_io_channel_unix_new(fd);
+ fd = init_fifo();
+ ch = g_io_channel_unix_new(fd);
g_io_add_watch(ch, G_IO_IN, fifo_cb, g);
- gmain=g_main_loop_new(NULL, FALSE);
+ gmain = g_main_loop_new(NULL, FALSE);
g->multi = curl_multi_init();
curl_multi_setopt(g->multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g);
diff --git a/docs/examples/hiperfifo.c b/docs/examples/hiperfifo.c
index 45b69b0..76bc6c1 100644
--- a/docs/examples/hiperfifo.c
+++ b/docs/examples/hiperfifo.c
@@ -137,15 +137,15 @@ static void mcode_or_die(const char *where, CURLMcode code)
if(CURLM_OK != code) {
const char *s;
switch(code) {
- case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
- case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
- case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
- case CURLM_INTERNAL_ERROR: s="CURLM_INTERNAL_ERROR"; break;
- case CURLM_UNKNOWN_OPTION: s="CURLM_UNKNOWN_OPTION"; break;
- case CURLM_LAST: s="CURLM_LAST"; break;
- default: s="CURLM_unknown";
+ case CURLM_BAD_HANDLE: s = "CURLM_BAD_HANDLE"; break;
+ case CURLM_BAD_EASY_HANDLE: s = "CURLM_BAD_EASY_HANDLE"; break;
+ case CURLM_OUT_OF_MEMORY: s = "CURLM_OUT_OF_MEMORY"; break;
+ case CURLM_INTERNAL_ERROR: s = "CURLM_INTERNAL_ERROR"; break;
+ case CURLM_UNKNOWN_OPTION: s = "CURLM_UNKNOWN_OPTION"; break;
+ case CURLM_LAST: s = "CURLM_LAST"; break;
+ default: s = "CURLM_unknown";
break;
- case CURLM_BAD_SOCKET: s="CURLM_BAD_SOCKET";
+ case CURLM_BAD_SOCKET: s = "CURLM_BAD_SOCKET";
fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
/* ignore this error */
return;
@@ -359,15 +359,15 @@ static void new_conn(char *url, GlobalInfo *g)
static void fifo_cb(int fd, short event, void *arg)
{
char s[1024];
- long int rv=0;
- int n=0;
+ long int rv = 0;
+ int n = 0;
GlobalInfo *g = (GlobalInfo *)arg;
(void)fd; /* unused */
(void)event; /* unused */
do {
s[0]='\0';
- rv=fscanf(g->input, "%1023s%n", s, &n);
+ rv = fscanf(g->input, "%1023s%n", s, &n);
s[n]='\0';
if(n && s[0]) {
new_conn(s, arg); /* if we read a URL, go get it! */
diff --git a/docs/examples/htmltidy.c b/docs/examples/htmltidy.c
index 687e3f3..44af0c5 100644
--- a/docs/examples/htmltidy.c
+++ b/docs/examples/htmltidy.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -52,7 +52,7 @@ void dumpNode(TidyDoc doc, TidyNode tnod, int indent)
TidyAttr attr;
printf("%*.*s%s ", indent, indent, "<", name);
/* walk the attribute list */
- for(attr=tidyAttrFirst(child); attr; attr=tidyAttrNext(attr) ) {
+ for(attr = tidyAttrFirst(child); attr; attr = tidyAttrNext(attr) ) {
printf(tidyAttrName(attr));
tidyAttrValue(attr)?printf("=\"%s\" ",
tidyAttrValue(attr)):printf(" ");
@@ -95,7 +95,7 @@ int main(int argc, char **argv)
tidyBufInit(&docbuf);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &docbuf);
- err=curl_easy_perform(curl);
+ err = curl_easy_perform(curl);
if(!err) {
err = tidyParseBuffer(tdoc, &docbuf); /* parse the input */
if(err >= 0) {
diff --git a/docs/examples/http2-download.c b/docs/examples/http2-download.c
index 8e28eaa..8515663 100644
--- a/docs/examples/http2-download.c
+++ b/docs/examples/http2-download.c
@@ -51,7 +51,7 @@ static int num_transfers;
static int hnd2num(CURL *hnd)
{
int i;
- for(i=0; i< num_transfers; i++) {
+ for(i = 0; i< num_transfers; i++) {
if(curl_hnd[i] == hnd)
return i;
}
@@ -65,7 +65,7 @@ void dump(const char *text, int num, unsigned char *ptr, size_t size,
size_t i;
size_t c;
- unsigned int width=0x10;
+ unsigned int width = 0x10;
if(nohex)
/* without the hex output, we can fit more on screen */
@@ -74,30 +74,32 @@ void dump(const char *text, int num, unsigned char *ptr, size_t size,
fprintf(stderr, "%d %s, %ld bytes (0x%lx)\n",
num, text, (long)size, (long)size);
- for(i=0; i<size; i+= width) {
+ for(i = 0; i<size; i += width) {
fprintf(stderr, "%4.4lx: ", (long)i);
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
- if(i+c < size)
- fprintf(stderr, "%02x ", ptr[i+c]);
+ if(i + c < size)
+ fprintf(stderr, "%02x ", ptr[i + c]);
else
fputs(" ", stderr);
}
- for(c = 0; (c < width) && (i+c < size); c++) {
+ for(c = 0; (c < width) && (i + c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
- if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
- i+=(c+2-width);
+ if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+ ptr[i + c + 1] == 0x0A) {
+ i += (c + 2 - width);
break;
}
fprintf(stderr, "%c",
- (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
+ (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
- if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
- i+=(c+3-width);
+ if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+ ptr[i + c + 2] == 0x0A) {
+ i += (c + 3 - width);
break;
}
}
@@ -199,7 +201,7 @@ int main(int argc, char **argv)
/* init a multi stack */
multi_handle = curl_multi_init();
- for(i=0; i<num_transfers; i++) {
+ for(i = 0; i<num_transfers; i++) {
easy[i] = curl_easy_init();
/* set options */
setup(easy[i], i);
@@ -269,7 +271,7 @@ int main(int argc, char **argv)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
@@ -286,7 +288,7 @@ int main(int argc, char **argv)
curl_multi_cleanup(multi_handle);
- for(i=0; i<num_transfers; i++)
+ for(i = 0; i<num_transfers; i++)
curl_easy_cleanup(easy[i]);
return 0;
diff --git a/docs/examples/http2-serverpush.c b/docs/examples/http2-serverpush.c
index b497e76..0162a8f 100644
--- a/docs/examples/http2-serverpush.c
+++ b/docs/examples/http2-serverpush.c
@@ -45,7 +45,7 @@ void dump(const char *text, unsigned char *ptr, size_t size,
size_t i;
size_t c;
- unsigned int width=0x10;
+ unsigned int width = 0x10;
if(nohex)
/* without the hex output, we can fit more on screen */
@@ -54,30 +54,32 @@ void dump(const char *text, unsigned char *ptr, size_t size,
fprintf(stderr, "%s, %ld bytes (0x%lx)\n",
text, (long)size, (long)size);
- for(i=0; i<size; i+= width) {
+ for(i = 0; i<size; i += width) {
fprintf(stderr, "%4.4lx: ", (long)i);
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
- if(i+c < size)
- fprintf(stderr, "%02x ", ptr[i+c]);
+ if(i + c < size)
+ fprintf(stderr, "%02x ", ptr[i + c]);
else
fputs(" ", stderr);
}
- for(c = 0; (c < width) && (i+c < size); c++) {
+ for(c = 0; (c < width) && (i + c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
- if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
- i+=(c+2-width);
+ if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+ ptr[i + c + 1] == 0x0A) {
+ i += (c + 2 - width);
break;
}
fprintf(stderr, "%c",
- (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
+ (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
- if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
- i+=(c+3-width);
+ if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+ ptr[i + c + 2] == 0x0A) {
+ i += (c + 3 - width);
break;
}
}
@@ -181,7 +183,7 @@ static int server_push_callback(CURL *parent,
fprintf(stderr, "**** push callback approves stream %u, got %d headers!\n",
count, (int)num_headers);
- for(i=0; i<num_headers; i++) {
+ for(i = 0; i<num_headers; i++) {
headp = curl_pushheader_bynum(headers, i);
fprintf(stderr, "**** header %u: %s\n", (int)i, headp);
}
@@ -204,7 +206,7 @@ int main(void)
CURL *easy;
CURLM *multi_handle;
int still_running; /* keep number of running handles */
- int transfers=1; /* we start with one */
+ int transfers = 1; /* we start with one */
struct CURLMsg *m;
/* init a multi stack */
@@ -281,7 +283,7 @@ int main(void)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
diff --git a/docs/examples/http2-upload.c b/docs/examples/http2-upload.c
index 43809ab..d7aa320 100644
--- a/docs/examples/http2-upload.c
+++ b/docs/examples/http2-upload.c
@@ -53,7 +53,7 @@ static int num_transfers;
static int hnd2num(CURL *hnd)
{
int i;
- for(i=0; i< num_transfers; i++) {
+ for(i = 0; i< num_transfers; i++) {
if(curl_hnd[i] == hnd)
return i;
}
@@ -66,7 +66,7 @@ void dump(const char *text, int num, unsigned char *ptr, size_t size,
{
size_t i;
size_t c;
- unsigned int width=0x10;
+ unsigned int width = 0x10;
if(nohex)
/* without the hex output, we can fit more on screen */
@@ -75,30 +75,32 @@ void dump(const char *text, int num, unsigned char *ptr, size_t size,
fprintf(stderr, "%d %s, %ld bytes (0x%lx)\n",
num, text, (long)size, (long)size);
- for(i=0; i<size; i+= width) {
+ for(i = 0; i<size; i += width) {
fprintf(stderr, "%4.4lx: ", (long)i);
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
- if(i+c < size)
- fprintf(stderr, "%02x ", ptr[i+c]);
+ if(i + c < size)
+ fprintf(stderr, "%02x ", ptr[i + c]);
else
fputs(" ", stderr);
}
- for(c = 0; (c < width) && (i+c < size); c++) {
+ for(c = 0; (c < width) && (i + c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
- if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
- i+=(c+2-width);
+ if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+ ptr[i + c + 1] == 0x0A) {
+ i += (c + 2 - width);
break;
}
fprintf(stderr, "%c",
- (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
+ (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
- if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
- i+=(c+3-width);
+ if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+ ptr[i + c + 2] == 0x0A) {
+ i += (c + 3 - width);
break;
}
}
@@ -260,7 +262,7 @@ int main(int argc, char **argv)
/* init a multi stack */
multi_handle = curl_multi_init();
- for(i=0; i<num_transfers; i++) {
+ for(i = 0; i<num_transfers; i++) {
easy[i] = curl_easy_init();
/* set options */
setup(easy[i], i, filename);
@@ -333,7 +335,7 @@ int main(int argc, char **argv)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
@@ -350,7 +352,7 @@ int main(int argc, char **argv)
curl_multi_cleanup(multi_handle);
- for(i=0; i<num_transfers; i++)
+ for(i = 0; i<num_transfers; i++)
curl_easy_cleanup(easy[i]);
return 0;
diff --git a/docs/examples/httpput.c b/docs/examples/httpput.c
index 4f8aece..6be9b8d 100644
--- a/docs/examples/httpput.c
+++ b/docs/examples/httpput.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -69,7 +69,7 @@ int main(int argc, char **argv)
if(argc < 3)
return 1;
- file= argv[1];
+ file = argv[1];
url = argv[2];
/* get the file size of the local file */
diff --git a/docs/examples/imap-multi.c b/docs/examples/imap-multi.c
index 8cd4858..07d1b8b 100644
--- a/docs/examples/imap-multi.c
+++ b/docs/examples/imap-multi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -144,7 +144,7 @@ int main(void)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
diff --git a/docs/examples/multi-app.c b/docs/examples/multi-app.c
index 9a8ecfe..74b2a94 100644
--- a/docs/examples/multi-app.c
+++ b/docs/examples/multi-app.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -55,7 +55,7 @@ int main(void)
int msgs_left; /* how many messages are left */
/* Allocate one CURL handle per transfer */
- for(i=0; i<HANDLECOUNT; i++)
+ for(i = 0; i<HANDLECOUNT; i++)
handles[i] = curl_easy_init();
/* set the options (I left out a few, you'll get the point anyway) */
@@ -68,7 +68,7 @@ int main(void)
multi_handle = curl_multi_init();
/* add the individual transfers */
- for(i=0; i<HANDLECOUNT; i++)
+ for(i = 0; i<HANDLECOUNT; i++)
curl_multi_add_handle(multi_handle, handles[i]);
/* we start some action by calling perform right away */
@@ -130,7 +130,7 @@ int main(void)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
@@ -150,7 +150,7 @@ int main(void)
int idx, found = 0;
/* Find out which handle this message is about */
- for(idx=0; idx<HANDLECOUNT; idx++) {
+ for(idx = 0; idx<HANDLECOUNT; idx++) {
found = (msg->easy_handle == handles[idx]);
if(found)
break;
@@ -170,7 +170,7 @@ int main(void)
curl_multi_cleanup(multi_handle);
/* Free the CURL handles */
- for(i=0; i<HANDLECOUNT; i++)
+ for(i = 0; i<HANDLECOUNT; i++)
curl_easy_cleanup(handles[i]);
return 0;
diff --git a/docs/examples/multi-debugcallback.c b/docs/examples/multi-debugcallback.c
index 07f044b..abb0de6 100644
--- a/docs/examples/multi-debugcallback.c
+++ b/docs/examples/multi-debugcallback.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -45,7 +45,7 @@ void dump(const char *text,
size_t i;
size_t c;
- unsigned int width=0x10;
+ unsigned int width = 0x10;
if(nohex)
/* without the hex output, we can fit more on screen */
@@ -54,30 +54,32 @@ void dump(const char *text,
fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n",
text, (long)size, (long)size);
- for(i=0; i<size; i+= width) {
+ for(i = 0; i<size; i += width) {
fprintf(stream, "%4.4lx: ", (long)i);
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
- if(i+c < size)
- fprintf(stream, "%02x ", ptr[i+c]);
+ if(i + c < size)
+ fprintf(stream, "%02x ", ptr[i + c]);
else
fputs(" ", stream);
}
- for(c = 0; (c < width) && (i+c < size); c++) {
+ for(c = 0; (c < width) && (i + c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
- if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
- i+=(c+2-width);
+ if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+ ptr[i + c + 1] == 0x0A) {
+ i += (c + 2 - width);
break;
}
fprintf(stream, "%c",
- (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
+ (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
- if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
- i+=(c+3-width);
+ if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+ ptr[i + c + 2] == 0x0A) {
+ i += (c + 3 - width);
break;
}
}
@@ -204,7 +206,7 @@ int main(void)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
diff --git a/docs/examples/multi-double.c b/docs/examples/multi-double.c
index 4e50c76..3434539 100644
--- a/docs/examples/multi-double.c
+++ b/docs/examples/multi-double.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -119,7 +119,7 @@ int main(void)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
diff --git a/docs/examples/multi-formadd.c b/docs/examples/multi-formadd.c
new file mode 100644
index 0000000..bd85cc6
--- /dev/null
+++ b/docs/examples/multi-formadd.c
@@ -0,0 +1,171 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * using the multi interface to do a multipart formpost without blocking
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+
+#include <curl/curl.h>
+
+int main(void)
+{
+ CURL *curl;
+
+ CURLM *multi_handle;
+ int still_running;
+
+ struct curl_httppost *formpost = NULL;
+ struct curl_httppost *lastptr = NULL;
+ struct curl_slist *headerlist = NULL;
+ static const char buf[] = "Expect:";
+
+ /* Fill in the file upload field. This makes libcurl load data from
+ the given file name when curl_easy_perform() is called. */
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "sendfile",
+ CURLFORM_FILE, "postit2.c",
+ CURLFORM_END);
+
+ /* Fill in the filename field */
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "filename",
+ CURLFORM_COPYCONTENTS, "postit2.c",
+ CURLFORM_END);
+
+ /* Fill in the submit field too, even if this is rarely needed */
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "submit",
+ CURLFORM_COPYCONTENTS, "send",
+ CURLFORM_END);
+
+ curl = curl_easy_init();
+ multi_handle = curl_multi_init();
+
+ /* initialize custom header list (stating that Expect: 100-continue is not
+ wanted */
+ headerlist = curl_slist_append(headerlist, buf);
+ if(curl && multi_handle) {
+
+ /* what URL that receives this POST */
+ curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/upload.cgi");
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
+ curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
+
+ curl_multi_add_handle(multi_handle, curl);
+
+ curl_multi_perform(multi_handle, &still_running);
+
+ do {
+ struct timeval timeout;
+ int rc; /* select() return code */
+ CURLMcode mc; /* curl_multi_fdset() return code */
+
+ fd_set fdread;
+ fd_set fdwrite;
+ fd_set fdexcep;
+ int maxfd = -1;
+
+ long curl_timeo = -1;
+
+ FD_ZERO(&fdread);
+ FD_ZERO(&fdwrite);
+ FD_ZERO(&fdexcep);
+
+ /* set a suitable timeout to play around with */
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+
+ curl_multi_timeout(multi_handle, &curl_timeo);
+ if(curl_timeo >= 0) {
+ timeout.tv_sec = curl_timeo / 1000;
+ if(timeout.tv_sec > 1)
+ timeout.tv_sec = 1;
+ else
+ timeout.tv_usec = (curl_timeo % 1000) * 1000;
+ }
+
+ /* get file descriptors from the transfers */
+ mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+ if(mc != CURLM_OK) {
+ fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+ break;
+ }
+
+ /* On success the value of maxfd is guaranteed to be >= -1. We call
+ select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+ no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+ to sleep 100ms, which is the minimum suggested value in the
+ curl_multi_fdset() doc. */
+
+ if(maxfd == -1) {
+#ifdef _WIN32
+ Sleep(100);
+ rc = 0;
+#else
+ /* Portable sleep for platforms other than Windows. */
+ struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+ rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+ }
+ else {
+ /* Note that on some platforms 'timeout' may be modified by select().
+ If you need access to the original value save a copy beforehand. */
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+ }
+
+ switch(rc) {
+ case -1:
+ /* select error */
+ break;
+ case 0:
+ default:
+ /* timeout or readable/writable sockets */
+ printf("perform!\n");
+ curl_multi_perform(multi_handle, &still_running);
+ printf("running: %d!\n", still_running);
+ break;
+ }
+ } while(still_running);
+
+ curl_multi_cleanup(multi_handle);
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+
+ /* then cleanup the formpost chain */
+ curl_formfree(formpost);
+
+ /* free slist */
+ curl_slist_free_all(headerlist);
+ }
+ return 0;
+}
diff --git a/docs/examples/multi-post.c b/docs/examples/multi-post.c
index cc2ca18..95d71be 100644
--- a/docs/examples/multi-post.c
+++ b/docs/examples/multi-post.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,47 +37,43 @@ int main(void)
CURLM *multi_handle;
int still_running;
- struct curl_httppost *formpost=NULL;
- struct curl_httppost *lastptr=NULL;
- struct curl_slist *headerlist=NULL;
+ curl_mime *form = NULL;
+ curl_mimepart *field = NULL;
+ struct curl_slist *headerlist = NULL;
static const char buf[] = "Expect:";
- /* Fill in the file upload field. This makes libcurl load data from
- the given file name when curl_easy_perform() is called. */
- curl_formadd(&formpost,
- &lastptr,
- CURLFORM_COPYNAME, "sendfile",
- CURLFORM_FILE, "postit2.c",
- CURLFORM_END);
-
- /* Fill in the filename field */
- curl_formadd(&formpost,
- &lastptr,
- CURLFORM_COPYNAME, "filename",
- CURLFORM_COPYCONTENTS, "postit2.c",
- CURLFORM_END);
-
- /* Fill in the submit field too, even if this is rarely needed */
- curl_formadd(&formpost,
- &lastptr,
- CURLFORM_COPYNAME, "submit",
- CURLFORM_COPYCONTENTS, "send",
- CURLFORM_END);
-
curl = curl_easy_init();
multi_handle = curl_multi_init();
- /* initialize custom header list (stating that Expect: 100-continue is not
- wanted */
- headerlist = curl_slist_append(headerlist, buf);
if(curl && multi_handle) {
+ /* Create the form */
+ form = curl_mime_init(curl);
+
+ /* Fill in the file upload field */
+ field = curl_mime_addpart(form);
+ curl_mime_name(field, "sendfile");
+ curl_mime_filedata(field, "multi-post.c");
+
+ /* Fill in the filename field */
+ field = curl_mime_addpart(form);
+ curl_mime_name(field, "filename");
+ curl_mime_data(field, "multi-post.c", CURL_ZERO_TERMINATED);
+
+ /* Fill in the submit field too, even if this is rarely needed */
+ field = curl_mime_addpart(form);
+ curl_mime_name(field, "submit");
+ curl_mime_data(field, "send", CURL_ZERO_TERMINATED);
+
+ /* initialize custom header list (stating that Expect: 100-continue is not
+ wanted */
+ headerlist = curl_slist_append(headerlist, buf);
/* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/upload.cgi");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
- curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
+ curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
curl_multi_add_handle(multi_handle, curl);
@@ -139,7 +135,7 @@ int main(void)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
@@ -161,8 +157,8 @@ int main(void)
/* always cleanup */
curl_easy_cleanup(curl);
- /* then cleanup the formpost chain */
- curl_formfree(formpost);
+ /* then cleanup the form */
+ curl_mime_free(form);
/* free slist */
curl_slist_free_all(headerlist);
diff --git a/docs/examples/multithread.c b/docs/examples/multithread.c
index 26c40f5..e3ae8e6 100644
--- a/docs/examples/multithread.c
+++ b/docs/examples/multithread.c
@@ -74,7 +74,7 @@ int main(int argc, char **argv)
/* Must initialize libcurl before any threads are started */
curl_global_init(CURL_GLOBAL_ALL);
- for(i=0; i< NUMT; i++) {
+ for(i = 0; i< NUMT; i++) {
error = pthread_create(&tid[i],
NULL, /* default attributes please */
pull_one_url,
@@ -86,7 +86,7 @@ int main(int argc, char **argv)
}
/* now wait for all threads to terminate */
- for(i=0; i< NUMT; i++) {
+ for(i = 0; i< NUMT; i++) {
error = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
diff --git a/docs/examples/opensslthreadlock.c b/docs/examples/opensslthreadlock.c
index 6f86c7f..649ef93 100644
--- a/docs/examples/opensslthreadlock.c
+++ b/docs/examples/opensslthreadlock.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -50,7 +50,7 @@ void handle_error(const char *file, int lineno, const char *msg)
}
/* This array will store all of the mutexes available to OpenSSL. */
-static MUTEX_TYPE *mutex_buf= NULL;
+static MUTEX_TYPE *mutex_buf = NULL;
static void locking_function(int mode, int n, const char *file, int line)
{
diff --git a/docs/examples/pop3-multi.c b/docs/examples/pop3-multi.c
index f932918..4b87886 100644
--- a/docs/examples/pop3-multi.c
+++ b/docs/examples/pop3-multi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -144,7 +144,7 @@ int main(void)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
diff --git a/docs/examples/post-callback.c b/docs/examples/post-callback.c
index dbf2491..ebb4e2a 100644
--- a/docs/examples/post-callback.c
+++ b/docs/examples/post-callback.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -20,36 +20,45 @@
*
***************************************************************************/
/* <DESC>
- * An example source code that issues a HTTP POST and we provide the actual
- * data through a read callback.
+ * Issue an HTTP POST and provide the data through the read callback.
* </DESC>
*/
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
-static const char data[]="this is what we post to the silly web server";
+/* silly test data to POST */
+static const char data[]="Lorem ipsum dolor sit amet, consectetur adipiscing "
+ "elit. Sed vel urna neque. Ut quis leo metus. Quisque eleifend, ex at "
+ "laoreet rhoncus, odio ipsum semper metus, at tempus ante urna in mauris. "
+ "Suspendisse ornare tempor venenatis. Ut dui neque, pellentesque a varius "
+ "eget, mattis vitae ligula. Fusce ut pharetra est. Ut ullamcorper mi ac "
+ "sollicitudin semper. Praesent sit amet tellus varius, posuere nulla non, "
+ "rhoncus ipsum.";
struct WriteThis {
const char *readptr;
- long sizeleft;
+ size_t sizeleft;
};
-static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
+static size_t read_callback(void *dest, size_t size, size_t nmemb, void *userp)
{
- struct WriteThis *pooh = (struct WriteThis *)userp;
-
- if(size*nmemb < 1)
- return 0;
-
- if(pooh->sizeleft) {
- *(char *)ptr = pooh->readptr[0]; /* copy one single byte */
- pooh->readptr++; /* advance pointer */
- pooh->sizeleft--; /* less data left */
- return 1; /* we return 1 byte at a time! */
+ struct WriteThis *wt = (struct WriteThis *)userp;
+ size_t buffer_size = size*nmemb;
+
+ if(wt->sizeleft) {
+ /* copy as much as possible from the source to the destination */
+ size_t copy_this_much = wt->sizeleft;
+ if(copy_this_much > buffer_size)
+ copy_this_much = buffer_size;
+ memcpy(dest, wt->readptr, copy_this_much);
+
+ wt->readptr += copy_this_much;
+ wt->sizeleft -= copy_this_much;
+ return copy_this_much; /* we copied this many bytes */
}
- return 0; /* no more data left to deliver */
+ return 0; /* no more data left to deliver */
}
int main(void)
@@ -57,10 +66,10 @@ int main(void)
CURL *curl;
CURLcode res;
- struct WriteThis pooh;
+ struct WriteThis wt;
- pooh.readptr = data;
- pooh.sizeleft = (long)strlen(data);
+ wt.readptr = data;
+ wt.sizeleft = strlen(data);
/* In windows, this will init the winsock stuff */
res = curl_global_init(CURL_GLOBAL_DEFAULT);
@@ -75,7 +84,7 @@ int main(void)
curl = curl_easy_init();
if(curl) {
/* First set the URL that is about to receive our POST. */
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/index.cgi");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/index.cgi");
/* Now specify we want to POST data */
curl_easy_setopt(curl, CURLOPT_POST, 1L);
@@ -84,7 +93,7 @@ int main(void)
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
/* pointer to pass to our read function */
- curl_easy_setopt(curl, CURLOPT_READDATA, &pooh);
+ curl_easy_setopt(curl, CURLOPT_READDATA, &wt);
/* get verbose debug output please */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
@@ -108,7 +117,7 @@ int main(void)
#else
/* Set the expected POST size. If you want to POST large amounts of data,
consider CURLOPT_POSTFIELDSIZE_LARGE */
- curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, pooh.sizeleft);
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)wt.sizeleft);
#endif
#ifdef DISABLE_EXPECT
diff --git a/docs/examples/postinmemory.c b/docs/examples/postinmemory.c
index 9dd4cb6..488d227 100644
--- a/docs/examples/postinmemory.c
+++ b/docs/examples/postinmemory.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -58,7 +58,7 @@ int main(void)
CURL *curl;
CURLcode res;
struct MemoryStruct chunk;
- static const char *postthis="Field=1&Field=2&Field=3";
+ static const char *postthis = "Field=1&Field=2&Field=3";
chunk.memory = malloc(1); /* will be grown as needed by realloc above */
chunk.size = 0; /* no data at this point */
diff --git a/docs/examples/postit2-formadd.c b/docs/examples/postit2-formadd.c
new file mode 100644
index 0000000..0ac09f2
--- /dev/null
+++ b/docs/examples/postit2-formadd.c
@@ -0,0 +1,107 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * HTTP Multipart formpost with file upload and two additional parts.
+ * </DESC>
+ */
+/* Example code that uploads a file name 'foo' to a remote script that accepts
+ * "HTML form based" (as described in RFC1738) uploads using HTTP POST.
+ *
+ * The imaginary form we'll fill in looks like:
+ *
+ * <form method="post" enctype="multipart/form-data" action="examplepost.cgi">
+ * Enter file: <input type="file" name="sendfile" size="40">
+ * Enter file name: <input type="text" name="filename" size="30">
+ * <input type="submit" value="send" name="submit">
+ * </form>
+ *
+ * This exact source code has not been verified to work.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <curl/curl.h>
+
+int main(int argc, char *argv[])
+{
+ CURL *curl;
+ CURLcode res;
+
+ struct curl_httppost *formpost = NULL;
+ struct curl_httppost *lastptr = NULL;
+ struct curl_slist *headerlist = NULL;
+ static const char buf[] = "Expect:";
+
+ curl_global_init(CURL_GLOBAL_ALL);
+
+ /* Fill in the file upload field */
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "sendfile",
+ CURLFORM_FILE, "postit2.c",
+ CURLFORM_END);
+
+ /* Fill in the filename field */
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "filename",
+ CURLFORM_COPYCONTENTS, "postit2.c",
+ CURLFORM_END);
+
+
+ /* Fill in the submit field too, even if this is rarely needed */
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "submit",
+ CURLFORM_COPYCONTENTS, "send",
+ CURLFORM_END);
+
+ curl = curl_easy_init();
+ /* initialize custom header list (stating that Expect: 100-continue is not
+ wanted */
+ headerlist = curl_slist_append(headerlist, buf);
+ if(curl) {
+ /* what URL that receives this POST */
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/examplepost.cgi");
+ if((argc == 2) && (!strcmp(argv[1], "noexpectheader")))
+ /* only disable 100-continue header if explicitly requested */
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
+ curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+ /* Check for errors */
+ if(res != CURLE_OK)
+ fprintf(stderr, "curl_easy_perform() failed: %s\n",
+ curl_easy_strerror(res));
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+
+ /* then cleanup the formpost chain */
+ curl_formfree(formpost);
+ /* free slist */
+ curl_slist_free_all(headerlist);
+ }
+ return 0;
+}
diff --git a/docs/examples/postit2.c b/docs/examples/postit2.c
index ef50a66..49391e1 100644
--- a/docs/examples/postit2.c
+++ b/docs/examples/postit2.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,46 +47,42 @@ int main(int argc, char *argv[])
CURL *curl;
CURLcode res;
- struct curl_httppost *formpost=NULL;
- struct curl_httppost *lastptr=NULL;
- struct curl_slist *headerlist=NULL;
+ curl_mime *form = NULL;
+ curl_mimepart *field = NULL;
+ struct curl_slist *headerlist = NULL;
static const char buf[] = "Expect:";
curl_global_init(CURL_GLOBAL_ALL);
- /* Fill in the file upload field */
- curl_formadd(&formpost,
- &lastptr,
- CURLFORM_COPYNAME, "sendfile",
- CURLFORM_FILE, "postit2.c",
- CURLFORM_END);
+ curl = curl_easy_init();
+ if(curl) {
+ /* Create the form */
+ form = curl_mime_init(curl);
- /* Fill in the filename field */
- curl_formadd(&formpost,
- &lastptr,
- CURLFORM_COPYNAME, "filename",
- CURLFORM_COPYCONTENTS, "postit2.c",
- CURLFORM_END);
+ /* Fill in the file upload field */
+ field = curl_mime_addpart(form);
+ curl_mime_name(field, "sendfile");
+ curl_mime_filedata(field, "postit2.c");
+ /* Fill in the filename field */
+ field = curl_mime_addpart(form);
+ curl_mime_name(field, "filename");
+ curl_mime_data(field, "postit2.c", CURL_ZERO_TERMINATED);
- /* Fill in the submit field too, even if this is rarely needed */
- curl_formadd(&formpost,
- &lastptr,
- CURLFORM_COPYNAME, "submit",
- CURLFORM_COPYCONTENTS, "send",
- CURLFORM_END);
+ /* Fill in the submit field too, even if this is rarely needed */
+ field = curl_mime_addpart(form);
+ curl_mime_name(field, "submit");
+ curl_mime_data(field, "send", CURL_ZERO_TERMINATED);
- curl = curl_easy_init();
- /* initialize custom header list (stating that Expect: 100-continue is not
- wanted */
- headerlist = curl_slist_append(headerlist, buf);
- if(curl) {
+ /* initialize custom header list (stating that Expect: 100-continue is not
+ wanted */
+ headerlist = curl_slist_append(headerlist, buf);
/* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/examplepost.cgi");
if((argc == 2) && (!strcmp(argv[1], "noexpectheader")))
/* only disable 100-continue header if explicitly requested */
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
- curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
+ curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
@@ -98,8 +94,8 @@ int main(int argc, char *argv[])
/* always cleanup */
curl_easy_cleanup(curl);
- /* then cleanup the formpost chain */
- curl_formfree(formpost);
+ /* then cleanup the form */
+ curl_mime_free(form);
/* free slist */
curl_slist_free_all(headerlist);
}
diff --git a/docs/examples/rtsp.c b/docs/examples/rtsp.c
index 5c66aa6..3035e3f 100644
--- a/docs/examples/rtsp.c
+++ b/docs/examples/rtsp.c
@@ -129,6 +129,9 @@ static void rtsp_play(CURL *curl, const char *uri, const char *range)
my_curl_easy_setopt(curl, CURLOPT_RANGE, range);
my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_PLAY);
my_curl_easy_perform(curl);
+
+ /* switch off using range again */
+ my_curl_easy_setopt(curl, CURLOPT_RANGE, NULL);
}
diff --git a/docs/examples/sendrecv.c b/docs/examples/sendrecv.c
index 2b9dc9b..eedaf4c 100644
--- a/docs/examples/sendrecv.c
+++ b/docs/examples/sendrecv.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,7 +36,7 @@ static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
int res;
tv.tv_sec = timeout_ms / 1000;
- tv.tv_usec= (timeout_ms % 1000) * 1000;
+ tv.tv_usec = (timeout_ms % 1000) * 1000;
FD_ZERO(&infd);
FD_ZERO(&outfd);
diff --git a/docs/examples/sftpget.c b/docs/examples/sftpget.c
index 1ca7448..44a3caf 100644
--- a/docs/examples/sftpget.c
+++ b/docs/examples/sftpget.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,10 +46,10 @@ struct FtpFile {
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
void *stream)
{
- struct FtpFile *out=(struct FtpFile *)stream;
+ struct FtpFile *out = (struct FtpFile *)stream;
if(out && !out->stream) {
/* open file for writing */
- out->stream=fopen(out->filename, "wb");
+ out->stream = fopen(out->filename, "wb");
if(!out->stream)
return -1; /* failure, can't open file to write */
}
@@ -61,7 +61,7 @@ int main(void)
{
CURL *curl;
CURLcode res;
- struct FtpFile ftpfile={
+ struct FtpFile ftpfile = {
"yourfile.bin", /* name to store the file as if successful */
NULL
};
diff --git a/docs/examples/shared-connection-cache.c b/docs/examples/shared-connection-cache.c
new file mode 100644
index 0000000..a1aa0d6
--- /dev/null
+++ b/docs/examples/shared-connection-cache.c
@@ -0,0 +1,85 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Connection cache shared between easy handles with the share inteface
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+static void my_lock(CURL *handle, curl_lock_data data,
+ curl_lock_access laccess, void *useptr)
+{
+ (void)handle;
+ (void)data;
+ (void)laccess;
+ (void)useptr;
+ fprintf(stderr, "-> Mutex lock\n");
+}
+
+static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
+{
+ (void)handle;
+ (void)data;
+ (void)useptr;
+ fprintf(stderr, "<- Mutex unlock\n");
+}
+
+int main(void)
+{
+ CURL *curl;
+ CURLcode res;
+ CURLSH *share;
+ int i;
+
+ share = curl_share_init();
+ curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
+
+ curl_share_setopt(share, CURLSHOPT_LOCKFUNC, my_lock);
+ curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, my_unlock);
+
+ /* Loop the transfer and cleanup the handle properly every lap. This will
+ still reuse connections since the pool is in the shared object! */
+
+ for(i = 0; i < 3; i++) {
+ curl = curl_easy_init();
+ if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://curl.haxx.se/");
+
+ /* use the share object */
+ curl_easy_setopt(curl, CURLOPT_SHARE, share);
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+ /* Check for errors */
+ if(res != CURLE_OK)
+ fprintf(stderr, "curl_easy_perform() failed: %s\n",
+ curl_easy_strerror(res));
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+ }
+ }
+
+ curl_share_cleanup(share);
+ return 0;
+}
diff --git a/docs/examples/simplepost.c b/docs/examples/simplepost.c
index 99df057..e366f00 100644
--- a/docs/examples/simplepost.c
+++ b/docs/examples/simplepost.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,7 +32,7 @@ int main(void)
CURL *curl;
CURLcode res;
- static const char *postthis="moo mooo moo moo";
+ static const char *postthis = "moo mooo moo moo";
curl = curl_easy_init();
if(curl) {
diff --git a/docs/examples/simplessl.c b/docs/examples/simplessl.c
index 81713ab..fdc7cf1 100644
--- a/docs/examples/simplessl.c
+++ b/docs/examples/simplessl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -53,7 +53,7 @@ int main(void)
const char *pPassphrase = NULL;
static const char *pCertFile = "testcert.pem";
- static const char *pCACertFile="cacert.pem";
+ static const char *pCACertFile = "cacert.pem";
static const char *pHeaderFile = "dumpit";
const char *pKeyName;
diff --git a/docs/examples/smooth-gtk-thread.c b/docs/examples/smooth-gtk-thread.c
index 713fcc6..8451743 100644
--- a/docs/examples/smooth-gtk-thread.c
+++ b/docs/examples/smooth-gtk-thread.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -134,7 +134,7 @@ void *create_thread(void *progress_bar)
int error;
/* Make sure I don't create more threads than urls. */
- for(i=0; i < NUMT && i < num_urls ; i++) {
+ for(i = 0; i < NUMT && i < num_urls ; i++) {
error = pthread_create(&tid[i],
NULL, /* default attributes please */
pull_one_url,
@@ -146,7 +146,7 @@ void *create_thread(void *progress_bar)
}
/* Wait for all threads to terminate. */
- for(i=0; i < NUMT && i < num_urls; i++) {
+ for(i = 0; i < NUMT && i < num_urls; i++) {
error = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
diff --git a/docs/examples/smtp-mail.c b/docs/examples/smtp-mail.c
index 315bb2c..1fabe4b 100644
--- a/docs/examples/smtp-mail.c
+++ b/docs/examples/smtp-mail.c
@@ -43,8 +43,8 @@
static const char *payload_text[] = {
"Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
"To: " TO "\r\n",
- "From: " FROM "(Example User)\r\n",
- "Cc: " CC "(Another example User)\r\n",
+ "From: " FROM " (Example User)\r\n",
+ "Cc: " CC " (Another example User)\r\n",
"Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
"rfcpedant.example.org>\r\n",
"Subject: SMTP example message\r\n",
diff --git a/docs/examples/smtp-mime.c b/docs/examples/smtp-mime.c
new file mode 100644
index 0000000..dcd867f
--- /dev/null
+++ b/docs/examples/smtp-mime.c
@@ -0,0 +1,162 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * SMTP example showing how to send mime e-mails
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to send mime mail using libcurl's SMTP
+ * capabilities. For an example of using the multi interface please see
+ * smtp-multi.c.
+ *
+ * Note that this example requires libcurl 7.56.0 or above.
+ */
+
+#define FROM "<sender@example.org>"
+#define TO "<addressee@example.net>"
+#define CC "<info@example.org>"
+
+static const char *headers_text[] = {
+ "Date: Tue, 22 Aug 2017 14:08:43 +0100",
+ "To: " TO,
+ "From: " FROM " (Example User)",
+ "Cc: " CC " (Another example User)",
+ "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
+ "rfcpedant.example.org>",
+ "Subject: example sending a MIME-formatted message",
+ NULL
+};
+
+static const char inline_text[] =
+ "This is the inline text message of the e-mail.\r\n"
+ "\r\n"
+ " It could be a lot of lines that would be displayed in an e-mail\r\n"
+ "viewer that is not able to handle HTML.\r\n";
+
+static const char inline_html[] =
+ "<html><body>\r\n"
+ "<p>This is the inline <b>HTML</b> message of the e-mail.</p>"
+ "<br />\r\n"
+ "<p>It could be a lot of HTML data that would be displayed by "
+ "e-mail viewers able to handle HTML.</p>"
+ "</body></html>\r\n";
+
+
+int main(void)
+{
+ CURL *curl;
+ CURLcode res = CURLE_OK;
+ struct curl_slist *headers = NULL;
+ struct curl_slist *recipients = NULL;
+ struct curl_slist *slist = NULL;
+ curl_mime *mime;
+ curl_mime *alt;
+ curl_mimepart *part;
+ const char **cpp;
+
+ curl = curl_easy_init();
+ if(curl) {
+ /* This is the URL for your mailserver */
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
+
+ /* Note that this option isn't strictly required, omitting it will result
+ * in libcurl sending the MAIL FROM command with empty sender data. All
+ * autoresponses should have an empty reverse-path, and should be directed
+ * to the address in the reverse-path which triggered them. Otherwise,
+ * they could cause an endless loop. See RFC 5321 Section 4.5.5 for more
+ * details.
+ */
+ curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM);
+
+ /* Add two recipients, in this particular case they correspond to the
+ * To: and Cc: addressees in the header, but they could be any kind of
+ * recipient. */
+ recipients = curl_slist_append(recipients, TO);
+ recipients = curl_slist_append(recipients, CC);
+ curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+ /* Build and set the message header list. */
+ for(cpp = headers_text; *cpp; cpp++)
+ headers = curl_slist_append(headers, *cpp);
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+
+ /* Build the mime message. */
+ mime = curl_mime_init(curl);
+
+ /* The inline part is an alterative proposing the html and the text
+ versions of the e-mail. */
+ alt = curl_mime_init(curl);
+
+ /* HTML message. */
+ part = curl_mime_addpart(alt);
+ curl_mime_data(part, inline_html, CURL_ZERO_TERMINATED);
+ curl_mime_type(part, "text/html");
+
+ /* Text message. */
+ part = curl_mime_addpart(alt);
+ curl_mime_data(part, inline_text, CURL_ZERO_TERMINATED);
+
+ /* Create the inline part. */
+ part = curl_mime_addpart(mime);
+ curl_mime_subparts(part, alt);
+ curl_mime_type(part, "multipart/alternative");
+ slist = curl_slist_append(NULL, "Content-Disposition: inline");
+ curl_mime_headers(part, slist, 1);
+
+ /* Add the current source program as an attachment. */
+ part = curl_mime_addpart(mime);
+ curl_mime_filedata(part, "smtp-mime.c");
+ curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
+
+ /* Send the message */
+ res = curl_easy_perform(curl);
+
+ /* Check for errors */
+ if(res != CURLE_OK)
+ fprintf(stderr, "curl_easy_perform() failed: %s\n",
+ curl_easy_strerror(res));
+
+ /* Free lists. */
+ curl_slist_free_all(recipients);
+ curl_slist_free_all(headers);
+
+ /* curl won't send the QUIT command until you call cleanup, so you should
+ * be able to re-use this connection for additional messages (setting
+ * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling
+ * curl_easy_perform() again. It may not be a good idea to keep the
+ * connection open for a very long time though (more than a few minutes
+ * may result in the server timing out the connection), and you do want to
+ * clean up in the end.
+ */
+ curl_easy_cleanup(curl);
+
+ /* Free multipart message. */
+ curl_mime_free(mime);
+ }
+
+ return (int)res;
+}
diff --git a/docs/examples/smtp-multi.c b/docs/examples/smtp-multi.c
index 89e1d94..bd70bdb 100644
--- a/docs/examples/smtp-multi.c
+++ b/docs/examples/smtp-multi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,8 +44,8 @@
static const char *payload_text[] = {
"Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
"To: " TO "\r\n",
- "From: " FROM "(Example User)\r\n",
- "Cc: " CC "(Another example User)\r\n",
+ "From: " FROM " (Example User)\r\n",
+ "Cc: " CC " (Another example User)\r\n",
"Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
"rfcpedant.example.org>\r\n",
"Subject: SMTP multi example message\r\n",
@@ -211,7 +211,7 @@ int main(void)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
diff --git a/docs/examples/smtp-ssl.c b/docs/examples/smtp-ssl.c
index f012340..019da7d 100644
--- a/docs/examples/smtp-ssl.c
+++ b/docs/examples/smtp-ssl.c
@@ -44,8 +44,8 @@
static const char *payload_text[] = {
"Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
"To: " TO "\r\n",
- "From: " FROM "(Example User)\r\n",
- "Cc: " CC "(Another example User)\r\n",
+ "From: " FROM " (Example User)\r\n",
+ "Cc: " CC " (Another example User)\r\n",
"Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
"rfcpedant.example.org>\r\n",
"Subject: SMTP SSL example message\r\n",
diff --git a/docs/examples/smtp-tls.c b/docs/examples/smtp-tls.c
index c863e05..671a80d 100644
--- a/docs/examples/smtp-tls.c
+++ b/docs/examples/smtp-tls.c
@@ -44,8 +44,8 @@
static const char *payload_text[] = {
"Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
"To: " TO "\r\n",
- "From: " FROM "(Example User)\r\n",
- "Cc: " CC "(Another example User)\r\n",
+ "From: " FROM " (Example User)\r\n",
+ "Cc: " CC " (Another example User)\r\n",
"Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
"rfcpedant.example.org>\r\n",
"Subject: SMTP TLS example message\r\n",
diff --git a/docs/examples/sslbackend.c b/docs/examples/sslbackend.c
new file mode 100644
index 0000000..1483dcc
--- /dev/null
+++ b/docs/examples/sslbackend.c
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Shows HTTPS usage with client certs and optional ssl engine use.
+ * </DESC>
+ */
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <curl/curl.h>
+
+/*
+ * An SSL-enabled libcurl is required for this sample to work (at least one
+ * SSL backend has to be configured).
+ *
+ * **** This example only works with libcurl 7.56.0 and later! ****
+*/
+
+int main(int argc, char **argv)
+{
+ const char *name = argc > 1 ? argv[1] : "openssl";
+ CURLsslset result;
+
+ if(!strcmp("list", name)) {
+ const curl_ssl_backend **list;
+ int i;
+
+ result = curl_global_sslset(-1, NULL, &list);
+ assert(result == CURLSSLSET_UNKNOWN_BACKEND);
+
+ for(i = 0; list[i]; i++)
+ printf("SSL backend #%d: '%s' (ID: %d)\n",
+ i, list[i]->name, list[i]->id);
+
+ return 0;
+ }
+ else if(isdigit(*name)) {
+ curl_sslbackend id = (curl_sslbackend)atoi(name);
+
+ result = curl_global_sslset(id, NULL, NULL);
+ }
+ else
+ result = curl_global_sslset(-1, name, NULL);
+
+ if(result == CURLSSLSET_UNKNOWN_BACKEND) {
+ fprintf(stderr, "Unknown SSL backend id: %s\n", name);
+ return 1;
+ }
+
+ assert(result == CURLSSLSET_OK);
+
+ printf("Version with SSL backend '%s':\n\n\t%s\n", name, curl_version());
+
+ return 0;
+}
diff --git a/docs/examples/synctime.c b/docs/examples/synctime.c
index 48377f5..e5cdfed 100644
--- a/docs/examples/synctime.c
+++ b/docs/examples/synctime.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -94,7 +94,7 @@
#define MAX_STRING 256
-#define MAX_STRING1 MAX_STRING+1
+#define MAX_STRING1 MAX_STRING + 1
#define SYNCTIME_UA "synctime/1.0"
@@ -158,9 +158,9 @@ size_t SyncTime_CURL_WriteHeader(void *ptr, size_t size, size_t nmemb,
if(RetVal == 7) {
SYSTime.wMilliseconds = 500; /* adjust to midpoint, 0.5 sec */
- for(i=0; i<12; i++) {
+ for(i = 0; i<12; i++) {
if(strcmp(MthStr[i], TmpStr2) == 0) {
- SYSTime.wMonth = i+1;
+ SYSTime.wMonth = i + 1;
break;
}
}
@@ -243,7 +243,7 @@ int conf_init(conf_t *conf)
int i;
*conf->http_proxy = 0;
- for(i=0; i<MAX_STRING1; i++)
+ for(i = 0; i<MAX_STRING1; i++)
conf->proxy_user[i] = 0; /* Clean up password from memory */
*conf->timeserver = 0;
return 1;
diff --git a/docs/examples/threaded-ssl.c b/docs/examples/threaded-ssl.c
index 5f1d9b9..adf4629 100644
--- a/docs/examples/threaded-ssl.c
+++ b/docs/examples/threaded-ssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,7 +25,7 @@
* </DESC>
*/
/* A multi-threaded example that uses pthreads and fetches 4 remote files at
- * once over HTTPS. The lock callbacks and stuff assume OpenSSL or GnuTLS
+ * once over HTTPS. The lock callbacks and stuff assume OpenSSL <1.1 or GnuTLS
* (libgcrypt) so far.
*
* OpenSSL docs for this:
@@ -63,7 +63,7 @@ static unsigned long thread_id(void)
{
unsigned long ret;
- ret=(unsigned long)pthread_self();
+ ret = (unsigned long)pthread_self();
return ret;
}
@@ -71,9 +71,9 @@ static void init_locks(void)
{
int i;
- lockarray=(pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() *
- sizeof(pthread_mutex_t));
- for(i=0; i<CRYPTO_num_locks(); i++) {
+ lockarray = (pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() *
+ sizeof(pthread_mutex_t));
+ for(i = 0; i<CRYPTO_num_locks(); i++) {
pthread_mutex_init(&(lockarray[i]), NULL);
}
@@ -86,7 +86,7 @@ static void kill_locks(void)
int i;
CRYPTO_set_locking_callback(NULL);
- for(i=0; i<CRYPTO_num_locks(); i++)
+ for(i = 0; i<CRYPTO_num_locks(); i++)
pthread_mutex_destroy(&(lockarray[i]));
OPENSSL_free(lockarray);
@@ -144,7 +144,7 @@ int main(int argc, char **argv)
init_locks();
- for(i=0; i< NUMT; i++) {
+ for(i = 0; i< NUMT; i++) {
error = pthread_create(&tid[i],
NULL, /* default attributes please */
pull_one_url,
@@ -156,7 +156,7 @@ int main(int argc, char **argv)
}
/* now wait for all threads to terminate */
- for(i=0; i< NUMT; i++) {
+ for(i = 0; i< NUMT; i++) {
error = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
diff --git a/docs/examples/usercertinmem.c b/docs/examples/usercertinmem.c
index 77fde91..40505b0 100644
--- a/docs/examples/usercertinmem.c
+++ b/docs/examples/usercertinmem.c
@@ -200,7 +200,7 @@ int main(void)
/* first try: retrieve page without user certificate and key -> will fail
*/
rv = curl_easy_perform(ch);
- if(rv==CURLE_OK) {
+ if(rv == CURLE_OK) {
printf("*** transfer succeeded ***\n");
}
else {
@@ -213,7 +213,7 @@ int main(void)
*/
rv = curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
rv = curl_easy_perform(ch);
- if(rv==CURLE_OK) {
+ if(rv == CURLE_OK) {
printf("*** transfer succeeded ***\n");
}
else {
diff --git a/docs/libcurl/Makefile.inc b/docs/libcurl/Makefile.inc
index 2f78772..86a0026 100644
--- a/docs/libcurl/Makefile.inc
+++ b/docs/libcurl/Makefile.inc
@@ -17,4 +17,8 @@ man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \
curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3 \
curl_easy_pause.3 curl_easy_recv.3 curl_easy_send.3 \
curl_multi_socket_action.3 curl_multi_wait.3 libcurl-symbols.3 \
- libcurl-thread.3 curl_multi_socket_all.3
+ libcurl-thread.3 curl_multi_socket_all.3 curl_global_sslset.3 \
+ curl_mime_init.3 curl_mime_free.3 curl_mime_addpart.3 curl_mime_name.3 \
+ curl_mime_data.3 curl_mime_data_cb.3 curl_mime_filedata.3 \
+ curl_mime_filename.3 curl_mime_subparts.3 \
+ curl_mime_type.3 curl_mime_headers.3 curl_mime_encoder.3
diff --git a/docs/libcurl/curl_easy_cleanup.3 b/docs/libcurl/curl_easy_cleanup.3
index 50d5dd1..33e3117 100644
--- a/docs/libcurl/curl_easy_cleanup.3
+++ b/docs/libcurl/curl_easy_cleanup.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_cleanup 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_cleanup 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_cleanup - End a libcurl easy handle
diff --git a/docs/libcurl/curl_easy_duphandle.3 b/docs/libcurl/curl_easy_duphandle.3
index 3d54eb1..1384fc8 100644
--- a/docs/libcurl/curl_easy_duphandle.3
+++ b/docs/libcurl/curl_easy_duphandle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_duphandle 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_duphandle 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_duphandle - Clone a libcurl session handle
diff --git a/docs/libcurl/curl_easy_escape.3 b/docs/libcurl/curl_easy_escape.3
index 43312e7..4080192 100644
--- a/docs/libcurl/curl_easy_escape.3
+++ b/docs/libcurl/curl_easy_escape.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_escape - URL encodes the given string
diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3
index 8a6f5d3..37e65c0 100644
--- a/docs/libcurl/curl_easy_getinfo.3
+++ b/docs/libcurl/curl_easy_getinfo.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_getinfo 3 "June 15, 2017" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_getinfo 3 "June 15, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_getinfo - extract information from a curl handle
diff --git a/docs/libcurl/curl_easy_init.3 b/docs/libcurl/curl_easy_init.3
index 48e94c5..de05284 100644
--- a/docs/libcurl/curl_easy_init.3
+++ b/docs/libcurl/curl_easy_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_init - Start a libcurl easy session
diff --git a/docs/libcurl/curl_easy_pause.3 b/docs/libcurl/curl_easy_pause.3
index edae081..7182788 100644
--- a/docs/libcurl/curl_easy_pause.3
+++ b/docs/libcurl/curl_easy_pause.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_pause - pause and unpause a connection
diff --git a/docs/libcurl/curl_easy_perform.3 b/docs/libcurl/curl_easy_perform.3
index a8f6aad..377c890 100644
--- a/docs/libcurl/curl_easy_perform.3
+++ b/docs/libcurl/curl_easy_perform.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_perform 3 "May 02, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_perform 3 "May 02, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_perform - perform a blocking file transfer
diff --git a/docs/libcurl/curl_easy_recv.3 b/docs/libcurl/curl_easy_recv.3
index 2ad8d39..1e104a4 100644
--- a/docs/libcurl/curl_easy_recv.3
+++ b/docs/libcurl/curl_easy_recv.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_recv - receives raw data on an "easy" connection
diff --git a/docs/libcurl/curl_easy_reset.3 b/docs/libcurl/curl_easy_reset.3
index 7cb634d..d575f07 100644
--- a/docs/libcurl/curl_easy_reset.3
+++ b/docs/libcurl/curl_easy_reset.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_reset 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_reset 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_reset - reset all options of a libcurl session handle
diff --git a/docs/libcurl/curl_easy_send.3 b/docs/libcurl/curl_easy_send.3
index 57b9059..f7a5c7c 100644
--- a/docs/libcurl/curl_easy_send.3
+++ b/docs/libcurl/curl_easy_send.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_send - sends raw data over an "easy" connection
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index 2986ff8..e2db278 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_setopt 3 "April 27, 2017" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_setopt 3 "September 02, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_setopt \- set options for a curl easy handle
@@ -412,6 +412,8 @@ Size of file to send. \fICURLOPT_INFILESIZE(3)\fP
Size of file to send. \fICURLOPT_INFILESIZE_LARGE(3)\fP
.IP CURLOPT_UPLOAD
Upload data. See \fICURLOPT_UPLOAD(3)\fP
+.IP CURLOPT_MIMEPOST
+Post/send MIME data. See \fICURLOPT_MIMEPOST(3)\fP
.IP CURLOPT_MAXFILESIZE
Maximum file size to get. See \fICURLOPT_MAXFILESIZE(3)\fP
.IP CURLOPT_MAXFILESIZE_LARGE
@@ -548,6 +550,8 @@ Disable GSS-API delegation. See \fICURLOPT_GSSAPI_DELEGATION(3)\fP
.SH SSH OPTIONS
.IP CURLOPT_SSH_AUTH_TYPES
SSH authentication types. See \fICURLOPT_SSH_AUTH_TYPES(3)\fP
+.IP CURLOPT_SSH_COMPRESSION
+Enable SSH compression. See \fICURLOPT_SSH_COMPRESSION(3)\fP
.IP CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
MD5 of host's public key. See \fICURLOPT_SSH_HOST_PUBLIC_KEY_MD5(3)\fP
.IP CURLOPT_SSH_PUBLIC_KEYFILE
diff --git a/docs/libcurl/curl_easy_strerror.3 b/docs/libcurl/curl_easy_strerror.3
index d6bba96..181f956 100644
--- a/docs/libcurl/curl_easy_strerror.3
+++ b/docs/libcurl/curl_easy_strerror.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_strerror - return string describing error code
diff --git a/docs/libcurl/curl_easy_unescape.3 b/docs/libcurl/curl_easy_unescape.3
index 01f823f..670f1b8 100644
--- a/docs/libcurl/curl_easy_unescape.3
+++ b/docs/libcurl/curl_easy_unescape.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_easy_unescape - URL decodes the given string
diff --git a/docs/libcurl/curl_escape.3 b/docs/libcurl/curl_escape.3
index 545929c..964140c 100644
--- a/docs/libcurl/curl_escape.3
+++ b/docs/libcurl/curl_escape.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_escape 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_escape 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_escape - URL encodes the given string
diff --git a/docs/libcurl/curl_formadd.3 b/docs/libcurl/curl_formadd.3
index fbb0ff4..fed2970 100644
--- a/docs/libcurl/curl_formadd.3
+++ b/docs/libcurl/curl_formadd.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formadd 3 "December 28, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_formadd 3 "October 08, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_formadd - add a section to a multipart/formdata HTTP POST
@@ -30,6 +30,8 @@ curl_formadd - add a section to a multipart/formdata HTTP POST
.BI "struct curl_httppost ** " lastitem, " ...);"
.ad
.SH DESCRIPTION
+This function is deprecated. Do not use! See \fIcurl_mime_init(3)\fP instead!
+
curl_formadd() is used to append sections when building a multipart/formdata
HTTP POST (sometimes referred to as RFC2388-style posts). Append one section
at a time until you've added all the sections you want included and then you
@@ -61,16 +63,15 @@ parts.
.IP CURLFORM_COPYNAME
followed by a string which provides the \fIname\fP of this part. libcurl
copies the string so your application doesn't need to keep it around after
-this function call. If the name isn't NUL-terminated, or if you'd
-like it to contain zero bytes, you must set its length with
-\fBCURLFORM_NAMELENGTH\fP. The copied data will be freed by
-\fIcurl_formfree(3)\fP.
+this function call. If the name isn't NUL-terminated, you must set its length
+with \fBCURLFORM_NAMELENGTH\fP. The \fIname\fP is not allowed to contain
+zero-valued bytes. The copied data will be freed by \fIcurl_formfree(3)\fP.
.IP CURLFORM_PTRNAME
followed by a string which provides the \fIname\fP of this part. libcurl
will use the pointer and refer to the data in your application, so you
must make sure it remains until curl no longer needs it. If the name
-isn't NUL-terminated, or if you'd like it to contain zero
-bytes, you must set its length with \fBCURLFORM_NAMELENGTH\fP.
+isn't NUL-terminated, you must set its length with \fBCURLFORM_NAMELENGTH\fP.
+The \fIname\fP is not allowed to contain zero-valued bytes.
.IP CURLFORM_COPYCONTENTS
followed by a pointer to the contents of this part, the actual data
to send away. libcurl copies the provided data, so your application doesn't
@@ -170,6 +171,12 @@ the \fICURLOPT_HTTPPOST(3)\fP option), you must not free the list until after
you've called \fIcurl_easy_cleanup(3)\fP for the curl handle.
See example below.
+.SH AVAILABILITY
+Deprecated in 7.56.0. Before this release, field names were allowed to
+contain zero-valued bytes. The pseudo-filename "-" to read stdin is
+discouraged although still supported, but data is not read before being
+actually sent: the effective data size can then not be automatically
+determined, resulting in a chunked encoding transfer.
.SH RETURN VALUE
0 means everything was ok, non-zero means an error occurred corresponding
to a CURL_FORMADD_* constant defined in
@@ -255,5 +262,6 @@ to a CURL_FORMADD_* constant defined in
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
.SH "SEE ALSO"
-.BR curl_easy_setopt "(3), "
-.BR curl_formfree "(3)"
+.BR curl_easy_setopt "(3),"
+.BR curl_formfree "(3),"
+.BR curl_mime_init "(3)"
diff --git a/docs/libcurl/curl_formfree.3 b/docs/libcurl/curl_formfree.3
index aba8629..df74dbd 100644
--- a/docs/libcurl/curl_formfree.3
+++ b/docs/libcurl/curl_formfree.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formfree 3 "May 02, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_formfree 3 "September 02, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_formfree - free a previously build multipart/formdata HTTP POST chain
@@ -29,6 +29,8 @@ curl_formfree - free a previously build multipart/formdata HTTP POST chain
.BI "void curl_formfree(struct curl_httppost *" form);
.ad
.SH DESCRIPTION
+This function is deprecated. Do not use! See \fIcurl_mime_init(3)\fP instead!
+
curl_formfree() is used to clean up data previously built/appended with
\fIcurl_formadd(3)\fP. This must be called when the data has been used, which
typically means after \fIcurl_easy_perform(3)\fP has been called.
@@ -39,7 +41,9 @@ the \fIcurl_formadd(3)\fP invoke(s).
\fBform\fP is the pointer as returned from a previous call to
\fIcurl_formadd(3)\fP and may be NULL.
+.SH AVAILABILITY
+Deprecated in 7.56.0.
.SH RETURN VALUE
None
.SH "SEE ALSO"
-.BR curl_formadd "(3) "
+.BR curl_formadd "(3), " curl_mime_init "(3), " curl_mime_free "(3)"
diff --git a/docs/libcurl/curl_formget.3 b/docs/libcurl/curl_formget.3
index e0e91b6..245a8c7 100644
--- a/docs/libcurl/curl_formget.3
+++ b/docs/libcurl/curl_formget.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formget 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_formget 3 "September 02, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_formget - serialize a previously built multipart/formdata HTTP POST chain
@@ -66,6 +66,7 @@ request as only then will libcurl get the actual read callback to use!
return total_size;
}
.SH AVAILABILITY
-This function was added in libcurl 7.15.5
+This function was added in libcurl 7.15.5. The form API is deprecated in
+libcurl 7.56.0.
.SH "SEE ALSO"
-.BR curl_formadd "(3) "
+.BR curl_formadd "(3), " curl_mime_init "(3)"
diff --git a/docs/libcurl/curl_free.3 b/docs/libcurl/curl_free.3
index 94d4d57..802ca28 100644
--- a/docs/libcurl/curl_free.3
+++ b/docs/libcurl/curl_free.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_free 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_free 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_free - reclaim memory that has been obtained through a libcurl call
diff --git a/docs/libcurl/curl_getdate.3 b/docs/libcurl/curl_getdate.3
index 770baea..9621f4e 100644
--- a/docs/libcurl/curl_getdate.3
+++ b/docs/libcurl/curl_getdate.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getdate 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_getdate 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_getdate - Convert a date string to number of seconds
diff --git a/docs/libcurl/curl_getenv.3 b/docs/libcurl/curl_getenv.3
index 5eb6f62..72d8ef6 100644
--- a/docs/libcurl/curl_getenv.3
+++ b/docs/libcurl/curl_getenv.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getenv 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_getenv 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_getenv - return value for environment name
diff --git a/docs/libcurl/curl_global_cleanup.3 b/docs/libcurl/curl_global_cleanup.3
index 2b8f105..9a9f7ad 100644
--- a/docs/libcurl/curl_global_cleanup.3
+++ b/docs/libcurl/curl_global_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_global_cleanup - global libcurl cleanup
diff --git a/docs/libcurl/curl_global_init.3 b/docs/libcurl/curl_global_init.3
index 62b1666..ba19213 100644
--- a/docs/libcurl/curl_global_init.3
+++ b/docs/libcurl/curl_global_init.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init 3 "June 29, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_global_init 3 "November 23, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_global_init - Global libcurl initialisation
@@ -63,6 +63,9 @@ Initialize everything possible. This sets all known bits except
\fBCURL_GLOBAL_ACK_EINTR\fP.
.IP CURL_GLOBAL_SSL
+(This flag's presence or absense serves no meaning since 7.57.0. The
+description below is for older libcurl versions.)
+
Initialize SSL.
The implication here is that if this bit is not set, the initialization of the
@@ -94,5 +97,6 @@ other curl functions.
.SH "SEE ALSO"
.BR curl_global_init_mem "(3), "
.BR curl_global_cleanup "(3), "
+.BR curl_global_sslset "(3), "
.BR curl_easy_init "(3) "
.BR libcurl "(3) "
diff --git a/docs/libcurl/curl_global_init_mem.3 b/docs/libcurl/curl_global_init_mem.3
index 84f5340..8ab85f7 100644
--- a/docs/libcurl/curl_global_init_mem.3
+++ b/docs/libcurl/curl_global_init_mem.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init_mem 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_global_init_mem 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_global_init_mem - Global libcurl initialisation with memory callbacks
diff --git a/docs/libcurl/curl_global_sslset.3 b/docs/libcurl/curl_global_sslset.3
new file mode 100644
index 0000000..e500763
--- /dev/null
+++ b/docs/libcurl/curl_global_sslset.3
@@ -0,0 +1,98 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_global_sslset 3 "September 21, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_global_sslset - Select SSL backend to use with libcurl
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.nf
+
+typedef struct {
+ curl_sslbackend id;
+ const char *name;
+} curl_ssl_backend;
+
+typedef enum {
+ CURLSSLBACKEND_NONE = 0,
+ CURLSSLBACKEND_OPENSSL = 1,
+ CURLSSLBACKEND_GNUTLS = 2,
+ CURLSSLBACKEND_NSS = 3,
+ CURLSSLBACKEND_GSKIT = 5,
+ CURLSSLBACKEND_POLARSSL = 6,
+ CURLSSLBACKEND_WOLFSSL = 7,
+ CURLSSLBACKEND_SCHANNEL = 8,
+ CURLSSLBACKEND_DARWINSSL = 9,
+ CURLSSLBACKEND_AXTLS = 10,
+ CURLSSLBACKEND_MBEDTLS = 11
+} curl_sslbackend;
+
+.B "CURLsslset curl_global_sslset(curl_sslbackend " id,
+.B " const char *" name,
+.B " curl_ssl_backend ***" avail ");"
+.fi
+.SH DESCRIPTION
+This function configures at runtime which SSL backend to use with
+libcurl. This function can only be used to select an SSL backend once, and it
+must be called \fBbefore\fP \fIcurl_global_init(3)\fP.
+
+The backend can be identified by the \fIid\fP
+(e.g. \fBCURLSSLBACKEND_OPENSSL\fP). The backend can also be specified via the
+\fIname\fP parameter for a case insensitive match (passing -1 as \fIid\fP). If
+both \fIid\fP and \fIname\fP are specified, the \fIname\fP will be ignored.
+
+If neither \fIid\fP nor \fPname\fP are specified, the function will fail with
+CURLSSLSET_UNKNOWN_BACKEND and set the \fIavail\fP pointer to the
+NULL-terminated list of available backends. The available backends are those
+that this particular build of libcurl supports.
+
+Upon success, the function returns CURLSSLSET_OK.
+
+If the specified SSL backend is not available, the function returns
+CURLSSLSET_UNKNOWN_BACKEND and sets the \fIavail\fP pointer to a
+NULL-terminated list of available SSL backends. In this case, you may call the
+function again to try to select a different backend.
+
+The SSL backend can be set only once. If it has already been set, a subsequent
+attempt to change it will result in a \fBCURLSSLSET_TOO_LATE\fP.
+
+\fBThis function is not thread safe.\fP You must not call it when any other
+thread in the program (i.e. a thread sharing the same memory) is running.
+This doesn't just mean no other thread that is using libcurl.
+
+.SH AVAILABILITY
+This function was added in libcurl 7.56.0. Before this version, there was no
+support for choosing SSL backends at runtime.
+.SH RETURN VALUE
+If this function returns CURLSSLSET_OK, the backend was successfully selected.
+
+If the chosen backend is unknown (or support for the chosed backend has not
+been compiled into libcurl), the function returns \fICURLSSLSET_UNKNOWN_BACKEND\fP.
+
+If the backend had been configured previously, or if \fIcurl_global_init(3)\fP
+has already been called, the function returns \fICURLSSLSET_TOO_LATE\fP.
+
+If this libcurl was built completely without SSL support, with no backends at
+all, this function returns \fICURLSSLSET_NO_BACKENDS\fP.
+.SH "SEE ALSO"
+.BR curl_global_init "(3), "
+.BR libcurl "(3) "
diff --git a/docs/libcurl/curl_mime_addpart.3 b/docs/libcurl/curl_mime_addpart.3
new file mode 100644
index 0000000..7496731
--- /dev/null
+++ b/docs/libcurl/curl_mime_addpart.3
@@ -0,0 +1,67 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_addpart - append a new empty part to a mime structure
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "curl_mimepart * curl_mime_addpart(curl_mime * " mime ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_addpart(3)\fP creates and appends a new empty part to the given
+mime structure and returns a handle to it. The returned part handle can
+subsequently be populated using functions from the mime API.
+
+\fImime\fP is the handle of the mime structure in which the new part must be
+appended.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+A mime part structure handle, or NULL upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* continue and set name + data to the part */
+ curl_mime_data(part, "This is the field data", CURL_ZERO_TERMINATED);
+ curl_mime_name(part, "data");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_init "(3),"
+.BR curl_mime_name "(3),"
+.BR curl_mime_data "(3),"
+.BR curl_mime_data_cb "(3),"
+.BR curl_mime_filedata "(3),"
+.BR curl_mime_filename "(3),"
+.BR curl_mime_subparts "(3),"
+.BR curl_mime_type "(3),"
+.BR curl_mime_headers "(3),"
+.BR curl_mime_encoder "(3)"
diff --git a/docs/libcurl/curl_mime_data.3 b/docs/libcurl/curl_mime_data.3
new file mode 100644
index 0000000..bfeb8f0
--- /dev/null
+++ b/docs/libcurl/curl_mime_data.3
@@ -0,0 +1,70 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_data 3 "September 22, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_data - set a mime part's body data from memory
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLcode curl_mime_data(curl_mimepart * " part ", const char * " data
+.BI ", size_t " datasize ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_data(3)\fP sets a mime part's body content from memory data.
+
+\fIdata\fP points to the data bytes: those are copied to the part and their
+storage may safely be reused after call.
+\fIdatasize\fP is the number of data bytes: it can be set to
+\fICURL_ZERO_TERMINATED\fP to indicate \fIdata\fP is a nul-terminated
+character string.
+\fIpart\fP is the part's to assign contents to.
+
+Setting a part's contents twice is valid: only the value set by the last call
+is retained. It is possible to unassign part's contents by setting
+\fIdata\fP to NULL.
+
+Setting very large data is memory consuming: one might consider using
+\fIcurl_mime_data_cb(3)\fP in such a case.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* add data to the part */
+ curl_mime_data(part, "raw contents to send", CURL_ZERO_TERMINATED);
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_data_cb "(3),"
+.BR curl_mime_name "(3),"
+.BR curl_mime_type "(3)"
diff --git a/docs/libcurl/curl_mime_data_cb.3 b/docs/libcurl/curl_mime_data_cb.3
new file mode 100644
index 0000000..6a47000
--- /dev/null
+++ b/docs/libcurl/curl_mime_data_cb.3
@@ -0,0 +1,161 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_data_cb 3 "October 04, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_data_cb - set a callback-based data source for a mime part's body
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+size_t readfunc(char *buffer, size_t size, size_t nitems, void *arg);
+.br
+int seekfunc(void *arg, curl_off_t offset, int origin);
+.br
+void freefunc(void *arg);
+.sp
+.BI "CURLcode curl_mime_data_cb(curl_mimepart * " part ", curl_off_t " datasize ,
+.br
+.BI " curl_read_callback " readfunc ", curl_seek_callback " seekfunc ,
+.br
+.BI " curl_free_callback " freefunc ", void * " arg ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_data_cb(3)\fP sets the data source of a mime part's body content
+from a data read callback function.
+
+\fIpart\fP is the part's to assign contents to.
+
+\fIreadfunc\fP is a pointer to a data read callback function, with a signature
+as shown by the above prototype. It may not be set to NULL.
+
+\fIseekfunc\fP is a pointer to a seek callback function, with a signature as
+shown by the above prototype. This function will be used upon resending data
+(i.e.: after a redirect); this pointer may be set to NULL, in which case a
+resend is not possible.
+
+\fIfreefunc\fP is a pointer to a user resource freeing callback function, with
+a signature as shown by the above prototype. If no resource is to be freed, it
+may safely be set to NULL. This function will be called upon mime structure
+freeing.
+
+\fIarg\fP is a user defined argument to callback functions.
+
+The read callback function gets called by libcurl as soon as it needs to
+read data in order to send it to the peer - like if you ask it to upload or
+post data to the server. The data area pointed at by the pointer \fIbuffer\fP
+should be filled up with at most \fIsize\fP multiplied with \fInmemb\fP number
+of bytes by your function.
+
+Your read function must then return the actual number of bytes that it stored
+in that memory area. Returning 0 will signal end-of-file to the library and
+cause it to stop the current transfer.
+
+If you stop the current transfer by returning 0 "pre-maturely" (i.e before the
+server expected it, like when you've said you will upload N bytes and you
+upload less than N bytes), you may experience that the server "hangs" waiting
+for the rest of the data that won't come.
+
+The read callback may return \fICURL_READFUNC_ABORT\fP to stop the current
+operation immediately, resulting in a \fICURLE_ABORTED_BY_CALLBACK\fP error
+code from the transfer.
+
+The callback can return \fICURL_READFUNC_PAUSE\fP to cause reading from this
+connection to pause. See \fIcurl_easy_pause(3)\fP for further details.
+
+The seek function gets called by libcurl to rewind input stream data or to
+seek to a certain position. The function shall work like fseek(3) or lseek(3)
+and it gets SEEK_SET, SEEK_CUR or SEEK_END as argument for \fIorigin\fP,
+although libcurl currently only passes SEEK_SET.
+
+The callback function must return \fICURL_SEEKFUNC_OK\fP on success,
+\fICURL_SEEKFUNC_FAIL\fP to cause the upload operation to fail or
+\fICURL_SEEKFUNC_CANTSEEK\fP to indicate that while the seek failed, libcurl
+is free to work around the problem if possible. The latter can sometimes be
+done by instead reading from the input or similar.
+
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+Sending a huge data string will cause the same amount of memory to be
+allocated: to avoid overhead resources consumption, one might want to use a
+callback source to avoid data duplication. In this case, original data
+must be retained until after the transfer terminates.
+.nf
+
+char hugedata[512000];
+
+struct ctl {
+ char *buffer;
+ curl_off_t size;
+ curl_off_t position;
+};
+
+size_t read_callback(char *buffer, size_t size, size_t nitems, void *arg)
+{
+ struct ctl *p = (struct ctl *) arg;
+ curl_off_t sz = p->size - p->position;
+
+ nitems *= size;
+ if(sz > nitems)
+ sz = nitems;
+ if(sz)
+ memcpy(buffer, p->buffer + p->position, sz);
+ p->position += sz;
+ return sz;
+}
+
+int seek_callback(void *arg, curl_off_t offset, int origin)
+{
+ struct ctl *p = (struct ctl *) arg;
+
+ switch(origin) {
+ case SEEK_END:
+ offset += p->size;
+ break;
+ case SEEK_CUR:
+ offset += p->position;
+ break;
+ }
+
+ if(offset < 0)
+ return CURL_SEEKFUNC_FAIL;
+ p->position = offset;
+ return CURL_SEEKFUNC_OK;
+}
+
+ CURL *easy = curl_easy_init();
+ curl_mime *mime = curl_mime_init(easy);
+ curl_mimepart *part = curl_mime_addpart(mime);
+ struct ctl hugectl;
+
+ hugectl.buffer = hugedata;
+ hugectl.size = sizeof hugedata;
+ hugectl.position = 0;
+ curl_mime_data_cb(part, hugectl.size, read_callback, seek_callback, NULL,
+ &hugectl);
+
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_data "(3),"
+.BR curl_mime_name "(3)"
diff --git a/docs/libcurl/curl_mime_encoder.3 b/docs/libcurl/curl_mime_encoder.3
new file mode 100644
index 0000000..9e27173
--- /dev/null
+++ b/docs/libcurl/curl_mime_encoder.3
@@ -0,0 +1,98 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_encoder 3 "September 05, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_encoder - set a mime part's encoder and content transfer encoding
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLcode curl_mime_encoder(curl_mimepart * " part ,
+.BI "const char * " encoding ");"
+.ad
+.SH DESCRIPTION
+curl_mime_encoder() requests a mime part's content to be encoded before being
+transmitted.
+
+\fIpart\fP is the part's handle to assign an encoder.
+\fIencoding\fP is a pointer to a zero-terminated encoding scheme. It may be
+set to NULL to disable an encoder previously attached to the part. The encoding
+scheme storage may safely be reused after this function returns.
+
+Setting a part's encoder twice is valid: only the value set by the last call is
+retained.
+
+Upon multipart rendering, the part's content is encoded according to the
+pertaining scheme and a corresponding \fIContent-Transfer-Encoding"\fP header
+is added to the part.
+
+Supported encoding schemes are:
+.br
+"\fIbinary\fP": the data is left unchanged, the header is added.
+.br
+"\fI8bit\fP": header added, no data change.
+.br
+"\fI7bit\fP": the data is unchanged, but is each byte is checked
+to be a 7-bit value; if not, a read error occurs.
+.br
+"\fIbase64\fP": Data is converted to base64 encoding, then split in
+CRLF-terminated lines of at most 76 characters.
+.br
+"\fIquoted-printable\fP": data is encoded in quoted printable lines of
+at most 76 characters. Since the resulting size of the final data cannot be
+determined prior to reading the original data, it is left as unknown, causing
+chunked transfer in HTTP. For the same reason, this encoder may not be used
+with IMAP. This encoder targets text data that is mostly ASCII and should
+not be used with other types of data.
+
+If the original data is already encoded in such a scheme, a custom
+\fIContent-Transfer-Encoding\fP header should be added with
+\FIcurl_mime_headers\fP() instead of setting a part encoder.
+
+Encoding should not be applied to multiparts, thus the use of this
+function on a part with content set with \fIcurl_mime_subparts\fP() is
+strongly discouraged.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* send a file */
+ curl_mime_filedata(part, "image.png");
+
+ /* encode file data in base64 for transfer */
+ curl_mime_encoder(part, "base64");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_headers "(3),"
+.BR curl_mime_subparts "(3)"
diff --git a/docs/libcurl/curl_mime_filedata.3 b/docs/libcurl/curl_mime_filedata.3
new file mode 100644
index 0000000..54d5174
--- /dev/null
+++ b/docs/libcurl/curl_mime_filedata.3
@@ -0,0 +1,82 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_filedata 3 "October 23, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_filedata - set a mime part's body data from a file contents
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLcode curl_mime_filedata(curl_mimepart * " part ,
+.BI " const char * " filename ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_filedata(3)\fP sets a mime part's body content from the named
+file's contents. This is an alernative to \fIcurl_mime_data(3)\fP for setting
+data to a mime part.
+
+\fIpart\fP is the part's to assign contents to.
+
+\fIfilename\fP points to the nul-terminated file's path name. The pointer can
+be NULL to detach the previous part contents settings. Filename storage can be
+safely be reused after this call.
+
+As a side effect, the part's remote file name is set to the base name of the
+given \fIfilename\fP if it is a valid named file. This can be undone or
+overridden by a subsequent call to \fIcurl_mime_filename(3)\fP.
+
+The contents of the file is read during the file transfer in a streaming
+manner to allow huge files to get transferred without using much memory. It
+therefore requires that the file is kept intact during the entire request.
+
+If the file size cannot be determined before actually reading it (such as for
+a device or named pipe), the whole mime structure containing the part
+will be transferred as chunks by HTTP and rejected by IMAP.
+
+Setting a part's contents twice is valid: only the value set by the last call
+is retained.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* send data from this file */
+ curl_mime_filedata(part, "image.png");
+
+ /* set name */
+ curl_mime_name(part, "data");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_data "(3),"
+.BR curl_mime_filename "(3),"
+.BR curl_mime_name "(3)"
diff --git a/docs/libcurl/curl_mime_filename.3 b/docs/libcurl/curl_mime_filename.3
new file mode 100644
index 0000000..7b224b6
--- /dev/null
+++ b/docs/libcurl/curl_mime_filename.3
@@ -0,0 +1,73 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_filename 3 "September 22, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_filename - set a mime part's remote file name
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLcode curl_mime_filename(curl_mimepart * " part ,
+.BI "const char * " filename ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_filename(3)\fP sets a mime part's remote file name. When remote
+file name is set, content data is processed as a file, whatever is the part's
+content source. A part's remote file name is transmitted to the server in the
+associated Content-Disposition generated header.
+
+\fIpart\fP is the part's handle to assign the remote file name to.
+
+\fIfilename\fP points to the nul-terminated file name string; it may be set to
+NULL to remove a previously attached remote file name.
+
+The remote file name string is copied into the part, thus the associated
+storage may safely be released or reused after call. Setting a part's file
+name twice is valid: only the value set by the last call is retained.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* send image data from memory */
+ curl_mime_data(part, imagebuf, imagebuf_len);
+
+ /* set a file name to make it look like a file upload */
+ curl_mime_filename(part, "image.png");
+
+ /* set name */
+ curl_mime_name(part, "data");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_filedata "(3),"
+.BR curl_mime_data "(3)"
diff --git a/docs/libcurl/curl_mime_free.3 b/docs/libcurl/curl_mime_free.3
new file mode 100644
index 0000000..f32093d
--- /dev/null
+++ b/docs/libcurl/curl_mime_free.3
@@ -0,0 +1,49 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_free 3 "September 04, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_free - free a previously built mime structure
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "void curl_mime_free(curl_mime *" mime);
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_free(3)\fP is used to clean up data previously built/appended
+with \fIcurl_mime_addpart(3)\fP and other mime-handling functions. This must
+be called when the data has been used, which typically means after
+\fIcurl_easy_perform(3)\fP has been called.
+
+The handle to free is the one you passed to
+the \fICURLOPT_MIMEPOST(3)\fP option: attached subparts mime structures must
+not be explicitly freed as they are by the top structure freeing.
+
+\fBmime\fP is the handle as returned from a previous call to
+\fIcurl_mime_init(3)\fP and may be NULL.
+
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+None
+.SH "SEE ALSO"
+.BR curl_mime_init "(3)"
diff --git a/docs/libcurl/curl_mime_headers.3 b/docs/libcurl/curl_mime_headers.3
new file mode 100644
index 0000000..3dcd048
--- /dev/null
+++ b/docs/libcurl/curl_mime_headers.3
@@ -0,0 +1,66 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_headers 3 "September 22, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_headers - set a mime part's custom headers
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLcode curl_mime_headers(curl_mimepart * " part ,
+.BI "struct curl_slist * " headers ", int " take_ownership ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_headers(3)\fP sets a mime part's custom headers.
+
+\fIpart\fP is the part's handle to assign the custom headers list to.
+
+\fIheaders\fP is the head of a list of custom headers; it may be set to NULL
+to remove a previously attached custom header list.
+
+\fItake_ownership\fP: when non-zero, causes the list to be freed upon
+replacement or mime structure deletion; in this case the list must not be
+freed explicitly.
+
+Setting a part's custom headers list twice is valid: only the value set by
+the last call is retained.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ struct curl_slist *headers = NULL;
+
+ headers = curl_slist_append("Custom-Header: mooo", headers);
+
+ /* use these headers, please take ownership */
+ curl_mime_headers(part, headers, TRUE);
+
+ /* pass on this data */
+ curl_mime_data(part, "12345679", CURL_ZERO_TERMINATED);
+
+ /* set name */
+ curl_mime_name(part, "numbers");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3)"
diff --git a/docs/libcurl/curl_mime_init.3 b/docs/libcurl/curl_mime_init.3
new file mode 100644
index 0000000..9c1d2d0
--- /dev/null
+++ b/docs/libcurl/curl_mime_init.3
@@ -0,0 +1,70 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_init 3 "September 22, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_init - create a mime handle
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "curl_mime * curl_mime_init(CURL * " easy_handle ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_init(3)\fP creates a handle to a new empty mime structure
+intended to be used with \fIeasy_handle\fP. This mime structure can be
+subsequently filled using the mime API, then attached to \fIeasy_handle\fP
+using option \fICURLOPT_MIMEPOST(3)\fP within a \fIcurl_easy_setopt(3)\fP
+call.
+
+Using a mime handle is the recommended way to post an HTTP form, format and
+send a multi-part e-mail with SMTP or upload such an e-mail to an IMAP server.
+
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+A mime struct handle, or NULL upon failure.
+.SH EXAMPLE
+.nf
+
+ CURL *easy = curl_easy_init();
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* Build an HTTP form with a single field named "data", */
+ mime = curl_mime_init(easy);
+ part = curl_mime_addpart(mime);
+ curl_mime_data(part, "This is the field data", CURL_ZERO_TERMINATED);
+ curl_mime_name(part, "data");
+
+ /* Post and send it. */
+ curl_easy_setopt(easy, CURLOPT_MIMEPOST, mime);
+ curl_easy_setopt(easy, CURLOPT_URL, "http://example.com");
+ curl_easy_perform(easy);
+
+ /* Clean-up. */
+ curl_easy_cleanup(easy);
+ curl_mime_free(mime);
+
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_free "(3),"
+.BR CURLOPT_MIMEPOST "(3)"
diff --git a/docs/libcurl/curl_mime_name.3 b/docs/libcurl/curl_mime_name.3
new file mode 100644
index 0000000..59edaaa
--- /dev/null
+++ b/docs/libcurl/curl_mime_name.3
@@ -0,0 +1,64 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_name 3 "September 22, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_name - set a mime part's name
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLcode curl_mime_name(curl_mimepart * " part ", const char * " name ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_name(3)\fP sets a mime part's name. This is the way HTTP form
+fields are named.
+
+\fIpart\fP is the part's handle to assign a name to.
+
+\fIname\fP points to the zero-terminated name string.
+
+The name string is copied into the part, thus the associated storage may
+safely be released or reused after call. Setting a part's name twice is valid:
+only the value set by the last call is retained. It is possible to "unname" a
+part by setting \fIname\fP to NULL.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* give the part a name */
+ curl_mime_name(part, "shoe_size");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_data "(3),"
+.BR curl_mime_type "(3)"
diff --git a/docs/libcurl/curl_mime_subparts.3 b/docs/libcurl/curl_mime_subparts.3
new file mode 100644
index 0000000..4bdd38f
--- /dev/null
+++ b/docs/libcurl/curl_mime_subparts.3
@@ -0,0 +1,54 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_subparts - set subparts of a multipart mime part
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLcode curl_mime_subparts(curl_mimepart * " part ,
+.BI "curl_mime * " subparts ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_subparts(3)\fP sets a multipart mime part's content from a mime
+structure.
+
+\fIpart\fP is a handle to the multipart part.
+
+\fIsubparts\fP is a mime structure handle holding the subparts. After
+\fIcurl_mime_subparts\fP succeeds, the mime structure handle belongs to the
+multipart part and must not be freed explicitly. It may however be updated by
+subsequent calls to mime API functions.
+
+Setting a part's contents twice is valid: only the value set by the last call
+is retained. It is possible to unassign previous part's contents by setting
+\fIsubparts\fP to NULL.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+TODO
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_init "(3)"
diff --git a/docs/libcurl/curl_mime_type.3 b/docs/libcurl/curl_mime_type.3
new file mode 100644
index 0000000..265fcc5
--- /dev/null
+++ b/docs/libcurl/curl_mime_type.3
@@ -0,0 +1,84 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_mime_type 3 "September 22, 2017" "libcurl 7.57.0" "libcurl Manual"
+
+.SH NAME
+curl_mime_type - set a mime part's content type
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLcode curl_mime_type(curl_mimepart * " part ,
+.BI "const char * " mimetype ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_type(3)\fP sets a mime part's content type.
+
+\fIpart\fP is the part's handle to assign the content type to.
+
+\fImimetype\fP points to the nul-terminated file mime type string; it may be
+set to NULL to remove a previously attached mime type.
+
+The mime type string is copied into the part, thus the associated storage may
+safely be released or reused after call. Setting a part's type twice is valid:
+only the value set by the last call is retained.
+
+In the absence of a mime type and if needed by the protocol specifications,
+a default mime type is determined by the context:
+.br
+- If set as a custom header, use this value.
+.br
+- application/form-data for a HTTP form post.
+.br
+- If a remote file name is set, the mime type is taken from the file name
+extension, or application/octet-stream by default.
+.br
+- For a multipart part, multipart/mixed.
+.br
+- text/plain in other cases.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* get data from this file */
+ curl_mime_filedata(part, "image.png");
+
+ /* content-type for this part */
+ curl_mime_type(part, "image/png");
+
+ /* set name */
+ curl_mime_name(part, "image");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_name "(3),"
+.BR curl_mime_data "(3)"
diff --git a/docs/libcurl/curl_mprintf.3 b/docs/libcurl/curl_mprintf.3
index 6951aa6..c1af505 100644
--- a/docs/libcurl/curl_mprintf.3
+++ b/docs/libcurl/curl_mprintf.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_printf 3 "April 01, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_printf 3 "April 01, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_maprintf, curl_mfprintf, curl_mprintf, curl_msnprintf, curl_msprintf
diff --git a/docs/libcurl/curl_multi_add_handle.3 b/docs/libcurl/curl_multi_add_handle.3
index 36283b7..aef7f91 100644
--- a/docs/libcurl/curl_multi_add_handle.3
+++ b/docs/libcurl/curl_multi_add_handle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_add_handle 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_add_handle 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_add_handle - add an easy handle to a multi session
diff --git a/docs/libcurl/curl_multi_assign.3 b/docs/libcurl/curl_multi_assign.3
index 2e157a3..2865d2b 100644
--- a/docs/libcurl/curl_multi_assign.3
+++ b/docs/libcurl/curl_multi_assign.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_assign \- set data to associate with an internal socket
diff --git a/docs/libcurl/curl_multi_cleanup.3 b/docs/libcurl/curl_multi_cleanup.3
index 6f842b3..78872bc 100644
--- a/docs/libcurl/curl_multi_cleanup.3
+++ b/docs/libcurl/curl_multi_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_cleanup 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_cleanup 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_cleanup - close down a multi session
diff --git a/docs/libcurl/curl_multi_fdset.3 b/docs/libcurl/curl_multi_fdset.3
index 6cab1b3..f084335 100644
--- a/docs/libcurl/curl_multi_fdset.3
+++ b/docs/libcurl/curl_multi_fdset.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_fdset 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_fdset - extracts file descriptor information from a multi handle
@@ -59,9 +59,10 @@ libcurl set. When libcurl returns -1 in \fImax_fd\fP, it is because libcurl
currently does something that isn't possible for your application to monitor
with a socket and unfortunately you can then not know exactly when the current
action is completed using select(). You then need to wait a while before you
-proceed and call \fIcurl_multi_perform(3)\fP anyway. How long to wait? We
-suggest 100 milliseconds at least, but you may want to test it out in your own
-particular conditions to find a suitable value.
+proceed and call \fIcurl_multi_perform(3)\fP anyway. How long to wait? Unless
+\fIcurl_multi_timeout(3)\fP gives you a lower number, we suggest 100
+milliseconds or so, but you may want to test it out in your own particular
+conditions to find a suitable value.
When doing select(), you should use \fIcurl_multi_timeout(3)\fP to figure out
how long to wait for action. Call \fIcurl_multi_perform(3)\fP even if no
diff --git a/docs/libcurl/curl_multi_info_read.3 b/docs/libcurl/curl_multi_info_read.3
index 203a2ca..cfd580d 100644
--- a/docs/libcurl/curl_multi_info_read.3
+++ b/docs/libcurl/curl_multi_info_read.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_info_read - read multi stack informationals
diff --git a/docs/libcurl/curl_multi_init.3 b/docs/libcurl/curl_multi_init.3
index a93eb58..c83c225 100644
--- a/docs/libcurl/curl_multi_init.3
+++ b/docs/libcurl/curl_multi_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_init 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_init 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_init - create a multi handle
diff --git a/docs/libcurl/curl_multi_perform.3 b/docs/libcurl/curl_multi_perform.3
index a425a34..8f02bbe 100644
--- a/docs/libcurl/curl_multi_perform.3
+++ b/docs/libcurl/curl_multi_perform.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_perform 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_perform 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_perform - reads/writes available data from each easy handle
diff --git a/docs/libcurl/curl_multi_remove_handle.3 b/docs/libcurl/curl_multi_remove_handle.3
index 57028e8..10e1808 100644
--- a/docs/libcurl/curl_multi_remove_handle.3
+++ b/docs/libcurl/curl_multi_remove_handle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_remove_handle 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_remove_handle 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_remove_handle - remove an easy handle from a multi session
diff --git a/docs/libcurl/curl_multi_setopt.3 b/docs/libcurl/curl_multi_setopt.3
index e443310..62ca35c 100644
--- a/docs/libcurl/curl_multi_setopt.3
+++ b/docs/libcurl/curl_multi_setopt.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_setopt 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_setopt 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_setopt \- set options for a curl multi handle
diff --git a/docs/libcurl/curl_multi_socket.3 b/docs/libcurl/curl_multi_socket.3
index 3b266ec..232242d 100644
--- a/docs/libcurl/curl_multi_socket.3
+++ b/docs/libcurl/curl_multi_socket.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket 3 "December 15, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_socket 3 "December 15, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_socket \- reads/writes available data
diff --git a/docs/libcurl/curl_multi_socket_action.3 b/docs/libcurl/curl_multi_socket_action.3
index 90abe65..1bd8220 100644
--- a/docs/libcurl/curl_multi_socket_action.3
+++ b/docs/libcurl/curl_multi_socket_action.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket_action 3 "June 07, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_socket_action 3 "June 07, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_socket_action \- reads/writes available data given an action
diff --git a/docs/libcurl/curl_multi_strerror.3 b/docs/libcurl/curl_multi_strerror.3
index cbcbf5c..3d87da4 100644
--- a/docs/libcurl/curl_multi_strerror.3
+++ b/docs/libcurl/curl_multi_strerror.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_strerror - return string describing error code
diff --git a/docs/libcurl/curl_multi_timeout.3 b/docs/libcurl/curl_multi_timeout.3
index e0f81f7..8ab3d56 100644
--- a/docs/libcurl/curl_multi_timeout.3
+++ b/docs/libcurl/curl_multi_timeout.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_timeout 3 "May 02, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_timeout 3 "May 02, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_timeout \- how long to wait for action before proceeding
diff --git a/docs/libcurl/curl_multi_wait.3 b/docs/libcurl/curl_multi_wait.3
index 149086d..abd8b10 100644
--- a/docs/libcurl/curl_multi_wait.3
+++ b/docs/libcurl/curl_multi_wait.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_wait 3 "March 09, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_multi_wait 3 "March 09, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_multi_wait - polls on all easy handles in a multi handle
diff --git a/docs/libcurl/curl_share_cleanup.3 b/docs/libcurl/curl_share_cleanup.3
index dd2a8eb..57e6ba0 100644
--- a/docs/libcurl/curl_share_cleanup.3
+++ b/docs/libcurl/curl_share_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_cleanup 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_share_cleanup 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_share_cleanup - Clean up a shared object
diff --git a/docs/libcurl/curl_share_init.3 b/docs/libcurl/curl_share_init.3
index ad70a75..a008c33 100644
--- a/docs/libcurl/curl_share_init.3
+++ b/docs/libcurl/curl_share_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_init 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_share_init 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_share_init - Create a shared object
diff --git a/docs/libcurl/curl_share_setopt.3 b/docs/libcurl/curl_share_setopt.3
index fd95055..d863f40 100644
--- a/docs/libcurl/curl_share_setopt.3
+++ b/docs/libcurl/curl_share_setopt.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_setopt 3 "May 29, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_share_setopt 3 "November 09, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_share_setopt - Set options for a shared object
@@ -71,6 +71,13 @@ object. This will reduce the time spent in the SSL handshake when reconnecting
to the same server. Note SSL session IDs are reused within the same easy handle
by default. Note this symbol was added in 7.10.3 but was not implemented until
7.23.0.
+.IP CURL_LOCK_DATA_CONNECT
+Put the connection cache in the share object and make all easy handles using
+this share object share the connection cache. Using this, you can for example
+do multi-threaded libcurl use with one handle in each thread, and yet have a
+shared pool of unused connections and this way get way better connection
+re-use than if you use one separate pool in each thread. Support for this was
+added in 7.57.0, but the symbol existed long before this.
.RE
.IP CURLSHOPT_UNSHARE
This option does the opposite of \fICURLSHOPT_SHARE\fP. It specifies that
diff --git a/docs/libcurl/curl_share_strerror.3 b/docs/libcurl/curl_share_strerror.3
index 8cf9f21..c369813 100644
--- a/docs/libcurl/curl_share_strerror.3
+++ b/docs/libcurl/curl_share_strerror.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_share_strerror - return string describing error code
diff --git a/docs/libcurl/curl_slist_append.3 b/docs/libcurl/curl_slist_append.3
index 87171ec..7f898e1 100644
--- a/docs/libcurl/curl_slist_append.3
+++ b/docs/libcurl/curl_slist_append.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_append 3 "May 05, 2017" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_slist_append 3 "May 05, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_slist_append - add a string to an slist
diff --git a/docs/libcurl/curl_slist_free_all.3 b/docs/libcurl/curl_slist_free_all.3
index 3d6e1b7..07f1de3 100644
--- a/docs/libcurl/curl_slist_free_all.3
+++ b/docs/libcurl/curl_slist_free_all.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_free_all 3 "May 05, 2017" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_slist_free_all 3 "May 05, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_slist_free_all - free an entire curl_slist list
diff --git a/docs/libcurl/curl_strequal.3 b/docs/libcurl/curl_strequal.3
index e1abe32..df65d9c 100644
--- a/docs/libcurl/curl_strequal.3
+++ b/docs/libcurl/curl_strequal.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_strequal 3 "June 29, 2017" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_strequal 3 "June 29, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_strequal, curl_strnequal - case insensitive string comparisons
diff --git a/docs/libcurl/curl_unescape.3 b/docs/libcurl/curl_unescape.3
index 339a6eb..5029462 100644
--- a/docs/libcurl/curl_unescape.3
+++ b/docs/libcurl/curl_unescape.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_unescape 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_unescape 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_unescape - URL decodes the given string
diff --git a/docs/libcurl/curl_version.3 b/docs/libcurl/curl_version.3
index e3c4316..2604e45 100644
--- a/docs/libcurl/curl_version.3
+++ b/docs/libcurl/curl_version.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_version 3 "February 03, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_version 3 "February 03, 2016" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_version - returns the libcurl version string
diff --git a/docs/libcurl/curl_version_info.3 b/docs/libcurl/curl_version_info.3
index 737e6dd..25cd91a 100644
--- a/docs/libcurl/curl_version_info.3
+++ b/docs/libcurl/curl_version_info.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_version_info 3 "November 25, 2016" "libcurl 7.55.1" "libcurl Manual"
+.TH curl_version_info 3 "November 05, 2017" "libcurl 7.57.0" "libcurl Manual"
.SH NAME
curl_version_info - returns run-time libcurl version info
@@ -73,6 +73,12 @@ typedef struct {
const char *libssh_version; /* human readable string */
+ /* when 'age' is 4 or higher (7.57.0 or later), the members below also
+ exist */
+ unsigned int brotli_ver_num; /* Numeric Brotli version
+ (MAJOR << 24) | (MINOR << 12) | PATCH */
+ const char *brotli_version; /* human readable string. */
+
} curl_version_info_data;
.fi
@@ -157,6 +163,12 @@ libcurl ignore cookies with a domain that's on the list.
.IP CURL_VERSION_HTTPS_PROXY
libcurl was built with support for HTTPS-proxy.
(Added in 7.52.0)
+.IP CURL_VERSION_MULTI_SSL
+libcurl was built with multiple SSL backends. For details, see
+\fIcurl_global_sslset(3)\fP.
+(Added in 7.56.0)
+.IP CURL_VERSION_BROTLI
+supports HTTP Brotli content encoding using libbrotlidec (Added in 7.57.0)
.RE
\fIssl_version\fP is an ASCII string for the OpenSSL version used. If libcurl
has no SSL support, this is NULL.
diff --git a/docs/libcurl/libcurl-easy.3 b/docs/libcurl/libcurl-easy.3
index 1b626f5..db4a353 100644
--- a/docs/libcurl/libcurl-easy.3
+++ b/docs/libcurl/libcurl-easy.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "February 03, 2016" "libcurl 7.55.1" "libcurl easy interface"
+.TH libcurl 3 "February 03, 2016" "libcurl 7.57.0" "libcurl easy interface"
.SH NAME
libcurl-easy \- easy interface overview
diff --git a/docs/libcurl/libcurl-errors.3 b/docs/libcurl/libcurl-errors.3
index e8b528e..6c4aee3 100644
--- a/docs/libcurl/libcurl-errors.3
+++ b/docs/libcurl/libcurl-errors.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-errors 3 "August 22, 2016" "libcurl 7.55.1" "libcurl errors"
+.TH libcurl-errors 3 "August 22, 2016" "libcurl 7.57.0" "libcurl errors"
.SH NAME
libcurl-errors \- error codes in libcurl
diff --git a/docs/libcurl/libcurl-multi.3 b/docs/libcurl/libcurl-multi.3
index 5365b5f..d560c14 100644
--- a/docs/libcurl/libcurl-multi.3
+++ b/docs/libcurl/libcurl-multi.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-multi 3 "June 07, 2017" "libcurl 7.55.1" "libcurl multi interface"
+.TH libcurl-multi 3 "June 07, 2017" "libcurl 7.57.0" "libcurl multi interface"
.SH NAME
libcurl-multi \- how to use the multi interface
diff --git a/docs/libcurl/libcurl-share.3 b/docs/libcurl/libcurl-share.3
index da01290..83ba2d7 100644
--- a/docs/libcurl/libcurl-share.3
+++ b/docs/libcurl/libcurl-share.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-share 3 "February 03, 2016" "libcurl 7.55.1" "libcurl share interface"
+.TH libcurl-share 3 "November 27, 2017" "libcurl 7.57.0" "libcurl share interface"
.SH NAME
libcurl-share \- how to use the share interface
@@ -35,10 +35,9 @@ The share interface was added to enable sharing of data between curl
\&"handles".
.SH "ONE SET OF DATA - MANY TRANSFERS"
You can have multiple easy handles share data between them. Have them update
-and use the \fBsame\fP cookie database, DNS cache, TLS session cache! This
-way, each single transfer will take advantage from data updates made by the
-other transfer(s). The sharing interface, however, does not share active or
-persistent connections between different easy handles.
+and use the \fBsame\fP cookie database, DNS cache, TLS session cache and/or
+connection cache! This way, each single transfer will take advantage from data
+updates made by the other transfer(s).
.SH "SHARE OBJECT"
You create a shared object with \fIcurl_share_init(3)\fP. It returns a handle
for a newly created one.
diff --git a/docs/libcurl/libcurl-symbols.3 b/docs/libcurl/libcurl-symbols.3
index 50344d8..559b2a3 100644
--- a/docs/libcurl/libcurl-symbols.3
+++ b/docs/libcurl/libcurl-symbols.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-symbols 3 "aug 9, 2017" "libcurl 7.41.0" "libcurl symbols"
+.TH libcurl-symbols 3 "nov 29, 2017" "libcurl 7.41.0" "libcurl symbols"
.SH NAME
libcurl-symbols \- libcurl symbol version information
.SH "libcurl symbols"
@@ -357,6 +357,7 @@ Introduced in 7.21.0
Introduced in 7.21.0
.IP CURLFORM_ARRAY
Introduced in 7.9.1
+Deprecated since 7.56.0
.IP CURLFORM_ARRAY_END
Introduced in 7.9.1
Deprecated since 7.9.5
@@ -367,40 +368,58 @@ Deprecated since 7.9.5
Last used in 7.9.5
.IP CURLFORM_BUFFER
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURLFORM_BUFFERLENGTH
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURLFORM_BUFFERPTR
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURLFORM_CONTENTHEADER
Introduced in 7.9.3
+Deprecated since 7.56.0
.IP CURLFORM_CONTENTLEN
Introduced in 7.46.0
+Deprecated since 7.56.0
.IP CURLFORM_CONTENTSLENGTH
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_CONTENTTYPE
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_COPYCONTENTS
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_COPYNAME
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_END
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_FILE
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_FILECONTENT
Introduced in 7.9.1
+Deprecated since 7.56.0
.IP CURLFORM_FILENAME
Introduced in 7.9.6
+Deprecated since 7.56.0
.IP CURLFORM_NAMELENGTH
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_NOTHING
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_PTRCONTENTS
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_PTRNAME
Introduced in 7.9
+Deprecated since 7.56.0
.IP CURLFORM_STREAM
Introduced in 7.18.2
+Deprecated since 7.56.0
.IP CURLFTPAUTH_DEFAULT
Introduced in 7.12.2
.IP CURLFTPAUTH_SSL
@@ -869,6 +888,7 @@ Introduced in 7.8.1
Introduced in 7.1
.IP CURLOPT_HTTPPOST
Introduced in 7.1
+Deprecated since 7.56.0
.IP CURLOPT_HTTPPROXYTUNNEL
Introduced in 7.3
.IP CURLOPT_HTTPREQUEST
@@ -939,6 +959,8 @@ Introduced in 7.5
Introduced in 7.15.5
.IP CURLOPT_MAX_SEND_SPEED_LARGE
Introduced in 7.15.5
+.IP CURLOPT_MIMEPOST
+Introduced in 7.56.0
.IP CURLOPT_MUTE
Introduced in 7.1
Deprecated since 7.8
@@ -1150,6 +1172,8 @@ Introduced in 7.13.0
Introduced in 7.12.1
.IP CURLOPT_SSH_AUTH_TYPES
Introduced in 7.16.1
+.IP CURLOPT_SSH_COMPRESSION
+Introduced in 7.56.0
.IP CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
Introduced in 7.17.1
.IP CURLOPT_SSH_KEYDATA
@@ -1450,6 +1474,14 @@ Introduced in 7.49.0
Introduced in 7.25.0
.IP CURLSSLOPT_NO_REVOKE
Introduced in 7.44.0
+.IP CURLSSLSET_NO_BACKENDS
+Introduced in 7.56.0
+.IP CURLSSLSET_OK
+Introduced in 7.56.0
+.IP CURLSSLSET_TOO_LATE
+Introduced in 7.56.0
+.IP CURLSSLSET_UNKNOWN_BACKEND
+Introduced in 7.56.0
.IP CURLUSESSL_ALL
Introduced in 7.17.0
.IP CURLUSESSL_CONTROL
@@ -1458,6 +1490,8 @@ Introduced in 7.17.0
Introduced in 7.17.0
.IP CURLUSESSL_TRY
Introduced in 7.17.0
+.IP CURLVERSION_FIFTH
+Introduced in 7.57.0
.IP CURLVERSION_FIRST
Introduced in 7.10
.IP CURLVERSION_FOURTH
@@ -1500,20 +1534,28 @@ Introduced in 7.21.0
Introduced in 7.21.0
.IP CURL_FORMADD_DISABLED
Introduced in 7.12.1
+Deprecated since 7.56.0
.IP CURL_FORMADD_ILLEGAL_ARRAY
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURL_FORMADD_INCOMPLETE
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURL_FORMADD_MEMORY
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURL_FORMADD_NULL
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURL_FORMADD_OK
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURL_FORMADD_OPTION_TWICE
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURL_FORMADD_UNKNOWN_OPTION
Introduced in 7.9.8
+Deprecated since 7.56.0
.IP CURL_GLOBAL_ACK_EINTR
Introduced in 7.30.0
.IP CURL_GLOBAL_ALL
@@ -1718,6 +1760,8 @@ Introduced in 7.21.4
Introduced in 7.21.4
.IP CURL_VERSION_ASYNCHDNS
Introduced in 7.10.7
+.IP CURL_VERSION_BROTLI
+Introduced in 7.57.0
.IP CURL_VERSION_CONV
Introduced in 7.15.4
.IP CURL_VERSION_CURLDEBUG
@@ -1746,6 +1790,8 @@ Introduced in 7.40.0
Introduced in 7.11.1
.IP CURL_VERSION_LIBZ
Introduced in 7.10
+.IP CURL_VERSION_MULTI_SSL
+Introduced in 7.56.0
.IP CURL_VERSION_NTLM
Introduced in 7.10.6
.IP CURL_VERSION_NTLM_WB
@@ -1770,3 +1816,5 @@ Introduced in 7.28.0
Introduced in 7.28.0
.IP CURL_WRITEFUNC_PAUSE
Introduced in 7.18.0
+.IP CURL_ZERO_TERMINATED
+Introduced in 7.56.0
diff --git a/docs/libcurl/libcurl-thread.3 b/docs/libcurl/libcurl-thread.3
index e57813b..923e8bf 100644
--- a/docs/libcurl/libcurl-thread.3
+++ b/docs/libcurl/libcurl-thread.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-thread 3 "August 08, 2017" "libcurl 7.55.1" "libcurl thread safety"
+.TH libcurl-thread 3 "August 08, 2017" "libcurl 7.57.0" "libcurl thread safety"
.SH NAME
libcurl-thread \- libcurl thread safety
diff --git a/docs/libcurl/libcurl-tutorial.3 b/docs/libcurl/libcurl-tutorial.3
index 63e338e..758ddea 100644
--- a/docs/libcurl/libcurl-tutorial.3
+++ b/docs/libcurl/libcurl-tutorial.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-tutorial 3 "March 04, 2017" "libcurl 7.55.1" "libcurl programming"
+.TH libcurl-tutorial 3 "October 23, 2017" "libcurl 7.57.0" "libcurl programming"
.SH NAME
libcurl-tutorial \- libcurl programming tutorial
@@ -478,14 +478,67 @@ multi-part because they're built by a chain of parts, each part being a single
unit of data. Each part has its own name and contents. You can in fact create
and post a multi-part formpost with the regular libcurl POST support described
above, but that would require that you build a formpost yourself and provide
-to libcurl. To make that easier, libcurl provides \fIcurl_formadd(3)\fP. Using
-this function, you add parts to the form. When you're done adding parts, you
-post the whole form.
+to libcurl. To make that easier, libcurl provides a MIME API consisting in
+several functions: using those, you can create and fill a multi-part form.
+Function \fIcurl_mime_init(3)\fP creates a multi-part body; you can then
+append new parts to a multi-part body using \fIcurl_mime_addpart(3)\fP.
+There are three possible data sources for a part: memory using
+\fIcurl_mime_data(3)\fP, file using \fIcurl_mime_filedata(3)\fP and
+user-defined data read callback using \fIcurl_mime_data_cb(3)\fP.
+\fIcurl_mime_name(3)\fP sets a part's (i.e.: form field) name, while
+\fIcurl_mime_filename(3)\fP fills in the remote file name. With
+\fIcurl_mime_type(3)\fP, you can tell the MIME type of a part,
+\fIcurl_mime_headers(3)\fP allows defining the part's headers. When a
+multi-part body is no longer needed, you can destroy it using
+\fIcurl_mime_free(3)\fP.
The following example sets two simple text parts with plain textual contents,
and then a file with binary contents and uploads the whole thing.
.nf
+ curl_mime *multipart = curl_mime_init(easyhandle);
+ curl_mimepart *part = curl_mime_addpart(mutipart);
+ curl_mime_name(part, "name");
+ curl_mime_data(part, "daniel", CURL_ZERO_TERMINATED);
+ part = curl_mime_addpart(mutipart);
+ curl_mime_name(part, "project");
+ curl_mime_data(part, "curl", CURL_ZERO_TERMINATED);
+ part = curl_mime_addpart(mutipart);
+ curl_mime_name(part, "logotype-image");
+ curl_mime_filedata(part, "curl.png");
+
+ /* Set the form info */
+ curl_easy_setopt(easyhandle, CURLOPT_MIMEPOST, multipart);
+
+ curl_easy_perform(easyhandle); /* post away! */
+
+ /* free the post data again */
+ curl_mime_free(multipart);
+.fi
+
+To post multiple files for a single form field, you must supply each file in
+a separate part, all with the same field name. Although function
+\fIcurl_mime_subparts(3)\fP implements nested muti-parts, this way of
+multiple files posting is deprecated by RFC 7578, chapter 4.3.
+
+To set the data source from an already opened FILE pointer, use:
+
+.nf
+ curl_mime_data_cb(part, filesize, (curl_read_callback) fread,
+ (curl_seek_callback) fseek, NULL, filepointer);
+.fi
+
+A deprecated \fIcurl_formadd(3)\fP function is still supported in libcurl.
+It should however not be used anymore for new designs and programs using it
+ought to be converted to the MIME API. It is however described here as an
+aid to conversion.
+
+Using \fIcurl_formadd\fP, you add parts to the form. When you're done adding
+parts, you post the whole form.
+
+The MIME API example above is expressed as follows using this function:
+
+.nf
struct curl_httppost *post=NULL;
struct curl_httppost *last=NULL;
curl_formadd(&post, &last,
@@ -543,6 +596,136 @@ request. You force an easyhandle to go back to GET by using the
Just setting \fICURLOPT_POSTFIELDS(3)\fP to "" or NULL will *not* stop libcurl
from doing a POST. It will just make it POST without any data to send!
+.SH "Converting from deprecated form API to MIME API"
+Four rules have to be respected in building the multi-part:
+.br
+- The easy handle must be created before building the multi-part.
+.br
+- The multi-part is always created by a call to curl_mime_init(easyhandle).
+.br
+- Each part is created by a call to curl_mime_addpart(multipart).
+.br
+- When complete, the multi-part must be bound to the easy handle using
+\fICURLOPT_MIMEPOST(3)\fP instead of \fICURLOPT_HTTPPOST(3)\fP.
+
+Here are some example of \fIcurl_formadd\fP calls to MIME API sequences:
+
+.nf
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "id",
+ CURLFORM_COPYCONTENTS, "daniel", CURLFORM_END);
+ CURLFORM_CONTENTHEADER, headers,
+ CURLFORM_END);
+.fi
+becomes:
+.nf
+ part = curl_mime_addpart(multipart);
+ curl_mime_name(part, "id");
+ curl_mime_data(part, "daniel", CURL_ZERO_TERMINATED);
+ curl_mime_headers(part, headers, FALSE);
+.fi
+
+Setting the last \fIcurl_mime_headers\fP argument to TRUE would have caused
+the headers to be automatically released upon destroyed the multi-part, thus
+saving a clean-up call to \fIcurl_slist_free_all(3)\fP.
+
+.nf
+ curl_formadd(&post, &last,
+ CURLFORM_PTRNAME, "logotype-image",
+ CURLFORM_FILECONTENT, "-",
+ CURLFORM_END);
+.fi
+becomes:
+.nf
+ part = curl_mime_addpart(multipart);
+ curl_mime_name(part, "logotype-image");
+ curl_mime_data_cb(part, (curl_off_t) -1, fread, fseek, NULL, stdin);
+.fi
+
+\fIcurl_mime_name\fP always copies the field name. The special file name "-"
+is not supported by \fIcurl_mime_file\fP: to read an open file, use
+a callback source using fread(). The transfer will be chunked since the data
+size is unknown.
+
+.nf
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "datafile[]",
+ CURLFORM_FILE, "file1",
+ CURLFORM_FILE, "file2",
+ CURLFORM_END);
+.fi
+becomes:
+.nf
+ part = curl_mime_addpart(multipart);
+ curl_mime_name(part, "datafile[]");
+ curl_mime_filedata(part, "file1");
+ part = curl_mime_addpart(multipart);
+ curl_mime_name(part, "datafile[]");
+ curl_mime_filedata(part, "file2");
+.fi
+
+The deprecated multipart/mixed implementation of multiple files field is
+translated to two distinct parts with the same name.
+
+.nf
+ curl_easy_setopt(easyhandle, CURLOPT_READFUNCTION, myreadfunc);
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "stream",
+ CURLFORM_STREAM, arg,
+ CURLFORM_CONTENTLEN, (curl_off_t) datasize,
+ CURLFORM_FILENAME, "archive.zip",
+ CURLFORM_CONTENTTYPE, "application/zip",
+ CURLFORM_END);
+.fi
+becomes:
+.nf
+ part = curl_mime_addpart(multipart);
+ curl_mime_name(part, "stream");
+ curl_mime_data_cb(part, (curl_off_t) datasize,
+ myreadfunc, NULL, NULL, arg);
+ curl_mime_filename(part, "archive.zip");
+ curl_mime_type(part, "application/zip");
+.fi
+
+\fICURLOPT_READFUNCTION\fP callback is not used: it is replace by directly
+setting the part source data from the callback read function.
+
+.nf
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "memfile",
+ CURLFORM_BUFFER, "memfile.bin",
+ CURLFORM_BUFFERPTR, databuffer,
+ CURLFORM_BUFFERLENGTH, (long) sizeof databuffer,
+ CURLFORM_END);
+.fi
+becomes:
+.nf
+ part = curl_mime_addpart(multipart);
+ curl_mime_name(part, "memfile");
+ curl_mime_data(part, databuffer, (curl_off_t) sizeof databuffer);
+ curl_mime_filename(part, "memfile.bin");
+.fi
+
+\fIcurl_mime_data\fP always copies the initial data: data buffer is thus
+free for immediate reuse.
+
+.nf
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "message",
+ CURLFORM_FILECONTENT, "msg.txt",
+ CURLFORM_END);
+.fi
+becomes:
+.nf
+ part = curl_mime_addpart(multipart);
+ curl_mime_name(part, "message");
+ curl_mime_filedata(part, "msg.txt");
+ curl_mime_filename(part, NULL);
+.fi
+
+Use of \fIcurl_mime_filedata\fP sets the remote file name as a side effect: it
+is therefore necessary to clear it for \fICURLFORM_FILECONTENT\fP emulation.
+
.SH "Showing Progress"
For historical and traditional reasons, libcurl has a built-in progress meter
@@ -1006,6 +1189,81 @@ When doing the "PORT" approach, libcurl will attempt to use the EPRT and the
LPRT before trying PORT, as they work with more protocols. You can disable
this behavior by setting \fICURLOPT_FTP_USE_EPRT(3)\fP to zero.
+.SH "MIME API revisited for SMTP and IMAP"
+In addition to support HTTP multi-part form fields, the MIME API can be used
+to build structured e-mail messages and send them via SMTP or append such
+messages to IMAP directories.
+
+A structured e-mail message may contain several parts: some are displayed
+inline by the MUA, some are attachments. Parts can also be structured as
+multi-part, for example to include another e-mail message or to offer several
+text formats alternatives. This can be nested to any level.
+
+To build such a message, you prepare the nth-level multi-part and then include
+it as a source to the parent multi-part using function
+\fIcurl_mime_subparts(3)\fP. Once it has been
+bound to its parent multi-part, a nth-level multi-part belongs to it and
+should not be freed explicitly.
+
+E-mail messages data is not supposed to be non-ascii and line length is
+limited: fortunately, some transfer encodings are defined by the standards
+to support the transmission of such incompatible data. Function
+\fIcurl_mime_encoder(3)\fP tells a part that its source data must be encoded
+before being sent. It also generates the corresponding header for that part.
+If the part data you want to send is already encoded in such a scheme,
+do not use this function (this would over-encode it), but explicitly set the
+corresponding part header.
+
+Upon sending such a message, libcurl prepends it with the header list
+set with \fICURLOPT_HTTPHEADER(3)\fP, as 0th-level mime part headers.
+
+Here is an example building an e-mail message with an inline plain/html text
+alternative and a file attachment encoded in base64:
+
+.nf
+ curl_mime *message = curl_mime_init(easyhandle);
+
+ /* The inline part is an alternative proposing the html and the text
+ versions of the e-mail. */
+ curl_mime *alt = curl_mime_init(easyhandle);
+
+ /* HTML message. */
+ curl_mimepart *part = curl_mime_addpart(alt);
+ curl_mime_data(part, "<html><body><p>This is HTML</p></body></html>",
+ CURL_ZERO_TERMINATED);
+ curl_mime_type(part, "text/html");
+
+ /* Text message. */
+ part = curl_mime_addpart(alt);
+ curl_mime_data(part, "This is plain text message",
+ CURL_ZERO_TERMINATED);
+
+ /* Create the inline part. */
+ part = curl_mime_addpart(message);
+ curl_mime_subparts(part, alt);
+ curl_mime_type(part, "multipart/alternative");
+ struct curl_slist *headers = curl_slist_append(NULL,
+ "Content-Disposition: inline");
+ curl_mime_headers(part, headers, TRUE);
+
+ /* Add the attachment. */
+ part = curl_mime_addpart(message);
+ curl_mime_filedata(part, "manual.pdf");
+ curl_mime_encoder(part, "base64");
+
+ /* Build the mail headers. */
+ headers = curl_slist_append(NULL, "From: me@example.com");
+ headers = curl_slist_append(headers, "To: you@example.com");
+
+ /* Set these into the easy handle. */
+ curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
+ curl_easy_setopt(easyhandle, CURLOPT_MIMEPOST, mime);
+.fi
+
+It should be noted that appending a message to an IMAP directory requires
+the message size to be known prior upload. It is therefore not possible to
+include parts with unknown data size in this context.
+
.SH "Headers Equal Fun"
Some protocols provide "headers", meta-data separated from the normal
diff --git a/docs/libcurl/libcurl.3 b/docs/libcurl/libcurl.3
index 39723f8..78b5ee2 100644
--- a/docs/libcurl/libcurl.3
+++ b/docs/libcurl/libcurl.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "February 03, 2016" "libcurl 7.55.1" "libcurl overview"
+.TH libcurl 3 "July 15, 2017" "libcurl 7.57.0" "libcurl overview"
.SH NAME
libcurl \- client-side URL transfers
@@ -39,6 +39,10 @@ while using libcurl. This essentially means you call
\fIcurl_global_cleanup(3)\fP at the end. See \fBGLOBAL CONSTANTS\fP below for
details.
+If libcurl was compiled with support for multiple SSL backends, the function
+\fIcurl_global_sslset(3)\fP can be called before \fIcurl_global_init(3)\fP
+to select the active SSL backend.
+
To transfer files, you create an "easy handle" using \fIcurl_easy_init(3)\fP
for a single individual transfer (in either direction). You then set your
desired set of options in that handle with \fIcurl_easy_setopt(3)\fP. Options
diff --git a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3 b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
index 22adb67..b42ce07 100644
--- a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_ACTIVESOCKET \- get the active socket
diff --git a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
index 5481e50..01ae203 100644
--- a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_APPCONNECT_TIME 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_APPCONNECT_TIME \- get the time until the SSL/SSH handshake is completed
diff --git a/docs/libcurl/opts/CURLINFO_CERTINFO.3 b/docs/libcurl/opts/CURLINFO_CERTINFO.3
index 852e3fc..641c7b8 100644
--- a/docs/libcurl/opts/CURLINFO_CERTINFO.3
+++ b/docs/libcurl/opts/CURLINFO_CERTINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CERTINFO 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_CERTINFO 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CERTINFO \- get the TLS certificate chain
diff --git a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3 b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
index 84723cb..0d4be7f 100644
--- a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
+++ b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONDITION_UNMET 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_CONDITION_UNMET 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONDITION_UNMET \- get info on unmet time conditional
diff --git a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
index baebba7..b2944b9 100644
--- a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONNECT_TIME 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONNECT_TIME \- get the time until connect
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
index af24a05..0e35155 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
index c23b4b7..ab49234 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
index be752f9..d344cce 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
index 8cfb7ba..ee1026f 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3 b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
index 92b3b4e..7d31896 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_TYPE \- get Content-Type
diff --git a/docs/libcurl/opts/CURLINFO_COOKIELIST.3 b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
index 2739ad1..fb90a3c 100644
--- a/docs/libcurl/opts/CURLINFO_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_COOKIELIST 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_COOKIELIST 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_COOKIELIST \- get all known cookies
diff --git a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3 b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
index ec8e8dc..78e18df 100644
--- a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
+++ b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_EFFECTIVE_URL \- get the last used URL
diff --git a/docs/libcurl/opts/CURLINFO_FILETIME.3 b/docs/libcurl/opts/CURLINFO_FILETIME.3
index 75718e6..20116fa 100644
--- a/docs/libcurl/opts/CURLINFO_FILETIME.3
+++ b/docs/libcurl/opts/CURLINFO_FILETIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FILETIME 3 "April 03, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "April 03, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FILETIME \- get the remote time of the retrieved document
diff --git a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3 b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
index 66de885..00661b7 100644
--- a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
+++ b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FTP_ENTRY_PATH \- get entry path in FTP server
diff --git a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3 b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
index 17d623c..2bc0f67 100644
--- a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HEADER_SIZE \- get size of retrieved headers
diff --git a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
index dcb0a97..88e26d5 100644
--- a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTPAUTH_AVAIL 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_HTTPAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
@@ -63,7 +63,8 @@ if(curl) {
}
.fi
.SH AVAILABILITY
-Added in 7.10.8
+Added RFC2617 in 7.10.8
+Added RFC7616 in 7.57.0
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3 b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
index eb9e905..d52bf1e 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTP_CONNECTCODE \- get the CONNECT response code
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
index 7cd2873..eec2972 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_VERSION 3 "May 11, 2016" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_VERSION 3 "May 11, 2016" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTP_VERSION \- get the http version used in the connection
diff --git a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3 b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
index 81ffcd1..e7649b0 100644
--- a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LASTSOCKET \- get the last socket used
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3 b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
index 7db4d2e..f3b79a3 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LOCAL_IP \- get local IP address of last connection
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3 b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
index 4a67a51..942838b 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LOCAL_PORT \- get the latest local port number
diff --git a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3 b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
index 7d45ce3..555230f 100644
--- a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NAMELOOKUP_TIME 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NAMELOOKUP_TIME \- get the name lookup time
diff --git a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3 b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
index 617a1c3..2b33f3a 100644
--- a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
+++ b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NUM_CONNECTS \- get number of created connections
diff --git a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3 b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
index 2dc8a01..a87e8b6 100644
--- a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
+++ b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_OS_ERRNO 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_OS_ERRNO 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_OS_ERRNO \- get errno number from last connect failure
diff --git a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
index 857fab5..01ad739 100644
--- a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRETRANSFER_TIME 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRETRANSFER_TIME \- get the time until the file transfer start
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
index 154651b..34f2696 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIMARY_IP \- get IP address of last connection
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
index 3534e38..1475b55 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIMARY_PORT \- get the latest destination port number
diff --git a/docs/libcurl/opts/CURLINFO_PRIVATE.3 b/docs/libcurl/opts/CURLINFO_PRIVATE.3
index d62c3d6..bc4759f 100644
--- a/docs/libcurl/opts/CURLINFO_PRIVATE.3
+++ b/docs/libcurl/opts/CURLINFO_PRIVATE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIVATE \- get the private pointer
diff --git a/docs/libcurl/opts/CURLINFO_PROTOCOL.3 b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
index f30226d..5826bea 100644
--- a/docs/libcurl/opts/CURLINFO_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROTOCOL 3 "November 23, 2016" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_PROTOCOL 3 "November 23, 2016" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROTOCOL \- get the protocol used in the connection
diff --git a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
index cf0818d..364edf1 100644
--- a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXYAUTH_AVAIL 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_PROXYAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
@@ -64,7 +64,8 @@ if(curl) {
}
.fi
.SH AVAILABILITY
-Added in 7.10.8
+Added RFC2617 in 7.10.8
+Added RFC7616 in 7.57.0
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
diff --git a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
index a80095c..fc0500f 100644
--- a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate verification
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
index 42d2a3e..df778c8 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_COUNT \- get the number of redirects
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
index 4da7aac..f719349 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_TIME 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_TIME \- get the time for all redirection steps
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
index 18319d1..881e9a2 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
diff --git a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3 b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
index 9a5f3d4..010a843 100644
--- a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REQUEST_SIZE \- get size of sent request
diff --git a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3 b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
index b358fef..4c142ac 100644
--- a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
+++ b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RESPONSE_CODE \- get the last response code
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
index 21f81ac..60c39f8 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_CLIENT_CSEQ \- get the next RTSP client CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3 b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
index 7d0883f..a4d0a3a 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_CSEQ_RECV \- get the recently received CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
index 1fd1fe8..c59886d 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_SERVER_CSEQ \- get the next RTSP server CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
index 436fbd2..4c05640 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_SESSION_ID \- get RTSP session ID
diff --git a/docs/libcurl/opts/CURLINFO_SCHEME.3 b/docs/libcurl/opts/CURLINFO_SCHEME.3
index 95f715b..ad4c3f6 100644
--- a/docs/libcurl/opts/CURLINFO_SCHEME.3
+++ b/docs/libcurl/opts/CURLINFO_SCHEME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
index 6edacd2..6418083 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
index d92210f..a395e4e 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_DOWNLOAD_T 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD_T 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
index 5f4c4b5..a203ba7 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
index 823d074..d218fad 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_UPLOAD_T 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD_T 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
index 4cba8cc..f9b283c 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_DOWNLOAD \- get download speed
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
index 9c51779..4546447 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_DOWNLOAD_T 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD_T 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_DOWNLOAD_T \- get download speed
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
index d948863..4fc2c79 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_UPLOAD \- get upload speed
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
index 82481d9..38f8db2 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_UPLOAD_T 3 "June 15, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD_T 3 "June 15, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_UPLOAD_T \- get upload speed
diff --git a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3 b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
index 90eecf1..9060f48 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SSL_ENGINES \- get an slist of OpenSSL crypto-engines
diff --git a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
index 9e14783..e533a4a 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
diff --git a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
index a610335..2921aac 100644
--- a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_STARTTRANSFER_TIME 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_STARTTRANSFER_TIME \- get the time until the first byte is received
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3 b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
index dd57f94..54c48dd 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TLS_SESSION \- get TLS session info
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3 b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
index 13e191d..1e63d05 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SSL_PTR 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SSL_PTR 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
diff --git a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3 b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
index 3657157..933cb82 100644
--- a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TOTAL_TIME 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TOTAL_TIME \- get total time of previous transfer
diff --git a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
index 764d43b..ae2d83b 100644
--- a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
diff --git a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
index 903c4e4..4ba02b0 100644
--- a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
diff --git a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
index ab34975..725feaa 100644
--- a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAXCONNECTS 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_MAXCONNECTS 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAXCONNECTS \- set size of connection cache
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
index dc8fee4..54af03d 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
index 8b37d63..a964c43 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
index cd9162b..4e83ad9 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
index 01f7a2a..7c4faaa 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING \- enable HTTP pipelining and multiplexing
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
index 3d006cf..075d065 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SERVER_BL 3 "February 03, 2016" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SERVER_BL 3 "February 03, 2016" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
index 2a7fd90..b393cec 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SITE_BL 3 "February 03, 2016" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SITE_BL 3 "February 03, 2016" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3 b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
index 1cb869b..653c306 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PUSHDATA \- pointer to pass to push callback
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
index 380581c..d113b6b 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
index 51e756b..f2c144b 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
index d2e4af9..3209489 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETFUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETFUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3 b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
index 2da1bdd..288a1b7 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
index 3a30900..c9599d8 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERFUNCTION 3 "May 27, 2017" "libcurl 7.55.1" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERFUNCTION 3 "May 27, 2017" "libcurl 7.57.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
diff --git a/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3 b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
index a0a1760..211185a 100644
--- a/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
+++ b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
index 4dbaf4f..f85a340 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
index fb9b4e6..b4aa914 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPT_ENCODING 3 "December 21, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPT_ENCODING 3 "December 21, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
diff --git a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
index 1a4c888..2c2204e 100644
--- a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
+++ b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ADDRESS_SCOPE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_ADDRESS_SCOPE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ADDRESS_SCOPE \- set scope for local IPv6 addresses
diff --git a/docs/libcurl/opts/CURLOPT_APPEND.3 b/docs/libcurl/opts/CURLOPT_APPEND.3
index f40bf61..c3a06c8 100644
--- a/docs/libcurl/opts/CURLOPT_APPEND.3
+++ b/docs/libcurl/opts/CURLOPT_APPEND.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_APPEND \- enable appending to the remote file
diff --git a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3 b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
index cd40a66..81a7507 100644
--- a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
+++ b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_AUTOREFERER \- automatically update the referer header
diff --git a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
index 7747b13..b002b2c 100644
--- a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_BUFFERSIZE \- set preferred receive buffer size
diff --git a/docs/libcurl/opts/CURLOPT_CAINFO.3 b/docs/libcurl/opts/CURLOPT_CAINFO.3
index 1a0787d..d1d68d0 100644
--- a/docs/libcurl/opts/CURLOPT_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CAINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAINFO 3 "May 27, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CAINFO 3 "May 27, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.3 b/docs/libcurl/opts/CURLOPT_CAPATH.3
index cbeadbb..1368446 100644
--- a/docs/libcurl/opts/CURLOPT_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_CAPATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAPATH 3 "May 27, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CAPATH \- specify directory holding CA certificates
@@ -55,8 +55,9 @@ if(curl) {
}
.fi
.SH AVAILABILITY
-This option is supported by the OpenSSL, GnuTLS and PolarSSL backends. The NSS
-backend provides the option only for backward compatibility.
+This option is supported by the OpenSSL, GnuTLS, PolarSSL and mbedTLS
+(since 7.56.0) backends. The NSS backend provides the option only for
+backward compatibility.
.SH RETURN VALUE
CURLE_OK if supported; or an error such as:
diff --git a/docs/libcurl/opts/CURLOPT_CERTINFO.3 b/docs/libcurl/opts/CURLOPT_CERTINFO.3
index b0a12e8..c9f2b58 100644
--- a/docs/libcurl/opts/CURLOPT_CERTINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CERTINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CERTINFO 3 "May 27, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CERTINFO 3 "May 27, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CERTINFO \- request SSL certificate information
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
index 2081343..8c109a7 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
index 11070ba..fa6a44c 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_DATA 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_DATA 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
index 31550df..73e30c0 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
index 554a25b..e19350c 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETDATA 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETDATA 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
index 47fa11e..b9183c5 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETFUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETFUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
index 88084c8..7f6d22e 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT 3 "October 03, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
@@ -37,6 +37,9 @@ default built-in connection timeout - 300 seconds. See also the
In unix-like systems, this might cause signals to be used unless
\fICURLOPT_NOSIGNAL(3)\fP is set.
+
+If both \fICURLOPT_CONNECTTIMEOUT(3)\fP and \fICURLOPT_CONNECTTIMEOUT_MS(3)\fP
+are set, the value set last will be used.
.SH DEFAULT
300
.SH PROTOCOLS
@@ -56,6 +59,8 @@ if(curl) {
.SH AVAILABILITY
Always
.SH RETURN VALUE
-Returns CURLE_OK
+Returns CURLE_OK. Returns CURLE_BAD_FUNCTION_ARGUMENT if set to a negative
+value or a value that when converted to milliseconds is too large.
.SH "SEE ALSO"
+.BR CURLOPT_CONNECTTIMEOUT_MS "(3), "
.BR CURLOPT_TIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
index f5cbb0c..5fc9306 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT_MS 3 "February 14, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 24, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
@@ -37,6 +37,9 @@ default built-in connection timeout - 300 seconds. See also the
In unix-like systems, this might cause signals to be used unless
\fICURLOPT_NOSIGNAL(3)\fP is set.
+
+If both \fICURLOPT_CONNECTTIMEOUT(3)\fP and \fICURLOPT_CONNECTTIMEOUT_MS(3)\fP
+are set, the value set last will be used.
.SH DEFAULT
300000
.SH PROTOCOLS
@@ -58,4 +61,5 @@ Always
.SH RETURN VALUE
Returns CURLE_OK
.SH "SEE ALSO"
+.BR CURLOPT_CONNECTTIMEOUT "(3), "
.BR CURLOPT_TIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
index b7d0bca..0c3f642 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_ONLY 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_ONLY 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECT_ONLY \- stop when connected to target server
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3 b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
index 3e07846..204b167 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_TO 3 "May 20, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_TO 3 "May 20, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECT_TO \- Connect to a specific host and port instead of the URL's host and port
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
index a2aba9b..eb6a63b 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host encoding
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
index 872f1fe..4b2d98c 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding
diff --git a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
index 7288f14..5f6fd84 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding
diff --git a/docs/libcurl/opts/CURLOPT_COOKIE.3 b/docs/libcurl/opts/CURLOPT_COOKIE.3
index ddfe8b0..50748f1 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIE \- set contents of HTTP Cookie header
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3 b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
index db20d59..7814312 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEFILE 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEFILE 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIEFILE \- file name to read cookies from
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3 b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
index 02c150e..ce735e5 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIEJAR \- file name to store cookies to
diff --git a/docs/libcurl/opts/CURLOPT_COOKIELIST.3 b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
index 28beba3..790a4ae 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
diff --git a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3 b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
index 035ea38..5f691c1 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIESESSION \- start a new cookie session
diff --git a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
index 28f8515..48ca0ae 100644
--- a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
diff --git a/docs/libcurl/opts/CURLOPT_CRLF.3 b/docs/libcurl/opts/CURLOPT_CRLF.3
index 8a45d6a..8bdc8d3 100644
--- a/docs/libcurl/opts/CURLOPT_CRLF.3
+++ b/docs/libcurl/opts/CURLOPT_CRLF.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CRLF \- enable/disable CRLF conversion
diff --git a/docs/libcurl/opts/CURLOPT_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_CRLFILE.3
index de41dd2..56fd2b5 100644
--- a/docs/libcurl/opts/CURLOPT_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_CRLFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CRLFILE \- specify a Certificate Revocation List file
diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
index 37adabe..a4e2523 100644
--- a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CUSTOMREQUEST 3 "June 21, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_CUSTOMREQUEST 3 "June 21, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CUSTOMREQUEST \- custom string for request
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3 b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
index 379fee0..828f979 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEBUGDATA \- custom pointer for debug callback
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
index c49138a..f00171a 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEBUGFUNCTION \- debug callback
diff --git a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3 b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
index 3da8bfa..e494c81 100644
--- a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEFAULT_PROTOCOL \- default protocol to use if the URL is missing a
diff --git a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
index 6d70334..76a9128 100644
--- a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
+++ b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DIRLISTONLY \- ask for names only in a directory listing
diff --git a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
index 4a38d39..76e29d4 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
diff --git a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
index f9aea18..2f31bbd 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
index eabd7f6..2bd7f1f 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP4 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP4 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
index 70a9194..392a68c 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
index 27f13da..85feaa1 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_SERVERS \- set preferred DNS servers
diff --git a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3 b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
index 1050531..4a84f77 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
diff --git a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3 b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
index 2f20abc..6c3091d 100644
--- a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
+++ b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_EGDSOCKET \- set EGD socket path
diff --git a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
index eb75395..daad67d 100644
--- a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
+++ b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ERRORBUFFER 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_ERRORBUFFER 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ERRORBUFFER \- set error buffer for error messages
diff --git a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
index db6bafe..7c11748 100644
--- a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
diff --git a/docs/libcurl/opts/CURLOPT_FAILONERROR.3 b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
index ead1ad7..9d7ac32 100644
--- a/docs/libcurl/opts/CURLOPT_FAILONERROR.3
+++ b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FAILONERROR 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FAILONERROR 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FAILONERROR \- request failure on HTTP response >= 400
diff --git a/docs/libcurl/opts/CURLOPT_FILETIME.3 b/docs/libcurl/opts/CURLOPT_FILETIME.3
index bb05206..8e0f391 100644
--- a/docs/libcurl/opts/CURLOPT_FILETIME.3
+++ b/docs/libcurl/opts/CURLOPT_FILETIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FILETIME \- get the modification time of the remote resource
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
index 40efc26..7bf101c 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
index 53b2be5..03655b2 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback
diff --git a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
index 172cee3..9104d5e 100644
--- a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
+++ b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FOLLOWLOCATION 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FOLLOWLOCATION 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
diff --git a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
index 8783c3a..f8c241b 100644
--- a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
+++ b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FORBID_REUSE \- make connection get closed at once after use
diff --git a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
index 7e76f1f..d71f06e 100644
--- a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
+++ b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FRESH_CONNECT \- force a new connection to be used
diff --git a/docs/libcurl/opts/CURLOPT_FTPPORT.3 b/docs/libcurl/opts/CURLOPT_FTPPORT.3
index 82ad58e..a7e3164 100644
--- a/docs/libcurl/opts/CURLOPT_FTPPORT.3
+++ b/docs/libcurl/opts/CURLOPT_FTPPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTPPORT \- make FTP transfer active
diff --git a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
index 8001c5c..42fe9b0 100644
--- a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
index ac997a3..d5c8edf 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_ACCOUNT \- set account info for FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
index 21de625..7e1f8d0 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3 b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
index 69781c9..655f722 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
index b295d9e..df6399e 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
index e71e3ab..6324eb6 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response
@@ -55,7 +55,9 @@ if(curl) {
.SH AVAILABILITY
Added in 7.10.8
.SH RETURN VALUE
-Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not.
+Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not. Returns
+CURLE_BAD_FUNCTION_ARGUMENT if set to a negative value or a value that when
+converted to milliseconds is too large.
.SH "SEE ALSO"
.BR CURLOPT_TIMEOUT "(3), " CURLOPT_CONNECTTIMEOUT "(3), "
.BR CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
index 4a67532..8dce38d 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
index 36a57b0..3c706a2 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
index 8185d6c..be5cc48 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
index cd11817..bd4e14f 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
index 85907e9..b5427c1 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_PRET \- enable the PRET command
diff --git a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
index e00ee26..c97f027 100644
--- a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
+++ b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
diff --git a/docs/libcurl/opts/CURLOPT_HEADER.3 b/docs/libcurl/opts/CURLOPT_HEADER.3
index 038f26d..c3957f7 100644
--- a/docs/libcurl/opts/CURLOPT_HEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADER 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HEADER 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADER \- pass headers to the data stream
diff --git a/docs/libcurl/opts/CURLOPT_HEADERDATA.3 b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
index 1ab5667..02f591f 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERDATA.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADERDATA \- pointer to pass to header callback
diff --git a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
index 324a2d6..6860dae 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERFUNCTION 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HEADERFUNCTION 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADERFUNCTION \- callback that receives header data
diff --git a/docs/libcurl/opts/CURLOPT_HEADEROPT.3 b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
index 4d20ed1..1dd2a0c 100644
--- a/docs/libcurl/opts/CURLOPT_HEADEROPT.3
+++ b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADEROPT 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HEADEROPT 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADEROPT \- set how to send HTTP headers
diff --git a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
index a7f791d..e1d4300 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
diff --git a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3 b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
index 592ebf0..58b728f 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPAUTH 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HTTPAUTH 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try
diff --git a/docs/libcurl/opts/CURLOPT_HTTPGET.3 b/docs/libcurl/opts/CURLOPT_HTTPGET.3
index 57b7e71..2567e9d 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPGET.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPGET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPGET 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HTTPGET 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPGET \- ask for a HTTP GET request
diff --git a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3 b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
index 6aeec22..3a0c9a9 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPHEADER 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HTTPHEADER 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPHEADER \- set custom HTTP headers
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPOST.3 b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
index 95255ee..cae7e6c 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPOST.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPOST 3 "May 17, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPPOST \- specify the multipart formpost content
@@ -43,6 +43,9 @@ You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP.
When setting \fICURLOPT_HTTPPOST(3)\fP, it will automatically set
\fICURLOPT_NOBODY(3)\fP to 0.
+
+This option is deprecated! Do not use it. Use \fICURLOPT_MIMEPOST(3)\fP
+instead after having prepared mime data.
.SH DEFAULT
NULL
.SH PROTOCOLS
@@ -72,9 +75,9 @@ curl_formadd(&formpost,
CURLFORM_END);
.fi
.SH AVAILABILITY
-As long as HTTP is enabled
+As long as HTTP is enabled. Deprecated in 7.56.0.
.SH RETURN VALUE
Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
-.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_POST "(3), "
-.BR curl_formadd "(3), " curl_formfree "(3), "
+.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_POST "(3), " CURLOPT_MIMEPOST "(3),"
+.BR curl_formadd "(3), " curl_formfree "(3), " curl_mime_init "(3)"
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3 b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
index aebc633..84fd088 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPROXYTUNNEL 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPROXYTUNNEL 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
index 11b9d6c..656b544 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
index e2cbe1c..64b44c0 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
index 672323e..bf16a24 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_VERSION 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_VERSION 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
diff --git a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
index c0e6e1e..0bd6bca 100644
--- a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
+++ b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
index ad2d1f6..2d47ad3 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INFILESIZE \- set size of the input file to send off
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
index badf163..b522e7f 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE_LARGE 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE_LARGE 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off
diff --git a/docs/libcurl/opts/CURLOPT_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_INTERFACE.3
index ddf5a3a..eaa8ad0 100644
--- a/docs/libcurl/opts/CURLOPT_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_INTERFACE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERFACE 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_INTERFACE 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERFACE \- source interface for outgoing traffic
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
index e627a45..bbe8574 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
@@ -20,18 +20,19 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEDATA 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
-CURLOPT_INTERLEAVEDATA \- custom pointer to RTSP interleave callback
+CURLOPT_INTERLEAVEDATA \- custom pointer passed to RTSP interleave callback
.SH SYNOPSIS
#include <curl/curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERLEAVEDATA, void *pointer);
.SH DESCRIPTION
This is the userdata \fIpointer\fP that will be passed to
-\fICURLOPT_INTERLEAVEFUNCTION(3)\fP when interleaved RTP data is
-received.
+\fICURLOPT_INTERLEAVEFUNCTION(3)\fP when interleaved RTP data is received. If
+the interleave function callback is not set, this pointer is not used
+anywhere.
.SH DEFAULT
NULL
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
index 88e39d7..2a31874 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEFUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEFUNCTION 3 "September 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data
@@ -55,8 +55,12 @@ connection may close. The application may use \fICURL_RTSPREQ_RECEIVE\fP to
service RTP data when no requests are desired. If the application makes a
request, (e.g. \fICURL_RTSPREQ_PAUSE\fP) then the response handler will
process any pending RTP data before marking the request as finished.
+
+The \fICURLOPT_WRITEDATA(3)\fP is passed in the \fIuserdata\fP argument in the
+callback.
.SH DEFAULT
-NULL
+NULL, the interleave data is then passed to the regular write function:
+\fICURLOPT_WRITEFUNCTION(3)\fP.
.SH PROTOCOLS
RTSP
.SH EXAMPLE
@@ -78,4 +82,4 @@ Added in 7.20.0
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
-.BR CURLOPT_INTERLEAVEFUNCTION "(3), " CURLOPT_RTSP_REQUEST "(3), "
+.BR CURLOPT_INTERLEAVEDATA "(3), " CURLOPT_RTSP_REQUEST "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3 b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
index 5a63915..26e3e46 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3 b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
index 89853c2..0d80a61 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLFUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLFUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IOCTLFUNCTION \- callback for I/O operations
diff --git a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3 b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
index b96728e..d2cf225 100644
--- a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IPRESOLVE \- specify which IP protocol version to use
diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3 b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
index 3457447..2904bc7 100644
--- a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
+++ b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ISSUERCERT \- issuer SSL certificate filename
diff --git a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3 b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
index e3d8110..76ec998 100644
--- a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
+++ b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_KEEP_SENDING_ON_ERROR \- keep sending on early HTTP response >= 300
diff --git a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
index 1047b67..ce60be8 100644
--- a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_KEYPASSWD \- set passphrase to private key
diff --git a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3 b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
index e0f81c0..ccd303d 100644
--- a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
+++ b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_KRBLEVEL \- set FTP kerberos security level
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORT.3 b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
index 0e9f090..08bce75 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORT.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOCALPORT \- set local port number to use for socket
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
index ebe2c7c..6d464c0 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORTRANGE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORTRANGE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
diff --git a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
index 2d23aad..094d3ff 100644
--- a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOGIN_OPTIONS \- set login options
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
index 1dbc022..1432f0a 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
index 8270614..fb060bb 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOW_SPEED_TIME \- set low speed limit time period
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3 b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
index f0a5f83..cf78af2 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_AUTH \- SMTP authentication address
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3 b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
index 1b5125b..50af3e1 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_FROM \- SMTP sender address
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
index 7a98a83..dde619d 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_RCPT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_RCPT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_RCPT \- list of SMTP mail recipients
diff --git a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
index 10deb71..63ee40f 100644
--- a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXCONNECTS \- maximum connection cache size
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
index 2e159d5..df2b1fb 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXFILESIZE \- maximum file size allowed to download
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
index 87afb29..55f7db5 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download
diff --git a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3 b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
index ef5965e..9f926ae 100644
--- a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXREDIRS \- maximum number of redirects allowed
diff --git a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
index e8138dc..82424ee 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
diff --git a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
index d408fb1..f86edf7 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
diff --git a/docs/libcurl/opts/CURLOPT_MIMEPOST.3 b/docs/libcurl/opts/CURLOPT_MIMEPOST.3
new file mode 100644
index 0000000..d4a5297
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_MIMEPOST.3
@@ -0,0 +1,53 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_MIMEPOST \- set post/send data from mime structure
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+curl_mime *mime;
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MIMEPOST, mime);
+.SH DESCRIPTION
+Pass a mime handle previously obtained from \fIcurl_mime_init(3)\fP.
+
+This setting is supported by the HTTP protocol to post forms and by the
+SMTP and IMAP protocols to provide the e-mail data to send/upload.
+
+This option is the preferred way of posting an HTTP form, replacing and
+extending the deprecated \fICURLOPT_HTTPPOST(3)\fP option.
+.SH PROTOCOLS
+HTTP, SMTP, IMAP.
+.SH AVAILABILITY
+Since 7.56.0.
+.SH RETURN VALUE
+This will return CURLE_OK.
+.SH EXAMPLE
+Using this option implies the use of several mime structure building
+functions: see https://curl.haxx.se/libcurl/c/smtp-mime.html for a complete
+example.
+.SH "SEE ALSO"
+.BR curl_mime_init "(3)"
diff --git a/docs/libcurl/opts/CURLOPT_NETRC.3 b/docs/libcurl/opts/CURLOPT_NETRC.3
index f72d3f6..c4184e7 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC 3 "August 02, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_NETRC 3 "August 02, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NETRC \- request that .netrc is used
diff --git a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3 b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
index ac6aa57..540bf7e 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NETRC_FILE \- file name to read .netrc info from
diff --git a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
index 04dd64c..1d1e35c 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories
diff --git a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
index 8a91b15..29fb505 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files
diff --git a/docs/libcurl/opts/CURLOPT_NOBODY.3 b/docs/libcurl/opts/CURLOPT_NOBODY.3
index 6cfdd40..0b67e94 100644
--- a/docs/libcurl/opts/CURLOPT_NOBODY.3
+++ b/docs/libcurl/opts/CURLOPT_NOBODY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOBODY \- do the download request without getting the body
diff --git a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3 b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
index 9fb96ca..f3aae32 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROGRESS 3 "March 06, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_NOPROGRESS 3 "October 09, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOPROGRESS \- switch off the progress meter
@@ -31,10 +31,8 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROGRESS, long onoff);
.SH DESCRIPTION
If \fIonoff\fP is to 1, it tells the library to shut off the progress meter
completely for requests done with this \fIhandle\fP. It will also prevent the
-\fICURLOPT_PROGRESSFUNCTION(3)\fP from getting called.
-
-Future versions of libcurl are likely to not have any built-in progress meter
-at all.
+\fICURLOPT_XFERINFOFUNCTION(3)\fP or \fICURLOPT_PROGRESSFUNCTION(3)\fP from
+getting called.
.SH DEFAULT
1, meaning it normally runs without a progress meter.
.SH PROTOCOLS
@@ -57,4 +55,6 @@ Always
.SH RETURN VALUE
Returns CURLE_OK.
.SH "SEE ALSO"
+.BR CURLOPT_XFERINFOFUNCTION "(3), "
.BR CURLOPT_PROGRESSFUNCTION "(3), "
+.BR CURLOPT_VERBOSE "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_NOPROXY.3 b/docs/libcurl/opts/CURLOPT_NOPROXY.3
index e1e5d89..e298fd2 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROXY.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROXY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROXY 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_NOPROXY 3 "September 24, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOPROXY \- disable proxy use for specific hosts
@@ -42,8 +42,13 @@ If the name in the noproxy list has a leading period, it is a domain match
against the provided host name. This way ".example.com" will switch off proxy
use for both "www.example.com" as well as for "foo.example.com".
+Setting the noproxy string to "" (an empty string) will explicitly enable the
+proxy for all host names, even if there is an environment variable set for it.
+
The application does not have to keep the string around after setting this
option.
+.SH "Environment variables"
+See \fICURLOPT_PROXY(3)\fP
.SH DEFAULT
NULL
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3 b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
index 65f7d48..2f2b0de 100644
--- a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
+++ b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOSIGNAL \- skip all signal handling
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
index 8f0a919..353131f 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
index c923cbf..93be12e 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
diff --git a/docs/libcurl/opts/CURLOPT_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PASSWORD.3
index 0f88cf0..c9a2962 100644
--- a/docs/libcurl/opts/CURLOPT_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PASSWORD 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PASSWORD 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PASSWORD \- password to use in authentication
diff --git a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3 b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
index 227afdd..02d0c22 100644
--- a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
+++ b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PATH_AS_IS 3 "February 14, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PATH_AS_IS 3 "February 14, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
diff --git a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
index 4eb7ece..5b05200 100644
--- a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PINNEDPUBLICKEY 3 "April 17, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PINNEDPUBLICKEY 3 "April 17, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PINNEDPUBLICKEY \- set pinned public key
diff --git a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3 b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
index 9f21a0c..ac3b9c8 100644
--- a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
+++ b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PIPEWAIT \- wait for pipelining/multiplexing
diff --git a/docs/libcurl/opts/CURLOPT_PORT.3 b/docs/libcurl/opts/CURLOPT_PORT.3
index 33672ea..1b2c276 100644
--- a/docs/libcurl/opts/CURLOPT_PORT.3
+++ b/docs/libcurl/opts/CURLOPT_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PORT \- set remote port number to work with
diff --git a/docs/libcurl/opts/CURLOPT_POST.3 b/docs/libcurl/opts/CURLOPT_POST.3
index 693de1d..bf0feb6 100644
--- a/docs/libcurl/opts/CURLOPT_POST.3
+++ b/docs/libcurl/opts/CURLOPT_POST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POST 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_POST 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POST \- request a HTTP POST
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
index b411041..9da03b5 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDS 3 "July 07, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDS 3 "July 07, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDS \- specify data to POST to server
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
index e35bd96..d17870d 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
index 767c247..1a57063 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
diff --git a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3 b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
index 556d65a..f657c99 100644
--- a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
diff --git a/docs/libcurl/opts/CURLOPT_POSTREDIR.3 b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
index 852530b..9299513 100644
--- a/docs/libcurl/opts/CURLOPT_POSTREDIR.3
+++ b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTREDIR 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_POSTREDIR 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTREDIR \- how to act on a HTTP POST redirect
diff --git a/docs/libcurl/opts/CURLOPT_PREQUOTE.3 b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
index ababb41..d806e0a 100644
--- a/docs/libcurl/opts/CURLOPT_PREQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PREQUOTE \- commands to run before an FTP transfer
diff --git a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3 b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
index a4cac4a..3596f4b 100644
--- a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRE_PROXY 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PRE_PROXY 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PRE_PROXY \- set pre-proxy to use
diff --git a/docs/libcurl/opts/CURLOPT_PRIVATE.3 b/docs/libcurl/opts/CURLOPT_PRIVATE.3
index 8c21876..4c828be 100644
--- a/docs/libcurl/opts/CURLOPT_PRIVATE.3
+++ b/docs/libcurl/opts/CURLOPT_PRIVATE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRIVATE 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PRIVATE 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PRIVATE \- store a private pointer
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
index 0e1f83a..808ac7b 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
index 2ff6e91..229d9f5 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
diff --git a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
index aadb5d8..9275964 100644
--- a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROTOCOLS \- set allowed protocols
diff --git a/docs/libcurl/opts/CURLOPT_PROXY.3 b/docs/libcurl/opts/CURLOPT_PROXY.3
index a26355c..fa8abde 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY 3 "September 24, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY \- set proxy to use
@@ -85,7 +85,8 @@ names to not use a proxy for (even if one of the previous mention variables
are set). That is the exact equivalent of setting the \fICURLOPT_NOPROXY(3)\fP
option.
-The \fICURLOPT_PROXY(3)\fP option overrides environment variables.
+The \fICURLOPT_PROXY(3)\fP and \fICURLOPT_NOPROXY(3)\fP options override
+environment variables.
.SH DEFAULT
Default is NULL, meaning no proxy is used.
diff --git a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3 b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
index 015cf05..486ffd0 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try
diff --git a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3 b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
index ee07989..7430ada 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
index 49aea5f..c7d3b8e 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPORT.3 b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
index 0739ff4..a0349dd 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPORT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYPORT \- port number the proxy listens on
diff --git a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
index 5dd64ee..2c9a7f0 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYTYPE \- proxy protocol type
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
index fdf12bf..d01b43a 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
index f63eda6..df7773a 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
index 81cd9fe..cfa1468 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAINFO 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAINFO 3 "May 30, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
index 44c99c2..b770d2a 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAPATH 3 "May 30, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAPATH 3 "September 10, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
@@ -56,8 +56,9 @@ if(curl) {
.SH AVAILABILITY
Added in 7.52.0
-This option is supported by the OpenSSL, GnuTLS and PolarSSL backends. The NSS
-backend provides the option only for backward compatibility.
+This option is supported by the OpenSSL, GnuTLS, PolarSSL and mbedTLS
+(since 7.56.0) backends. The NSS backend provides the option only for
+backward compatibility.
.SH RETURN VALUE
CURLE_OK if supported; or an error such as:
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
index 1c027ff..db3f3e5 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CRLFILE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CRLFILE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
index ddd6666..dadfe95 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_KEYPASSWD 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_KEYPASSWD 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
index 599b147..07365f1 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
index 8f78763..9d1006e 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SERVICE_NAME \- proxy authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
index eda1144..3847eec 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
index 8afe469..09f890b 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
index 580b26c..ccc462a 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cert
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
index dfd4b12..4de724f 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
index 363221e..fa9ca58 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLVERSION 3 "August 12, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLVERSION 3 "August 12, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLVERSION \- set preferred proxy TLS/SSL version
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
index e284bec..8784c9c 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
index 8f04193..ae670f2 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_OPTIONS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_OPTIONS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
index de8c4ff..bc03027 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "December 16, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "December 16, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_VERIFYHOST \- verify the proxy certificate's name against host
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
index e0d67d5..5a86eb3 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_VERIFYPEER \- verify the proxy's SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
index 8353775..e81d6bc 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
index 54cc407..938ea73 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
index 8072ab0..fccd6eb 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
index 082d7f7..82db6c2 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TRANSFER_MODE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TRANSFER_MODE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy
diff --git a/docs/libcurl/opts/CURLOPT_PUT.3 b/docs/libcurl/opts/CURLOPT_PUT.3
index e77eb68..a2f2fa1 100644
--- a/docs/libcurl/opts/CURLOPT_PUT.3
+++ b/docs/libcurl/opts/CURLOPT_PUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PUT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_PUT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PUT \- make a HTTP PUT request
diff --git a/docs/libcurl/opts/CURLOPT_QUOTE.3 b/docs/libcurl/opts/CURLOPT_QUOTE.3
index 964d363..9ce5178 100644
--- a/docs/libcurl/opts/CURLOPT_QUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_QUOTE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_QUOTE 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_QUOTE 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_QUOTE \- (S)FTP commands to run before transfer
diff --git a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
index 4d820cf..57dea86 100644
--- a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RANDOM_FILE \- specify a source for random data
diff --git a/docs/libcurl/opts/CURLOPT_RANGE.3 b/docs/libcurl/opts/CURLOPT_RANGE.3
index c82395e..f07f117 100644
--- a/docs/libcurl/opts/CURLOPT_RANGE.3
+++ b/docs/libcurl/opts/CURLOPT_RANGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANGE 3 "December 21, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RANGE 3 "December 21, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RANGE \- set byte range to request
diff --git a/docs/libcurl/opts/CURLOPT_READDATA.3 b/docs/libcurl/opts/CURLOPT_READDATA.3
index 498a510..ef9b221 100644
--- a/docs/libcurl/opts/CURLOPT_READDATA.3
+++ b/docs/libcurl/opts/CURLOPT_READDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READDATA 3 "May 01, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_READDATA 3 "May 01, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_READDATA \- custom pointer passed to the read callback
diff --git a/docs/libcurl/opts/CURLOPT_READFUNCTION.3 b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
index 2b016d2..4ab3a3c 100644
--- a/docs/libcurl/opts/CURLOPT_READFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READFUNCTION 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_READFUNCTION 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_READFUNCTION \- read callback for data uploads
diff --git a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
index 93c64b9..6b3cd36 100644
--- a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REDIR_PROTOCOLS 3 "September 21, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_REDIR_PROTOCOLS 3 "September 21, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
diff --git a/docs/libcurl/opts/CURLOPT_REFERER.3 b/docs/libcurl/opts/CURLOPT_REFERER.3
index 952b3c6..5208fec 100644
--- a/docs/libcurl/opts/CURLOPT_REFERER.3
+++ b/docs/libcurl/opts/CURLOPT_REFERER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_REFERER \- set the HTTP referer header
diff --git a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
index 68ed40f..aacdd3e 100644
--- a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
+++ b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVE.3 b/docs/libcurl/opts/CURLOPT_RESOLVE.3
index 579bb6b..d93d860 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVE 3 "May 17, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVE 3 "November 17, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVE \- provide custom host name to IP address resolves
@@ -56,6 +56,8 @@ Remove names from the DNS cache again, to stop providing these fake resolves,
by including a string in the linked list that uses the format
\&"-HOST:PORT". The host name must be prefixed with a dash, and the host name
and port number must exactly match what was already added previously.
+
+Support for providing the ADDRESS within [brackets] was added in 7.57.0.
.SH DEFAULT
NULL
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
index cad0b17..7abab41 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESUME_FROM \- set a point to resume transfer from
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
index 0f70af5..1ae0ba1 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
index c9baa9f..9fac7da 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
index 3a4609f..bcf817b 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_REQUEST 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_REQUEST 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_REQUEST \- specify RTSP request
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
index aa94087..036054b 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
index 3b4ea44..906c0d5 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_SESSION_ID \- set RTSP session ID
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3 b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
index 4289a31..df1f1b1 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_STREAM_URI 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_STREAM_URI 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
index 0b409fb..c67cdc1 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
diff --git a/docs/libcurl/opts/CURLOPT_SASL_IR.3 b/docs/libcurl/opts/CURLOPT_SASL_IR.3
index fcc9acf..aa9d8bc 100644
--- a/docs/libcurl/opts/CURLOPT_SASL_IR.3
+++ b/docs/libcurl/opts/CURLOPT_SASL_IR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SASL_IR \- enable sending initial response in first packet
diff --git a/docs/libcurl/opts/CURLOPT_SEEKDATA.3 b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
index 8965434..1d75e3b 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKDATA 3 "August 12, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SEEKDATA 3 "August 12, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SEEKDATA \- custom pointer passed to the seek callback
diff --git a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
index 21e2930..237a132 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKFUNCTION 3 "August 12, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SEEKFUNCTION 3 "August 12, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream
diff --git a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
index a23d8db..7380d03 100644
--- a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SERVICE_NAME \- authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_SHARE.3 b/docs/libcurl/opts/CURLOPT_SHARE.3
index bdf6234..cbe1f3a 100644
--- a/docs/libcurl/opts/CURLOPT_SHARE.3
+++ b/docs/libcurl/opts/CURLOPT_SHARE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SHARE \- specify share handle to use
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
index c844e3a..c14dd90 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
index ee45416..5c556b0 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
index 7c56f55..cd3d2d2 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_AUTH \- set allowed methods for SOCKS5 proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
index 2bb3841..b6f0cc0 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
index 84b6dff..d41d2d0 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_GSSAPI_SERVICE \- SOCKS5 proxy authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
index c226988..5f5cba6 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP
diff --git a/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3 b/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
new file mode 100644
index 0000000..286e6bd
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
@@ -0,0 +1,59 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_SSH_COMPRESSION 3 "August 17, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_SSH_COMPRESSION \- enables automatic decompression of HTTP downloads
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_COMPRESSION, long enable);
+.SH DESCRIPTION
+Pass a long as parameter set to 1L to enable or 0L to disable.
+
+Enables built-in SSH compression. This is a request, not an order; the server
+may or may not do it.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+All SSH based protocols: SCP, SFTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com");
+
+ /* enable built-in compression */
+ curl_easy_setopt(curl, CURLOPT_SSH_COMPRESSION, 1L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.56.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_ACCEPT_ENCODING "(3), " CURLOPT_TRANSFER_ENCODING "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
index 36b336e..48446e0 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
index abd2395..3e948cf 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
index 3c8bf22..a210955 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
index 58ac317..84d4d16 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
index 5037d1c..f40290d 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
index f155be5..bd8e51c 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_SSLCERT.3
index d0e9f30..c524b8b 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLCERT \- set SSL client certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
index 7721646..013f43e 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
index 0923bc9..3d6f906 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLENGINE \- set SSL engine identifier
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
index fe35aa2..dddbd94 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_SSLKEY.3
index 1744c5c..908da90 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
index f53414f..72ef9cb 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLKEYTYPE \- set type of the private key file
diff --git a/docs/libcurl/opts/CURLOPT_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
index 76ae42f..f2ac8c4 100644
--- a/docs/libcurl/opts/CURLOPT_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLVERSION 3 "August 12, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSLVERSION 3 "August 12, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLVERSION \- set preferred TLS/SSL version
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
index 549e2be..a897d21 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CIPHER_LIST 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CIPHER_LIST 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
index a0c257c..36d73fe 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_DATA 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_DATA 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
index bfe268c..b6d0ef2 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_FUNCTION 3 "March 26, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_FUNCTION 3 "March 26, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL/CyaSSL or mbedTLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
index 7de8e8b..52a9cfb 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_ENABLE_ALPN \- enable ALPN
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
index 156256b..6c1a767 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_ENABLE_NPN \- enable NPN
diff --git a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3 b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
index 8a9fb1c..8ff32c4 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_FALSESTART \- enable TLS false start
diff --git a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
index 17c5abd..113b8b1 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_OPTIONS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_OPTIONS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_OPTIONS \- set SSL behavior options
diff --git a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
index fe1a653..fcaef36 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
index aa8fd72..31900a9 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYHOST 3 "February 02, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYHOST 3 "February 02, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
index e8ceb71..7283417 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYPEER 3 "February 09, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYPEER 3 "February 09, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
index b753e95..cb2b781 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYSTATUS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYSTATUS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYSTATUS \- verify the certificate's status
diff --git a/docs/libcurl/opts/CURLOPT_STDERR.3 b/docs/libcurl/opts/CURLOPT_STDERR.3
index fab484d..f3f9383 100644
--- a/docs/libcurl/opts/CURLOPT_STDERR.3
+++ b/docs/libcurl/opts/CURLOPT_STDERR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STDERR \- redirect stderr to another stream
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
index 0085d56..07588c1 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_DEPENDS \- set stream this transfer depends on
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
index e5c5ff2..5ae82ed 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS_E 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS_E 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_DEPENDS_E \- set stream this transfer depends on execlusively
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3 b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
index eeb58dd..d4927b5 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_WEIGHT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_WEIGHT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_WEIGHT \- set numerical stream weight
diff --git a/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3 b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
index c3132f7..2e0c61b 100644
--- a/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
+++ b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SUPPRESS_CONNECT_HEADERS \- Suppress proxy CONNECT response headers from user callbacks
diff --git a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3 b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
index b2acf93..cd55081 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
index 3c6e033..f5b712e 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
index 7e2cd34..3965f60 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
index f2df34c..627542a 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
diff --git a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
index 12499a7..0df86d6 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_NODELAY 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TCP_NODELAY 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
diff --git a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
index 5628b88..f7adbb4 100644
--- a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TELNETOPTIONS \- custom telnet options
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
index fc2579c..5e42edf 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TFTP_BLKSIZE \- TFTP block size
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
index 3fd8282..6c368d4 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
diff --git a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3 b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
index 5040f52..10ca13e 100644
--- a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
+++ b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMECONDITION \- select condition for a time request
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
index 5e94273..007b28f 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT 3 "October 03, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
@@ -65,7 +65,8 @@ if(curl) {
.SH AVAILABILITY
Always
.SH RETURN VALUE
-Returns CURLE_OK
+Returns CURLE_OK. Returns CURLE_BAD_FUNCTION_ARGUMENT if set to a negative
+value or a value that when converted to milliseconds is too large.
.SH "SEE ALSO"
-.BR CURLOPT_TIMEOUT_MS "(3), "
+.BR CURLOPT_TIMEOUT_MS "(3), "
.BR CURLOPT_CONNECTTIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
index 90362e1..a7ade74 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT_MS 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT_MS 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
index 9f575ce..3228d13 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEVALUE 3 "April 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE 3 "April 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEVALUE \- set time value for conditional
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
index 3a33b8e..d4c624f 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
index d6b78ea..f5990be 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
index 2acf775..a50ce05 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
index e07edd4..2f652ab 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3 b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
index 88ca361..448816a 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
diff --git a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
index 6b68ec0..818d65c 100644
--- a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
+++ b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNIX_SOCKET_PATH 3 "December 21, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_UNIX_SOCKET_PATH 3 "December 21, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket
diff --git a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
index 36182ac..aa74a90 100644
--- a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD.3 b/docs/libcurl/opts/CURLOPT_UPLOAD.3
index edc08b5..57ae3d8 100644
--- a/docs/libcurl/opts/CURLOPT_UPLOAD.3
+++ b/docs/libcurl/opts/CURLOPT_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UPLOAD 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UPLOAD \- enable data upload
diff --git a/docs/libcurl/opts/CURLOPT_URL.3 b/docs/libcurl/opts/CURLOPT_URL.3
index 80a8de4..b349089 100644
--- a/docs/libcurl/opts/CURLOPT_URL.3
+++ b/docs/libcurl/opts/CURLOPT_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_URL 3 "December 21, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_URL 3 "December 21, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_URL \- provide the URL to use in the request
diff --git a/docs/libcurl/opts/CURLOPT_USERAGENT.3 b/docs/libcurl/opts/CURLOPT_USERAGENT.3
index 9a84011..d81e13a 100644
--- a/docs/libcurl/opts/CURLOPT_USERAGENT.3
+++ b/docs/libcurl/opts/CURLOPT_USERAGENT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERAGENT \- set HTTP user-agent header
diff --git a/docs/libcurl/opts/CURLOPT_USERNAME.3 b/docs/libcurl/opts/CURLOPT_USERNAME.3
index db5ead7..7ae22a1 100644
--- a/docs/libcurl/opts/CURLOPT_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERNAME \- user name to use in authentication
diff --git a/docs/libcurl/opts/CURLOPT_USERPWD.3 b/docs/libcurl/opts/CURLOPT_USERPWD.3
index 44f8d80..c4354ba 100644
--- a/docs/libcurl/opts/CURLOPT_USERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_USERPWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERPWD 3 "May 05, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_USERPWD 3 "August 24, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERPWD \- user name and password to use in authentication
@@ -89,3 +89,4 @@ Returns CURLE_OK on success or
CURLE_OUT_OF_MEMORY if there was insufficient heap space.
.SH "SEE ALSO"
.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), "
+.BR CURLOPT_PROXYUSERPWD "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_USE_SSL.3 b/docs/libcurl/opts/CURLOPT_USE_SSL.3
index e5a31aa..b8ec212 100644
--- a/docs/libcurl/opts/CURLOPT_USE_SSL.3
+++ b/docs/libcurl/opts/CURLOPT_USE_SSL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USE_SSL 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_USE_SSL 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USE_SSL \- request using SSL / TLS for the transfer
diff --git a/docs/libcurl/opts/CURLOPT_VERBOSE.3 b/docs/libcurl/opts/CURLOPT_VERBOSE.3
index 49296aa..4d82f58 100644
--- a/docs/libcurl/opts/CURLOPT_VERBOSE.3
+++ b/docs/libcurl/opts/CURLOPT_VERBOSE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_VERBOSE 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_VERBOSE 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_VERBOSE \- set verbose mode on/off
diff --git a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
index 932ffd5..0fe4db7 100644
--- a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
+++ b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WILDCARDMATCH 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_WILDCARDMATCH 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers
diff --git a/docs/libcurl/opts/CURLOPT_WRITEDATA.3 b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
index 826c203..3393054 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEDATA 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_WRITEDATA 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_WRITEDATA \- custom pointer passed to the write callback
diff --git a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
index 6e13238..de55848 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEFUNCTION 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_WRITEFUNCTION 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_WRITEFUNCTION \- set callback for writing received data
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3 b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
index bfec45c..7b206fc 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFODATA 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback
@@ -44,4 +44,4 @@ Added in 7.32.0
.SH RETURN VALUE
Returns CURLE_OK
.SH "SEE ALSO"
-.BR CURLOPT_XFERINFOFUNCTION "(3), " CURLOPT_XFERINFOFUNCTION "(3), "
+.BR CURLOPT_XFERINFOFUNCTION "(3), " CURLOPT_VERBOSE "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
index a59b4c6..4a310ff 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
diff --git a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
index eb4bac6..78c1d18 100644
--- a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
+++ b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XOAUTH2_BEARER 3 "May 31, 2017" "libcurl 7.55.1" "curl_easy_setopt options"
+.TH CURLOPT_XOAUTH2_BEARER 3 "May 31, 2017" "libcurl 7.57.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
diff --git a/docs/libcurl/opts/Makefile.inc b/docs/libcurl/opts/Makefile.inc
index c3db5d2..f710b5e 100644
--- a/docs/libcurl/opts/Makefile.inc
+++ b/docs/libcurl/opts/Makefile.inc
@@ -175,6 +175,7 @@ man_MANS = \
CURLOPT_MAXREDIRS.3 \
CURLOPT_MAX_RECV_SPEED_LARGE.3 \
CURLOPT_MAX_SEND_SPEED_LARGE.3 \
+ CURLOPT_MIMEPOST.3 \
CURLOPT_NETRC.3 \
CURLOPT_NETRC_FILE.3 \
CURLOPT_NEW_DIRECTORY_PERMS.3 \
@@ -258,6 +259,7 @@ man_MANS = \
CURLOPT_SOCKS5_GSSAPI_NEC.3 \
CURLOPT_SOCKS5_GSSAPI_SERVICE.3 \
CURLOPT_SSH_AUTH_TYPES.3 \
+ CURLOPT_SSH_COMPRESSION.3 \
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 \
CURLOPT_SSH_KEYDATA.3 \
CURLOPT_SSH_KEYFUNCTION.3 \
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index e141b6a..7878b22 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -160,27 +160,27 @@ CURLFINFOFLAG_KNOWN_PERM 7.21.0
CURLFINFOFLAG_KNOWN_SIZE 7.21.0
CURLFINFOFLAG_KNOWN_TIME 7.21.0
CURLFINFOFLAG_KNOWN_UID 7.21.0
-CURLFORM_ARRAY 7.9.1
+CURLFORM_ARRAY 7.9.1 7.56.0
CURLFORM_ARRAY_END 7.9.1 7.9.5 7.9.6
CURLFORM_ARRAY_START 7.9.1 7.9.5 7.9.6
-CURLFORM_BUFFER 7.9.8
-CURLFORM_BUFFERLENGTH 7.9.8
-CURLFORM_BUFFERPTR 7.9.8
-CURLFORM_CONTENTHEADER 7.9.3
-CURLFORM_CONTENTLEN 7.46.0
-CURLFORM_CONTENTSLENGTH 7.9
-CURLFORM_CONTENTTYPE 7.9
-CURLFORM_COPYCONTENTS 7.9
-CURLFORM_COPYNAME 7.9
-CURLFORM_END 7.9
-CURLFORM_FILE 7.9
-CURLFORM_FILECONTENT 7.9.1
-CURLFORM_FILENAME 7.9.6
-CURLFORM_NAMELENGTH 7.9
-CURLFORM_NOTHING 7.9
-CURLFORM_PTRCONTENTS 7.9
-CURLFORM_PTRNAME 7.9
-CURLFORM_STREAM 7.18.2
+CURLFORM_BUFFER 7.9.8 7.56.0
+CURLFORM_BUFFERLENGTH 7.9.8 7.56.0
+CURLFORM_BUFFERPTR 7.9.8 7.56.0
+CURLFORM_CONTENTHEADER 7.9.3 7.56.0
+CURLFORM_CONTENTLEN 7.46.0 7.56.0
+CURLFORM_CONTENTSLENGTH 7.9 7.56.0
+CURLFORM_CONTENTTYPE 7.9 7.56.0
+CURLFORM_COPYCONTENTS 7.9 7.56.0
+CURLFORM_COPYNAME 7.9 7.56.0
+CURLFORM_END 7.9 7.56.0
+CURLFORM_FILE 7.9 7.56.0
+CURLFORM_FILECONTENT 7.9.1 7.56.0
+CURLFORM_FILENAME 7.9.6 7.56.0
+CURLFORM_NAMELENGTH 7.9 7.56.0
+CURLFORM_NOTHING 7.9 7.56.0
+CURLFORM_PTRCONTENTS 7.9 7.56.0
+CURLFORM_PTRNAME 7.9 7.56.0
+CURLFORM_STREAM 7.18.2 7.56.0
CURLFTPAUTH_DEFAULT 7.12.2
CURLFTPAUTH_SSL 7.12.2
CURLFTPAUTH_TLS 7.12.2
@@ -406,7 +406,7 @@ CURLOPT_HTTP200ALIASES 7.10.3
CURLOPT_HTTPAUTH 7.10.6
CURLOPT_HTTPGET 7.8.1
CURLOPT_HTTPHEADER 7.1
-CURLOPT_HTTPPOST 7.1
+CURLOPT_HTTPPOST 7.1 7.56.0
CURLOPT_HTTPPROXYTUNNEL 7.3
CURLOPT_HTTPREQUEST 7.1 - 7.15.5
CURLOPT_HTTP_CONTENT_DECODING 7.16.2
@@ -441,6 +441,7 @@ CURLOPT_MAXFILESIZE_LARGE 7.11.0
CURLOPT_MAXREDIRS 7.5
CURLOPT_MAX_RECV_SPEED_LARGE 7.15.5
CURLOPT_MAX_SEND_SPEED_LARGE 7.15.5
+CURLOPT_MIMEPOST 7.56.0
CURLOPT_MUTE 7.1 7.8 7.15.5
CURLOPT_NETRC 7.1
CURLOPT_NETRC_FILE 7.11.0
@@ -540,6 +541,7 @@ CURLOPT_SOURCE_QUOTE 7.13.0 - 7.15.5
CURLOPT_SOURCE_URL 7.13.0 - 7.15.5
CURLOPT_SOURCE_USERPWD 7.12.1 - 7.15.5
CURLOPT_SSH_AUTH_TYPES 7.16.1
+CURLOPT_SSH_COMPRESSION 7.56.0
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 7.17.1
CURLOPT_SSH_KEYDATA 7.19.6
CURLOPT_SSH_KEYFUNCTION 7.19.6
@@ -689,10 +691,15 @@ CURLSSLBACKEND_SCHANNEL 7.34.0
CURLSSLBACKEND_WOLFSSL 7.49.0
CURLSSLOPT_ALLOW_BEAST 7.25.0
CURLSSLOPT_NO_REVOKE 7.44.0
+CURLSSLSET_NO_BACKENDS 7.56.0
+CURLSSLSET_OK 7.56.0
+CURLSSLSET_TOO_LATE 7.56.0
+CURLSSLSET_UNKNOWN_BACKEND 7.56.0
CURLUSESSL_ALL 7.17.0
CURLUSESSL_CONTROL 7.17.0
CURLUSESSL_NONE 7.17.0
CURLUSESSL_TRY 7.17.0
+CURLVERSION_FIFTH 7.57.0
CURLVERSION_FIRST 7.10
CURLVERSION_FOURTH 7.16.1
CURLVERSION_NOW 7.10
@@ -713,14 +720,14 @@ CURL_ERROR_SIZE 7.1
CURL_FNMATCHFUNC_FAIL 7.21.0
CURL_FNMATCHFUNC_MATCH 7.21.0
CURL_FNMATCHFUNC_NOMATCH 7.21.0
-CURL_FORMADD_DISABLED 7.12.1
-CURL_FORMADD_ILLEGAL_ARRAY 7.9.8
-CURL_FORMADD_INCOMPLETE 7.9.8
-CURL_FORMADD_MEMORY 7.9.8
-CURL_FORMADD_NULL 7.9.8
-CURL_FORMADD_OK 7.9.8
-CURL_FORMADD_OPTION_TWICE 7.9.8
-CURL_FORMADD_UNKNOWN_OPTION 7.9.8
+CURL_FORMADD_DISABLED 7.12.1 7.56.0
+CURL_FORMADD_ILLEGAL_ARRAY 7.9.8 7.56.0
+CURL_FORMADD_INCOMPLETE 7.9.8 7.56.0
+CURL_FORMADD_MEMORY 7.9.8 7.56.0
+CURL_FORMADD_NULL 7.9.8 7.56.0
+CURL_FORMADD_OK 7.9.8 7.56.0
+CURL_FORMADD_OPTION_TWICE 7.9.8 7.56.0
+CURL_FORMADD_UNKNOWN_OPTION 7.9.8 7.56.0
CURL_GLOBAL_ACK_EINTR 7.30.0
CURL_GLOBAL_ALL 7.8
CURL_GLOBAL_DEFAULT 7.8
@@ -823,6 +830,7 @@ CURL_TIMECOND_NONE 7.9.7
CURL_TLSAUTH_NONE 7.21.4
CURL_TLSAUTH_SRP 7.21.4
CURL_VERSION_ASYNCHDNS 7.10.7
+CURL_VERSION_BROTLI 7.57.0
CURL_VERSION_CONV 7.15.4
CURL_VERSION_CURLDEBUG 7.19.6
CURL_VERSION_DEBUG 7.10.6
@@ -836,6 +844,7 @@ CURL_VERSION_KERBEROS4 7.10 7.33.0
CURL_VERSION_KERBEROS5 7.40.0
CURL_VERSION_LARGEFILE 7.11.1
CURL_VERSION_LIBZ 7.10
+CURL_VERSION_MULTI_SSL 7.56.0
CURL_VERSION_NTLM 7.10.6
CURL_VERSION_NTLM_WB 7.22.0
CURL_VERSION_PSL 7.47.0
@@ -848,3 +857,4 @@ CURL_WAIT_POLLIN 7.28.0
CURL_WAIT_POLLOUT 7.28.0
CURL_WAIT_POLLPRI 7.28.0
CURL_WRITEFUNC_PAUSE 7.18.0
+CURL_ZERO_TERMINATED 7.56.0
diff --git a/include/README b/include/README
index 9e865aa..c2589ec 100644
--- a/include/README
+++ b/include/README
@@ -30,4 +30,4 @@ NOTE FOR LIBCURL HACKERS
To figure out how to do good and portable checks for features, operating
systems or specific hardwarare, a very good resource is Bjorn Reese's
-collection at http://predef.sf.net/
+collection at https://sourceforge.net/p/predef/wiki/
diff --git a/include/curl/curl.h b/include/curl/curl.h
index 82fb8ae..9ad5c20 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -74,6 +74,7 @@
#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \
defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \
+ defined(__CYGWIN__) || \
(defined(__FreeBSD_version) && (__FreeBSD_version < 800000))
#include <sys/select.h>
#endif
@@ -132,6 +133,27 @@ typedef int curl_socket_t;
#define curl_socket_typedef
#endif /* curl_socket_typedef */
+/* enum for the different supported SSL backends */
+typedef enum {
+ CURLSSLBACKEND_NONE = 0,
+ CURLSSLBACKEND_OPENSSL = 1,
+ CURLSSLBACKEND_GNUTLS = 2,
+ CURLSSLBACKEND_NSS = 3,
+ CURLSSLBACKEND_OBSOLETE4 = 4, /* Was QSOSSL. */
+ CURLSSLBACKEND_GSKIT = 5,
+ CURLSSLBACKEND_POLARSSL = 6,
+ CURLSSLBACKEND_WOLFSSL = 7,
+ CURLSSLBACKEND_SCHANNEL = 8,
+ CURLSSLBACKEND_DARWINSSL = 9,
+ CURLSSLBACKEND_AXTLS = 10,
+ CURLSSLBACKEND_MBEDTLS = 11
+} curl_sslbackend;
+
+/* aliases for library clones and renames */
+#define CURLSSLBACKEND_LIBRESSL CURLSSLBACKEND_OPENSSL
+#define CURLSSLBACKEND_BORINGSSL CURLSSLBACKEND_OPENSSL
+#define CURLSSLBACKEND_CYASSL CURLSSLBACKEND_WOLFSSL
+
struct curl_httppost {
struct curl_httppost *next; /* next entry in the list */
char *name; /* pointer to allocated name */
@@ -335,7 +357,7 @@ typedef size_t (*curl_read_callback)(char *buffer,
size_t nitems,
void *instream);
-typedef enum {
+typedef enum {
CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */
CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */
CURLSOCKTYPE_LAST /* never use */
@@ -377,7 +399,7 @@ typedef enum {
CURLIOE_LAST /* never use */
} curlioerr;
-typedef enum {
+typedef enum {
CURLIOCMD_NOP, /* no operation */
CURLIOCMD_RESTARTREAD, /* restart the read stream from start */
CURLIOCMD_LAST /* never use */
@@ -1788,6 +1810,12 @@ typedef enum {
/* bitmask of allowed auth methods for connections to SOCKS5 proxies */
CINIT(SOCKS5_AUTH, LONG, 267),
+ /* Enable/disable SSH compression */
+ CINIT(SSH_COMPRESSION, LONG, 268),
+
+ /* Post MIME data. */
+ CINIT(MIMEPOST, OBJECTPOINT, 269),
+
CURLOPT_LASTENTRY /* the last unused */
} CURLoption;
@@ -1934,15 +1962,140 @@ typedef enum {
CURL_TIMECOND_LAST
} curl_TimeCond;
+/* Special size_t value signaling a zero-terminated string. */
+#define CURL_ZERO_TERMINATED ((size_t) -1)
/* curl_strequal() and curl_strnequal() are subject for removal in a future
- libcurl, see lib/README.curlx for details
+ release */
+CURL_EXTERN int curl_strequal(const char *s1, const char *s2);
+CURL_EXTERN int curl_strnequal(const char *s1, const char *s2, size_t n);
+
+/* Mime/form handling support. */
+typedef struct curl_mime_s curl_mime; /* Mime context. */
+typedef struct curl_mimepart_s curl_mimepart; /* Mime part context. */
+
+/*
+ * NAME curl_mime_init()
+ *
+ * DESCRIPTION
+ *
+ * Create a mime context and return its handle. The easy parameter is the
+ * target handle.
+ */
+CURL_EXTERN curl_mime *curl_mime_init(CURL *easy);
+
+/*
+ * NAME curl_mime_free()
+ *
+ * DESCRIPTION
+ *
+ * release a mime handle and its substructures.
+ */
+CURL_EXTERN void curl_mime_free(curl_mime *mime);
+
+/*
+ * NAME curl_mime_addpart()
+ *
+ * DESCRIPTION
+ *
+ * Append a new empty part to the given mime context and return a handle to
+ * the created part.
+ */
+CURL_EXTERN curl_mimepart *curl_mime_addpart(curl_mime *mime);
+
+/*
+ * NAME curl_mime_name()
+ *
+ * DESCRIPTION
+ *
+ * Set mime/form part name.
+ */
+CURL_EXTERN CURLcode curl_mime_name(curl_mimepart *part, const char *name);
+
+/*
+ * NAME curl_mime_filename()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part remote file name.
+ */
+CURL_EXTERN CURLcode curl_mime_filename(curl_mimepart *part,
+ const char *filename);
+
+/*
+ * NAME curl_mime_type()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part type.
+ */
+CURL_EXTERN CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype);
+
+/*
+ * NAME curl_mime_encoder()
+ *
+ * DESCRIPTION
+ *
+ * Set mime data transfer encoder.
+ */
+CURL_EXTERN CURLcode curl_mime_encoder(curl_mimepart *part,
+ const char *encoding);
+
+/*
+ * NAME curl_mime_data()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part data source from memory data,
+ */
+CURL_EXTERN CURLcode curl_mime_data(curl_mimepart *part,
+ const char *data, size_t datasize);
+
+/*
+ * NAME curl_mime_filedata()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part data source from named file.
+ */
+CURL_EXTERN CURLcode curl_mime_filedata(curl_mimepart *part,
+ const char *filename);
+
+/*
+ * NAME curl_mime_data_cb()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part data source from callback function.
+ */
+CURL_EXTERN CURLcode curl_mime_data_cb(curl_mimepart *part,
+ curl_off_t datasize,
+ curl_read_callback readfunc,
+ curl_seek_callback seekfunc,
+ curl_free_callback freefunc,
+ void *arg);
- !checksrc! disable SPACEBEFOREPAREN 2
-*/
-CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2);
-CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n);
+/*
+ * NAME curl_mime_subparts()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part data source from subparts.
+ */
+CURL_EXTERN CURLcode curl_mime_subparts(curl_mimepart *part,
+ curl_mime *subparts);
+/*
+ * NAME curl_mime_headers()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part headers.
+ */
+CURL_EXTERN CURLcode curl_mime_headers(curl_mimepart *part,
+ struct curl_slist *headers,
+ int take_ownership);
+/* Old form API. */
/* name is uppercase CURLFORM_<name> */
#ifdef CFINIT
#undef CFINIT
@@ -2185,6 +2338,47 @@ struct curl_slist {
};
/*
+ * NAME curl_global_sslset()
+ *
+ * DESCRIPTION
+ *
+ * When built with multiple SSL backends, curl_global_sslset() allows to
+ * choose one. This function can only be called once, and it must be called
+ * *before* curl_global_init().
+ *
+ * The backend can be identified by the id (e.g. CURLSSLBACKEND_OPENSSL). The
+ * backend can also be specified via the name parameter (passing -1 as id).
+ * If both id and name are specified, the name will be ignored. If neither id
+ * nor name are specified, the function will fail with
+ * CURLSSLSET_UNKNOWN_BACKEND and set the "avail" pointer to the
+ * NULL-terminated list of available backends.
+ *
+ * Upon success, the function returns CURLSSLSET_OK.
+ *
+ * If the specified SSL backend is not available, the function returns
+ * CURLSSLSET_UNKNOWN_BACKEND and sets the "avail" pointer to a NULL-terminated
+ * list of available SSL backends.
+ *
+ * The SSL backend can be set only once. If it has already been set, a
+ * subsequent attempt to change it will result in a CURLSSLSET_TOO_LATE.
+ */
+
+typedef struct {
+ curl_sslbackend id;
+ const char *name;
+} curl_ssl_backend;
+
+typedef enum {
+ CURLSSLSET_OK = 0,
+ CURLSSLSET_UNKNOWN_BACKEND,
+ CURLSSLSET_TOO_LATE,
+ CURLSSLSET_NO_BACKENDS /* libcurl was built without any SSL support */
+} CURLsslset;
+
+CURL_EXTERN CURLsslset curl_global_sslset(curl_sslbackend id, const char *name,
+ const curl_ssl_backend ***avail);
+
+/*
* NAME curl_slist_append()
*
* DESCRIPTION
@@ -2224,27 +2418,6 @@ struct curl_certinfo {
format "name: value" */
};
-/* enum for the different supported SSL backends */
-typedef enum {
- CURLSSLBACKEND_NONE = 0,
- CURLSSLBACKEND_OPENSSL = 1,
- CURLSSLBACKEND_GNUTLS = 2,
- CURLSSLBACKEND_NSS = 3,
- CURLSSLBACKEND_OBSOLETE4 = 4, /* Was QSOSSL. */
- CURLSSLBACKEND_GSKIT = 5,
- CURLSSLBACKEND_POLARSSL = 6,
- CURLSSLBACKEND_CYASSL = 7,
- CURLSSLBACKEND_SCHANNEL = 8,
- CURLSSLBACKEND_DARWINSSL = 9,
- CURLSSLBACKEND_AXTLS = 10,
- CURLSSLBACKEND_MBEDTLS = 11
-} curl_sslbackend;
-
-/* aliases for library clones and renames */
-#define CURLSSLBACKEND_LIBRESSL 1
-#define CURLSSLBACKEND_BORINGSSL 1
-#define CURLSSLBACKEND_WOLFSSL 6
-
/* Information about the SSL library used and the respective internal SSL
handle, which can be used to obtain further information regarding the
connection. Asked for with CURLINFO_TLS_SSL_PTR or CURLINFO_TLS_SESSION. */
@@ -2341,7 +2514,7 @@ typedef enum {
CURLCLOSEPOLICY_LAST /* last, never use this */
} curl_closepolicy;
-#define CURL_GLOBAL_SSL (1<<0)
+#define CURL_GLOBAL_SSL (1<<0) /* no purpose since since 7.57.0 */
#define CURL_GLOBAL_WIN32 (1<<1)
#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)
#define CURL_GLOBAL_NOTHING 0
@@ -2419,6 +2592,7 @@ typedef enum {
CURLVERSION_SECOND,
CURLVERSION_THIRD,
CURLVERSION_FOURTH,
+ CURLVERSION_FIFTH,
CURLVERSION_LAST /* never actually use this */
} CURLversion;
@@ -2427,7 +2601,7 @@ typedef enum {
meant to be a built-in version number for what kind of struct the caller
expects. If the struct ever changes, we redefine the NOW to another enum
from above. */
-#define CURLVERSION_NOW CURLVERSION_FOURTH
+#define CURLVERSION_NOW CURLVERSION_FIFTH
typedef struct {
CURLversion age; /* age of the returned struct */
@@ -2455,6 +2629,12 @@ typedef struct {
const char *libssh_version; /* human readable string */
+ /* These fields were added in CURLVERSION_FIFTH */
+
+ unsigned int brotli_ver_num; /* Numeric Brotli version
+ (MAJOR << 24) | (MINOR << 12) | PATCH */
+ const char *brotli_version; /* human readable string. */
+
} curl_version_info_data;
#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */
@@ -2484,6 +2664,8 @@ typedef struct {
#define CURL_VERSION_PSL (1<<20) /* Mozilla's Public Suffix List, used
for cookie domain verification */
#define CURL_VERSION_HTTPS_PROXY (1<<21) /* HTTPS-proxy support built-in */
+#define CURL_VERSION_MULTI_SSL (1<<22) /* Multiple SSL backends available */
+#define CURL_VERSION_BROTLI (1<<23) /* Brotli features are present. */
/*
* NAME curl_version_info()
diff --git a/include/curl/curlver.h b/include/curl/curlver.h
index f3cc1ea..30b1463 100644
--- a/include/curl/curlver.h
+++ b/include/curl/curlver.h
@@ -30,13 +30,13 @@
/* This is the version number of the libcurl package from which this header
file origins: */
-#define LIBCURL_VERSION "7.55.1"
+#define LIBCURL_VERSION "7.57.0"
/* The numeric version number is also available "in parts" by using these
defines: */
#define LIBCURL_VERSION_MAJOR 7
-#define LIBCURL_VERSION_MINOR 55
-#define LIBCURL_VERSION_PATCH 1
+#define LIBCURL_VERSION_MINOR 57
+#define LIBCURL_VERSION_PATCH 0
/* This is the numeric version of the libcurl version number, meant for easier
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
@@ -57,7 +57,7 @@
CURL_VERSION_BITS() macro since curl's own configure script greps for it
and needs it to contain the full number.
*/
-#define LIBCURL_VERSION_NUM 0x073701
+#define LIBCURL_VERSION_NUM 0x073900
/*
* This is the date and time when the full source package was created. The
@@ -68,7 +68,7 @@
*
* "2007-11-23"
*/
-#define LIBCURL_TIMESTAMP "2017-08-14"
+#define LIBCURL_TIMESTAMP "2017-11-29"
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z)
#define CURL_AT_LEAST_VERSION(x,y,z) \
diff --git a/include/curl/multi.h b/include/curl/multi.h
index f93e511..911c91d 100644
--- a/include/curl/multi.h
+++ b/include/curl/multi.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/include/curl/system.h b/include/curl/system.h
index 95c72d9..39dae75 100644
--- a/include/curl/system.h
+++ b/include/curl/system.h
@@ -52,226 +52,171 @@
#if defined(__DJGPP__) || defined(__GO32__)
# if defined(__DJGPP__) && (__DJGPP__ > 1)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# else
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__SALFORDC__)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__BORLANDC__)
# if (__BORLANDC__ < 0x520)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# else
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__TURBOC__)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__WATCOMC__)
# if defined(__386__)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
# else
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__POCC__)
# if (__POCC__ < 280)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# elif defined(_MSC_VER)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
# else
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__LCC__)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__SYMBIAN32__)
# if defined(__EABI__) /* Treat all ARM compilers equally */
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# elif defined(__CW32__)
# pragma longlong on
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# elif defined(__VC32__)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__MWERKS__)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(_WIN32_WCE)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__MINGW32__)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
# define CURL_PULL_SYS_TYPES_H 1
# define CURL_PULL_WS2TCPIP_H 1
#elif defined(__VMS)
# if defined(__VAX)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# else
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__OS400__)
# if defined(__ILEC400__)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
# define CURL_PULL_SYS_TYPES_H 1
# define CURL_PULL_SYS_SOCKET_H 1
# endif
@@ -279,34 +224,28 @@
#elif defined(__MVS__)
# if defined(__IBMC__) || defined(__IBMCPP__)
# if defined(_ILP32)
-# define CURL_SIZEOF_LONG 4
# elif defined(_LP64)
-# define CURL_SIZEOF_LONG 8
# endif
# if defined(_LONG_LONG)
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# elif defined(_LP64)
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# else
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
# define CURL_PULL_SYS_TYPES_H 1
# define CURL_PULL_SYS_SOCKET_H 1
# endif
@@ -314,56 +253,45 @@
#elif defined(__370__)
# if defined(__IBMC__) || defined(__IBMCPP__)
# if defined(_ILP32)
-# define CURL_SIZEOF_LONG 4
# elif defined(_LP64)
-# define CURL_SIZEOF_LONG 8
# endif
# if defined(_LONG_LONG)
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# elif defined(_LP64)
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# else
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
# define CURL_PULL_SYS_TYPES_H 1
# define CURL_PULL_SYS_SOCKET_H 1
# endif
#elif defined(TPF)
-# define CURL_SIZEOF_LONG 8
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
#elif defined(__TINYC__) /* also known as tcc */
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
@@ -373,25 +301,20 @@
#elif defined(__SUNPRO_C) /* Oracle Solaris Studio */
# if !defined(__LP64) && (defined(__ILP32) || \
defined(__i386) || defined(__sparcv8))
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# elif defined(__LP64) || \
defined(__amd64) || defined(__sparcv9)
-# define CURL_SIZEOF_LONG 8
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
# define CURL_PULL_SYS_TYPES_H 1
# define CURL_PULL_SYS_SOCKET_H 1
@@ -401,62 +324,51 @@
#elif defined(_MSC_VER)
# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64)
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
# else
-# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T int
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
/* ===================================== */
/* KEEP GENERIC GCC THE LAST ENTRY */
/* ===================================== */
#elif defined(__GNUC__)
-# if !defined(__LP64__) && (defined(__ILP32__) || \
- defined(__i386__) || defined(__powerpc__) || defined(__arm__) || \
- defined(__sparc__) || defined(__mips__) || defined(__sh__) || \
- defined(__XTENSA__) || (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4))
-# define CURL_SIZEOF_LONG 4
+# if !defined(__LP64__) && \
+ (defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \
+ defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \
+ defined(__sparc__) || defined(__mips__) || defined(__sh__) || \
+ defined(__XTENSA__) || \
+ (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4))
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
# elif defined(__LP64__) || \
defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
(defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8)
-# define CURL_SIZEOF_LONG 8
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# endif
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
# define CURL_PULL_SYS_TYPES_H 1
# define CURL_PULL_SYS_SOCKET_H 1
#else
/* generic "safe guess" on old 32 bit style */
-# define CURL_SIZEOF_LONG 4
-# define CURL_SIZEOF_CURL_SOCKLEN_T 4
-# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
@@ -465,6 +377,12 @@
# define CURL_TYPEOF_CURL_SOCKLEN_T int
#endif
+#ifdef _AIX
+/* AIX needs <sys/poll.h> */
+#define CURL_PULL_SYS_POLL_H
+#endif
+
+
/* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file */
/* ws2tcpip.h is required here to properly make type definitions below. */
#ifdef CURL_PULL_WS2TCPIP_H
@@ -485,6 +403,12 @@
# include <sys/socket.h>
#endif
+/* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */
+/* sys/poll.h is required here to properly make type definitions below. */
+#ifdef CURL_PULL_SYS_POLL_H
+# include <sys/poll.h>
+#endif
+
/* Data type definition of curl_socklen_t. */
#ifdef CURL_TYPEOF_CURL_SOCKLEN_T
typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
diff --git a/include/curl/typecheck-gcc.h b/include/curl/typecheck-gcc.h
index 7454824..10c74c7 100644
--- a/include/curl/typecheck-gcc.h
+++ b/include/curl/typecheck-gcc.h
@@ -96,6 +96,9 @@ __extension__ ({ \
if((_curl_opt) == CURLOPT_HTTPPOST) \
if(!_curl_is_arr((value), struct curl_httppost)) \
_curl_easy_setopt_err_curl_httpost(); \
+ if((_curl_opt) == CURLOPT_MIMEPOST) \
+ if(!_curl_is_ptr((value), curl_mime)) \
+ _curl_easy_setopt_err_curl_mimepost(); \
if(_curl_is_slist_option(_curl_opt)) \
if(!_curl_is_arr((value), struct curl_slist)) \
_curl_easy_setopt_err_curl_slist(); \
@@ -200,6 +203,9 @@ _CURL_WARNING(_curl_easy_setopt_err_postfields,
_CURL_WARNING(_curl_easy_setopt_err_curl_httpost,
"curl_easy_setopt expects a 'struct curl_httppost *' "
"argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_curl_mimepost,
+ "curl_easy_setopt expects a 'curl_mime *' "
+ "argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_curl_slist,
"curl_easy_setopt expects a 'struct curl_slist *' argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_CURLSH,
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index d6c9961..1fabdba 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -108,7 +108,24 @@ if(WIN32)
endif()
endif()
+target_include_directories(${LIB_NAME} INTERFACE
+ $<INSTALL_INTERFACE:include>)
+
install(TARGETS ${LIB_NAME}
+ EXPORT libcurl-target
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
- RUNTIME DESTINATION bin)
+ RUNTIME DESTINATION bin
+)
+
+export(TARGETS ${LIB_NAME}
+ APPEND FILE ${PROJECT_BINARY_DIR}/libcurl-target.cmake
+ NAMESPACE CURL::
+)
+
+install(EXPORT libcurl-target
+ FILE libcurl-target.cmake
+ NAMESPACE CURL::
+ DESTINATION ${CURL_INSTALL_CMAKE_DIR}
+)
+
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 176bf33..151c261 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -66,21 +66,7 @@ endif
# Prevent LIBS from being used for all link targets
LIBS = $(BLANK_AT_MAKETIME)
-if SONAME_BUMP
-#
-# Bumping of SONAME conditionally may seem like a weird thing to do, and yeah
-# it is. The problem is that we try to avoid the bump as hard as possible, but
-# yet it is still necessary for a few rare situations. The configure script will
-# attempt to figure out these situations, and it can be forced to consider this
-# to be such a case! See README.curl_off_t for further details.
-#
-# This conditional soname bump SHOULD be removed at next "proper" bump.
-#
-VERSIONINFO=-version-info 9:0:4
-else
-VERSIONINFO=-version-info 8:0:4
-endif
-
+VERSIONINFO=-version-info 9:0:5
# This flag accepts an argument of the form current[:revision[:age]]. So,
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
# 1.
diff --git a/lib/Makefile.inc b/lib/Makefile.inc
index 19f5800..0a88b8e 100644
--- a/lib/Makefile.inc
+++ b/lib/Makefile.inc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -53,7 +53,8 @@ LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c \
http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c \
curl_multibyte.c hostcheck.c conncache.c pipeline.c dotdot.c \
- x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c
+ x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c \
+ mime.c sha256.c setopt.c
LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \
@@ -72,7 +73,7 @@ LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
curl_sasl.h curl_multibyte.h hostcheck.h conncache.h \
curl_setup_once.h multihandle.h setup-vms.h pipeline.h dotdot.h \
x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h \
- curl_printf.h system_win32.h rand.h
+ curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h
LIB_RCFILES = libcurl.rc
diff --git a/lib/Makefile.m32 b/lib/Makefile.m32
index 8e4c703..773187a 100644
--- a/lib/Makefile.m32
+++ b/lib/Makefile.m32
@@ -22,8 +22,9 @@
###########################################################################
#
-## Makefile for building libcurl.a with MingW (GCC-3.2 or later)
-## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4)
+## Makefile for building libcurl.a with MingW (GCC-3.2 or later or LLVM/Clang)
+## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4),
+## brotli (1.0.1)
##
## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
@@ -38,6 +39,10 @@
ifndef ZLIB_PATH
ZLIB_PATH = ../../zlib-1.2.8
endif
+# Edit the path below to point to the base of your Brotli sources.
+ifndef BROTLI_PATH
+BROTLI_PATH = ../../brotli-1.0.1
+endif
# Edit the path below to point to the base of your OpenSSL package.
ifndef OPENSSL_PATH
OPENSSL_PATH = ../../openssl-1.0.2a
@@ -50,9 +55,9 @@ endif
ifndef LIBRTMP_PATH
LIBRTMP_PATH = ../../librtmp-2.4
endif
-# Edit the path below to point to the base of your libidn package.
-ifndef LIBIDN_PATH
-LIBIDN_PATH = ../../libidn-1.32
+# Edit the path below to point to the base of your libidn2 package.
+ifndef LIBIDN2_PATH
+LIBIDN2_PATH = ../../libidn2-2.0.3
endif
# Edit the path below to point to the base of your MS IDN package.
# Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1
@@ -76,13 +81,23 @@ ifndef LIBCARES_PATH
LIBCARES_PATH = $(PROOT)/ares
endif
-CC = $(CROSSPREFIX)gcc
+ifeq ($(CURL_CC),)
+CURL_CC := $(CROSSPREFIX)gcc
+endif
+ifeq ($(CURL_AR),)
+CURL_AR := $(CROSSPREFIX)ar
+endif
+ifeq ($(CURL_RANLIB),)
+CURL_RANLIB := $(CROSSPREFIX)ranlib
+endif
+
+CC = $(CURL_CC)
CFLAGS = $(CURL_CFLAG_EXTRAS) -g -O2 -Wall -W
CFLAGS += -fno-strict-aliasing
# comment LDFLAGS below to keep debug info
LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_DLL) -s
-AR = $(CROSSPREFIX)ar
-RANLIB = $(CROSSPREFIX)ranlib
+AR = $(CURL_AR)
+RANLIB = $(CURL_RANLIB)
RC = $(CROSSPREFIX)windres
RCFLAGS = --include-dir=$(PROOT)/include -DDEBUGBUILD=0 -O COFF
STRIP = $(CROSSPREFIX)strip -g
@@ -153,9 +168,7 @@ ZLIB = 1
endif
ifeq ($(findstring -ssh2,$(CFG)),-ssh2)
SSH2 = 1
-ifneq ($(findstring -winssl,$(CFG)),-winssl)
SSL = 1
-endif
ZLIB = 1
endif
ifeq ($(findstring -ssl,$(CFG)),-ssl)
@@ -167,8 +180,11 @@ endif
ifeq ($(findstring -zlib,$(CFG)),-zlib)
ZLIB = 1
endif
-ifeq ($(findstring -idn,$(CFG)),-idn)
-IDN = 1
+ifeq ($(findstring -brotli,$(CFG)),-brotli)
+BROTLI = 1
+endif
+ifeq ($(findstring -idn2,$(CFG)),-idn2)
+IDN2 = 1
endif
ifeq ($(findstring -winidn,$(CFG)),-winidn)
WINIDN = 1
@@ -192,6 +208,11 @@ endif
INCLUDES = -I. -I../include
CFLAGS += -DBUILDING_LIBCURL
+ifdef SSL
+ ifdef WINSSL
+ CFLAGS += -DCURL_WITH_MULTI_SSL
+ endif
+endif
ifdef SYNC
CFLAGS += -DUSE_SYNC_DNS
@@ -257,20 +278,30 @@ ifdef SSL
CFLAGS += -DHAVE_OPENSSL_SRP -DUSE_TLS_SRP
endif
endif
-else
+endif
ifdef WINSSL
+ CFLAGS += -DUSE_SCHANNEL
DLL_LIBS += -lcrypt32
endif
-endif
ifdef ZLIB
INCLUDES += -I"$(ZLIB_PATH)"
CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
DLL_LIBS += -L"$(ZLIB_PATH)" -lz
endif
-ifdef IDN
- INCLUDES += -I"$(LIBIDN_PATH)/include"
- CFLAGS += -DUSE_LIBIDN
- DLL_LIBS += -L"$(LIBIDN_PATH)/lib" -lidn
+ifdef BROTLI
+ INCLUDES += -I"$(BROTLI_PATH)/include"
+ CFLAGS += -DHAVE_BROTLI
+ DLL_LIBS += -L"$(BROTLI_PATH)/lib"
+ ifdef BROTLI_LIBS
+ DLL_LIBS += $(BROTLI_LIBS)
+ else
+ DLL_LIBS += -lbrotlidec
+ endif
+endif
+ifdef IDN2
+ INCLUDES += -I"$(LIBIDN2_PATH)/include"
+ CFLAGS += -DUSE_LIBIDN2
+ DLL_LIBS += -L"$(LIBIDN2_PATH)/lib" -lidn2
else
ifdef WINIDN
CFLAGS += -DUSE_WIN32_IDN
@@ -280,9 +311,6 @@ endif
endif
ifdef SSPI
CFLAGS += -DUSE_WINDOWS_SSPI
- ifdef WINSSL
- CFLAGS += -DUSE_SCHANNEL
- endif
endif
ifdef SPNEGO
CFLAGS += -DHAVE_SPNEGO
@@ -313,8 +341,12 @@ DLL_LIBS += -lws2_32
# Makefile.inc provides the CSOURCES and HHEADERS defines
include Makefile.inc
-libcurl_dll_LIBRARY = libcurl.dll
-libcurl_dll_a_LIBRARY = libcurldll.a
+ifeq ($(CURL_DLL_A_SUFFIX),)
+CURL_DLL_A_SUFFIX := dll
+endif
+
+libcurl_dll_LIBRARY = libcurl$(CURL_DLL_SUFFIX).dll
+libcurl_dll_a_LIBRARY = libcurl$(CURL_DLL_A_SUFFIX).a
libcurl_a_LIBRARY = libcurl.a
libcurl_a_OBJECTS := $(patsubst %.c,%.o,$(strip $(CSOURCES)))
diff --git a/lib/asyn-ares.c b/lib/asyn-ares.c
index 9b6515c..38ede99 100644
--- a/lib/asyn-ares.c
+++ b/lib/asyn-ares.c
@@ -22,6 +22,14 @@
#include "curl_setup.h"
+/***********************************************************************
+ * Only for ares-enabled builds
+ * And only for functions that fulfill the asynch resolver backend API
+ * as defined in asyn.h, nothing else belongs in this file!
+ **********************************************************************/
+
+#ifdef CURLRES_ARES
+
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
@@ -48,14 +56,6 @@
#define in_addr_t unsigned long
#endif
-/***********************************************************************
- * Only for ares-enabled builds
- * And only for functions that fulfill the asynch resolver backend API
- * as defined in asyn.h, nothing else belongs in this file!
- **********************************************************************/
-
-#ifdef CURLRES_ARES
-
#include "urldata.h"
#include "sendf.h"
#include "hostip.h"
@@ -260,7 +260,7 @@ static int waitperform(struct connectdata *conn, int timeout_ms)
bitmask = ares_getsock((ares_channel)data->state.resolver, socks,
ARES_GETSOCK_MAXNUM);
- for(i=0; i < ARES_GETSOCK_MAXNUM; i++) {
+ for(i = 0; i < ARES_GETSOCK_MAXNUM; i++) {
pfd[i].events = 0;
pfd[i].revents = 0;
if(ARES_GETSOCK_READABLE(bitmask, i)) {
@@ -289,7 +289,7 @@ static int waitperform(struct connectdata *conn, int timeout_ms)
ARES_SOCKET_BAD);
else {
/* move through the descriptors and ask for processing on them */
- for(i=0; i < num; i++)
+ for(i = 0; i < num; i++)
ares_process_fd((ares_channel)data->state.resolver,
pfd[i].revents & (POLLRDNORM|POLLIN)?
pfd[i].fd:ARES_SOCKET_BAD,
@@ -354,8 +354,8 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
{
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
- long timeout;
- struct curltime now = Curl_tvnow();
+ timediff_t timeout;
+ struct curltime now = Curl_now();
struct Curl_dns_entry *temp_entry;
if(entry)
@@ -400,8 +400,8 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
else {
- struct curltime now2 = Curl_tvnow();
- time_t timediff = Curl_tvdiff(now2, now); /* spent time */
+ struct curltime now2 = Curl_now();
+ timediff_t timediff = Curl_timediff(now2, now); /* spent time */
if(timediff <= 0)
timeout -= 1; /* always deduct at least 1 */
else if(timediff > timeout)
diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c
index 8936b60..1ac3fc8 100644
--- a/lib/asyn-thread.c
+++ b/lib/asyn-thread.c
@@ -210,6 +210,10 @@ int init_thread_sync_data(struct thread_data * td,
tsd->td = td;
tsd->port = port;
+ /* Treat the request as done until the thread actually starts so any early
+ * cleanup gets done properly.
+ */
+ tsd->done = 1;
#ifdef HAVE_GETADDRINFO
DEBUGASSERT(hints);
tsd->hints = *hints;
@@ -380,11 +384,11 @@ static bool init_resolve_thread(struct connectdata *conn,
const struct addrinfo *hints)
{
struct thread_data *td = calloc(1, sizeof(struct thread_data));
- int err = RESOLVER_ENOMEM;
+ int err = ENOMEM;
conn->async.os_specific = (void *)td;
if(!td)
- goto err_exit;
+ goto errno_exit;
conn->async.port = port;
conn->async.done = FALSE;
@@ -392,14 +396,20 @@ static bool init_resolve_thread(struct connectdata *conn,
conn->async.dns = NULL;
td->thread_hnd = curl_thread_t_null;
- if(!init_thread_sync_data(td, hostname, port, hints))
- goto err_exit;
+ if(!init_thread_sync_data(td, hostname, port, hints)) {
+ conn->async.os_specific = NULL;
+ free(td);
+ goto errno_exit;
+ }
free(conn->async.hostname);
conn->async.hostname = strdup(hostname);
if(!conn->async.hostname)
goto err_exit;
+ /* The thread will set this to 1 when complete. */
+ td->tsd.done = 0;
+
#ifdef HAVE_GETADDRINFO
td->thread_hnd = Curl_thread_create(getaddrinfo_thread, &td->tsd);
#else
@@ -407,6 +417,8 @@ static bool init_resolve_thread(struct connectdata *conn,
#endif
if(!td->thread_hnd) {
+ /* The thread never started, so mark it as done here for proper cleanup. */
+ td->tsd.done = 1;
err = errno;
goto err_exit;
}
@@ -416,6 +428,7 @@ static bool init_resolve_thread(struct connectdata *conn,
err_exit:
destroy_async_data(&conn->async);
+ errno_exit:
errno = err;
return FALSE;
}
@@ -522,7 +535,8 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
}
else {
/* poll for name lookup done with exponential backoff up to 250ms */
- time_t elapsed = Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle);
+ timediff_t elapsed = Curl_timediff(Curl_now(),
+ data->progress.t_startsingle);
if(elapsed < 0)
elapsed = 0;
diff --git a/lib/checksrc.pl b/lib/checksrc.pl
index 2eff3e0..c1f74be 100755
--- a/lib/checksrc.pl
+++ b/lib/checksrc.pl
@@ -58,7 +58,11 @@ my %warnings = (
'OPENCOMMENT' => 'file ended with a /* comment still "open"',
'ASTERISKSPACE' => 'pointer declared with space after asterisk',
'ASTERISKNOSPACE' => 'pointer declared without space before asterisk',
- 'ASSIGNWITHINCONDITION' => 'assignment within conditional expression'
+ 'ASSIGNWITHINCONDITION' => 'assignment within conditional expression',
+ 'EQUALSNOSPACE' => 'equals sign without following space',
+ 'NOSPACEEQUALS' => 'equals sign without preceeding space',
+ 'SEMINOSPACE' => 'semicolon without following space',
+ 'MULTISPACE' => 'multiple spaces used when not suitable',
);
sub readwhitelist {
@@ -345,6 +349,9 @@ sub scanfile {
elsif($3 eq "return") {
# return must have a space
}
+ elsif($3 eq "case") {
+ # case must have a space
+ }
elsif($4 eq "*") {
# (* beginning makes the space OK!
}
@@ -523,6 +530,52 @@ sub scanfile {
"wrongly placed open brace");
}
}
+
+ # check for equals sign without spaces next to it
+ if($nostr =~ /(.*)\=[a-z0-9]/i) {
+ checkwarn("EQUALSNOSPACE",
+ $line, length($1)+1, $file, $ol,
+ "no space after equals sign");
+ }
+ # check for equals sign without spaces before it
+ elsif($nostr =~ /(.*)[a-z0-9]\=/i) {
+ checkwarn("NOSPACEEQUALS",
+ $line, length($1)+1, $file, $ol,
+ "no space before equals sign");
+ }
+
+ # check for plus signs without spaces next to it
+ if($nostr =~ /(.*)[^+]\+[a-z0-9]/i) {
+ checkwarn("PLUSNOSPACE",
+ $line, length($1)+1, $file, $ol,
+ "no space after plus sign");
+ }
+ # check for plus sign without spaces before it
+ elsif($nostr =~ /(.*)[a-z0-9]\+[^+]/i) {
+ checkwarn("NOSPACEPLUS",
+ $line, length($1)+1, $file, $ol,
+ "no space before plus sign");
+ }
+
+ # check for semicolons without space next to it
+ if($nostr =~ /(.*)\;[a-z0-9]/i) {
+ checkwarn("SEMINOSPACE",
+ $line, length($1)+1, $file, $ol,
+ "no space after semilcolon");
+ }
+
+ # check for more than one consecutive space before open brace or
+ # question mark. Skip lines containing strings since they make it hard
+ # due to artificially getting multiple spaces
+ if(($l eq $nostr) &&
+ $nostr =~ /^(.*(\S)) + [{?]/i) {
+ checkwarn("MULTISPACE",
+ $line, length($1)+1, $file, $ol,
+ "multiple space");
+ print STDERR "L: $l\n";
+ print STDERR "nostr: $nostr\n";
+ }
+
$line++;
$prevl = $ol;
}
diff --git a/lib/config-dos.h b/lib/config-dos.h
index f2c9ff4..eec7af9 100644
--- a/lib/config-dos.h
+++ b/lib/config-dos.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,8 +40,10 @@
#define PACKAGE "curl"
#define HAVE_ARPA_INET_H 1
+#define HAVE_ASSERT_H 1
#define HAVE_ERRNO_H 1
#define HAVE_FCNTL_H 1
+#define HAVE_FREEADDRINFO 1
#define HAVE_GETADDRINFO 1
#define HAVE_GETNAMEINFO 1
#define HAVE_GETPROTOBYNAME 1
@@ -85,9 +87,11 @@
#define RETSIGTYPE void
#define SIZEOF_INT 4
+#define SIZEOF_LONG 4
#define SIZEOF_LONG_DOUBLE 16
#define SIZEOF_SHORT 2
#define SIZEOF_SIZE_T 4
+#define SIZEOF_CURL_OFF_T 4
#define STDC_HEADERS 1
#define TIME_WITH_SYS_TIME 1
diff --git a/lib/config-os400.h b/lib/config-os400.h
index fe5b864..7844444 100644
--- a/lib/config-os400.h
+++ b/lib/config-os400.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -403,8 +403,14 @@
/* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2
+/* The size of `long', as computed by sizeof. */
+#define SIZEOF_LONG 4
+
/* The size of `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 8
+#define SIZEOF_SIZE_T 4
+
+/* The size of `curl_off_t', as computed by sizeof. */
+#define SIZEOF_CURL_OFF_T 8
/* Whether long long constants must be suffixed by LL. */
diff --git a/lib/config-tpf.h b/lib/config-tpf.h
index d1714fd..d1eb3d9 100644
--- a/lib/config-tpf.h
+++ b/lib/config-tpf.h
@@ -618,6 +618,9 @@
/* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2
+/* Define to the size of `long', as computed by sizeof. */
+#define SIZEOF_LONG 8
+
/* The size of `size_t', as computed by sizeof. */
#define SIZEOF_SIZE_T 8
diff --git a/lib/config-win32.h b/lib/config-win32.h
index 4cac859..309f701 100644
--- a/lib/config-win32.h
+++ b/lib/config-win32.h
@@ -399,6 +399,9 @@
/* Define to the size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2
+/* Define to the size of `long', as computed by sizeof. */
+#define SIZEOF_LONG 4
+
/* Define to the size of `size_t', as computed by sizeof. */
#if defined(_WIN64)
# define SIZEOF_SIZE_T 8
@@ -406,6 +409,9 @@
# define SIZEOF_SIZE_T 4
#endif
+/* Define to the size of `curl_off_t', as computed by sizeof. */
+#define SIZEOF_CURL_OFF_T 8
+
/* ---------------------------------------------------------------- */
/* BSD-style lwIP TCP/IP stack SPECIFIC */
/* ---------------------------------------------------------------- */
@@ -703,9 +709,7 @@ Vista
#endif
/* Define to use the Windows crypto library. */
-#if !defined(USE_OPENSSL) && !defined(USE_NSS)
#define USE_WIN32_CRYPTO
-#endif
/* ---------------------------------------------------------------- */
/* ADDITIONAL DEFINITIONS */
diff --git a/lib/config-win32ce.h b/lib/config-win32ce.h
index eb444c5..28a15f2 100644
--- a/lib/config-win32ce.h
+++ b/lib/config-win32ce.h
@@ -346,6 +346,9 @@
/* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2
+/* Define to the size of `long', as computed by sizeof. */
+#define SIZEOF_LONG 4
+
/* The size of `size_t', as computed by sizeof. */
#if defined(_WIN64)
# define SIZEOF_SIZE_T 8
diff --git a/lib/conncache.c b/lib/conncache.c
index c79d227..f8ef2e8 100644
--- a/lib/conncache.c
+++ b/lib/conncache.c
@@ -31,11 +31,21 @@
#include "multiif.h"
#include "sendf.h"
#include "conncache.h"
+#include "share.h"
+#include "sigpipe.h"
+#include "connect.h"
+
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
+#define CONN_LOCK(x) if((x)->share) \
+ Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE)
+#define CONN_UNLOCK(x) if((x)->share) \
+ Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT)
+
+
static void conn_llist_dtor(void *user, void *element)
{
struct connectdata *data = element;
@@ -109,8 +119,23 @@ static void free_bundle_hash_entry(void *freethis)
int Curl_conncache_init(struct conncache *connc, int size)
{
- return Curl_hash_init(&connc->hash, size, Curl_hash_str,
- Curl_str_key_compare, free_bundle_hash_entry);
+ int rc;
+
+ /* allocate a new easy handle to use when closing cached connections */
+ connc->closure_handle = curl_easy_init();
+ if(!connc->closure_handle)
+ return 1; /* bad */
+
+ rc = Curl_hash_init(&connc->hash, size, Curl_hash_str,
+ Curl_str_key_compare, free_bundle_hash_entry);
+ if(rc) {
+ Curl_close(connc->closure_handle);
+ connc->closure_handle = NULL;
+ }
+ else
+ connc->closure_handle->state.conn_cache = connc;
+
+ return rc;
}
void Curl_conncache_destroy(struct conncache *connc)
@@ -149,7 +174,9 @@ struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
if(connc) {
char key[128];
hashkey(conn, key, sizeof(key));
+ CONN_LOCK(conn->data);
bundle = Curl_hash_pick(&connc->hash, key, strlen(key));
+ CONN_UNLOCK(conn->data);
}
return bundle;
@@ -206,7 +233,9 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
return result;
hashkey(conn, key, sizeof(key));
+ CONN_LOCK(data);
rc = conncache_add_bundle(data->state.conn_cache, key, new_bundle);
+ CONN_UNLOCK(data);
if(!rc) {
bundle_destroy(new_bundle);
@@ -215,12 +244,15 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
bundle = new_bundle;
}
+ CONN_LOCK(data);
result = bundle_add_conn(bundle, conn);
if(result) {
if(new_bundle)
conncache_remove_bundle(data->state.conn_cache, new_bundle);
+ CONN_UNLOCK(data);
return result;
}
+ CONN_UNLOCK(data);
conn->connection_id = connc->next_connection_id++;
connc->num_connections++;
@@ -240,11 +272,11 @@ void Curl_conncache_remove_conn(struct conncache *connc,
/* The bundle pointer can be NULL, since this function can be called
due to a failed connection attempt, before being added to a bundle */
if(bundle) {
+ CONN_LOCK(conn->data);
bundle_remove_conn(bundle, conn);
- if(bundle->num_connections == 0) {
+ if(bundle->num_connections == 0)
conncache_remove_bundle(connc, bundle);
- }
-
+ CONN_UNLOCK(conn->data);
if(connc) {
connc->num_connections--;
@@ -261,7 +293,8 @@ void Curl_conncache_remove_conn(struct conncache *connc,
Return 0 from func() to continue the loop, return 1 to abort it.
*/
-void Curl_conncache_foreach(struct conncache *connc,
+void Curl_conncache_foreach(struct Curl_easy *data,
+ struct conncache *connc,
void *param,
int (*func)(struct connectdata *conn, void *param))
{
@@ -272,6 +305,7 @@ void Curl_conncache_foreach(struct conncache *connc,
if(!connc)
return;
+ CONN_LOCK(data);
Curl_hash_start_iterate(&connc->hash, &iter);
he = Curl_hash_next_element(&iter);
@@ -288,14 +322,21 @@ void Curl_conncache_foreach(struct conncache *connc,
struct connectdata *conn = curr->ptr;
curr = curr->next;
- if(1 == func(conn, param))
+ if(1 == func(conn, param)) {
+ CONN_UNLOCK(data);
return;
+ }
}
}
+ CONN_UNLOCK(data);
}
/* Return the first connection found in the cache. Used when closing all
- connections */
+ connections.
+
+ NOTE: no locking is done here as this is presumably only done when cleaning
+ up a cache!
+*/
struct connectdata *
Curl_conncache_find_first_connection(struct conncache *connc)
{
@@ -321,6 +362,90 @@ Curl_conncache_find_first_connection(struct conncache *connc)
return NULL;
}
+/*
+ * This function finds the connection in the connection
+ * cache that has been unused for the longest time.
+ *
+ * Returns the pointer to the oldest idle connection, or NULL if none was
+ * found.
+ */
+struct connectdata *
+Curl_conncache_oldest_idle(struct Curl_easy *data)
+{
+ struct conncache *bc = data->state.conn_cache;
+ struct curl_hash_iterator iter;
+ struct curl_llist_element *curr;
+ struct curl_hash_element *he;
+ timediff_t highscore =- 1;
+ timediff_t score;
+ struct curltime now;
+ struct connectdata *conn_candidate = NULL;
+ struct connectbundle *bundle;
+
+ now = Curl_now();
+
+ CONN_LOCK(data);
+ Curl_hash_start_iterate(&bc->hash, &iter);
+
+ he = Curl_hash_next_element(&iter);
+ while(he) {
+ struct connectdata *conn;
+
+ bundle = he->ptr;
+
+ curr = bundle->conn_list.head;
+ while(curr) {
+ conn = curr->ptr;
+
+ if(!conn->inuse) {
+ /* Set higher score for the age passed since the connection was used */
+ score = Curl_timediff(now, conn->now);
+
+ if(score > highscore) {
+ highscore = score;
+ conn_candidate = conn;
+ }
+ }
+ curr = curr->next;
+ }
+
+ he = Curl_hash_next_element(&iter);
+ }
+ CONN_UNLOCK(data);
+
+ return conn_candidate;
+}
+
+void Curl_conncache_close_all_connections(struct conncache *connc)
+{
+ struct connectdata *conn;
+
+ conn = Curl_conncache_find_first_connection(connc);
+ while(conn) {
+ SIGPIPE_VARIABLE(pipe_st);
+ conn->data = connc->closure_handle;
+
+ sigpipe_ignore(conn->data, &pipe_st);
+ conn->data->easy_conn = NULL; /* clear the easy handle's connection
+ pointer */
+ /* This will remove the connection from the cache */
+ connclose(conn, "kill all");
+ (void)Curl_disconnect(conn, FALSE);
+ sigpipe_restore(&pipe_st);
+
+ conn = Curl_conncache_find_first_connection(connc);
+ }
+
+ if(connc->closure_handle) {
+ SIGPIPE_VARIABLE(pipe_st);
+ sigpipe_ignore(connc->closure_handle, &pipe_st);
+
+ Curl_hostcache_clean(connc->closure_handle,
+ connc->closure_handle->dns.hostcache);
+ Curl_close(connc->closure_handle);
+ sigpipe_restore(&pipe_st);
+ }
+}
#if 0
/* Useful for debugging the connection cache */
diff --git a/lib/conncache.h b/lib/conncache.h
index 14be4e8..0d97a6c 100644
--- a/lib/conncache.h
+++ b/lib/conncache.h
@@ -28,6 +28,8 @@ struct conncache {
size_t num_connections;
long next_connection_id;
struct curltime last_cleanup;
+ /* handle used for closing cached connections */
+ struct Curl_easy *closure_handle;
};
#define BUNDLE_NO_MULTIUSE -1
@@ -41,8 +43,8 @@ struct connectbundle {
struct curl_llist conn_list; /* The connectdata members of the bundle */
};
+/* returns 1 on error, 0 is fine */
int Curl_conncache_init(struct conncache *, int size);
-
void Curl_conncache_destroy(struct conncache *connc);
/* return the correct bundle, to a host or a proxy */
@@ -55,7 +57,8 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
void Curl_conncache_remove_conn(struct conncache *connc,
struct connectdata *conn);
-void Curl_conncache_foreach(struct conncache *connc,
+void Curl_conncache_foreach(struct Curl_easy *data,
+ struct conncache *connc,
void *param,
int (*func)(struct connectdata *conn,
void *param));
@@ -63,6 +66,9 @@ void Curl_conncache_foreach(struct conncache *connc,
struct connectdata *
Curl_conncache_find_first_connection(struct conncache *connc);
+struct connectdata *
+Curl_conncache_oldest_idle(struct Curl_easy *data);
+void Curl_conncache_close_all_connections(struct conncache *connc);
void Curl_conncache_print(struct conncache *connc);
#endif /* HEADER_CURL_CONNCACHE_H */
diff --git a/lib/connect.c b/lib/connect.c
index 8d5d32b..3edb71e 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -28,8 +28,10 @@
#ifdef HAVE_SYS_UN_H
#include <sys/un.h> /* for sockaddr_un */
#endif
-#ifdef HAVE_NETINET_TCP_H
-#include <netinet/tcp.h> /* for TCP_NODELAY */
+#ifdef HAVE_LINUX_TCP_H
+#include <linux/tcp.h>
+#elif defined(HAVE_NETINET_TCP_H)
+#include <netinet/tcp.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
@@ -179,12 +181,12 @@ singleipconnect(struct connectdata *conn,
*
* @unittest: 1303
*/
-time_t Curl_timeleft(struct Curl_easy *data,
- struct curltime *nowp,
- bool duringconnect)
+timediff_t Curl_timeleft(struct Curl_easy *data,
+ struct curltime *nowp,
+ bool duringconnect)
{
int timeout_set = 0;
- time_t timeout_ms = duringconnect?DEFAULT_CONNECT_TIMEOUT:0;
+ timediff_t timeout_ms = duringconnect?DEFAULT_CONNECT_TIMEOUT:0;
struct curltime now;
/* if a timeout is set, use the most restrictive one */
@@ -218,17 +220,17 @@ time_t Curl_timeleft(struct Curl_easy *data,
}
if(!nowp) {
- now = Curl_tvnow();
+ now = Curl_now();
nowp = &now;
}
/* subtract elapsed time */
if(duringconnect)
/* since this most recent connect started */
- timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startsingle);
+ timeout_ms -= Curl_timediff(*nowp, data->progress.t_startsingle);
else
/* since the entire operation started */
- timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startop);
+ timeout_ms -= Curl_timediff(*nowp, data->progress.t_startop);
if(!timeout_ms)
/* avoid returning 0 as that means no timeout! */
return -1;
@@ -249,7 +251,7 @@ static CURLcode bindlocal(struct connectdata *conn,
struct sockaddr_in6 *si6 = (struct sockaddr_in6 *)&sa;
#endif
- struct Curl_dns_entry *h=NULL;
+ struct Curl_dns_entry *h = NULL;
unsigned short port = data->set.localport; /* use this port number, 0 for
"random" */
/* how many port numbers to try to bind to, increasing one at a time */
@@ -285,6 +287,34 @@ static CURLcode bindlocal(struct connectdata *conn,
/* interface */
if(!is_host) {
+#ifdef SO_BINDTODEVICE
+ /* I am not sure any other OSs than Linux that provide this feature,
+ * and at the least I cannot test. --Ben
+ *
+ * This feature allows one to tightly bind the local socket to a
+ * particular interface. This will force even requests to other
+ * local interfaces to go out the external interface.
+ *
+ *
+ * Only bind to the interface when specified as interface, not just
+ * as a hostname or ip address.
+ *
+ * interface might be a VRF, eg: vrf-blue, which means it cannot be
+ * converted to an IP address and would fail Curl_if2ip. Simply try
+ * to use it straight away.
+ */
+ if(setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE,
+ dev, (curl_socklen_t)strlen(dev) + 1) == 0) {
+ /* This is typically "errno 1, error: Operation not permitted" if
+ * you're not running as root or another suitable privileged
+ * user.
+ * If it succeeds it means the parameter was a valid interface and
+ * not an IP address. Return immediately.
+ */
+ return CURLE_OK;
+ }
+#endif
+
switch(Curl_if2ip(af, scope, conn->scope_id, dev,
myhost, sizeof(myhost))) {
case IF2IP_NOT_FOUND:
@@ -305,30 +335,6 @@ static CURLcode bindlocal(struct connectdata *conn,
infof(data, "Local Interface %s is ip %s using address family %i\n",
dev, myhost, af);
done = 1;
-
-#ifdef SO_BINDTODEVICE
- /* I am not sure any other OSs than Linux that provide this feature,
- * and at the least I cannot test. --Ben
- *
- * This feature allows one to tightly bind the local socket to a
- * particular interface. This will force even requests to other
- * local interfaces to go out the external interface.
- *
- *
- * Only bind to the interface when specified as interface, not just
- * as a hostname or ip address.
- */
- if(setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE,
- dev, (curl_socklen_t)strlen(dev)+1) != 0) {
- error = SOCKERRNO;
- infof(data, "SO_BINDTODEVICE %s failed with errno %d: %s;"
- " will do regular bind\n",
- dev, error, Curl_strerror(conn, error));
- /* This is typically "errno 1, error: Operation not permitted" if
- you're not running as root or another suitable privileged
- user */
- }
-#endif
break;
}
}
@@ -408,6 +414,10 @@ static CURLcode bindlocal(struct connectdata *conn,
}
if(done < 1) {
+ /* errorbuf is set false so failf will overwrite any message already in
+ the error buffer, so the user receives this error message instead of a
+ generic resolve error. */
+ data->state.errorbuf = FALSE;
failf(data, "Couldn't bind to '%s'", dev);
return CURLE_INTERFACE_FAILED;
}
@@ -721,7 +731,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
{
struct Curl_easy *data = conn->data;
CURLcode result = CURLE_OK;
- time_t allow;
+ timediff_t allow;
int error = 0;
struct curltime now;
int rc;
@@ -737,7 +747,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OK;
}
- now = Curl_tvnow();
+ now = Curl_now();
/* figure out how long time we have left to connect */
allow = Curl_timeleft(data, &now, TRUE);
@@ -748,7 +758,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OPERATION_TIMEDOUT;
}
- for(i=0; i<2; i++) {
+ for(i = 0; i<2; i++) {
const int other = i ^ 1;
if(conn->tempsock[i] == CURL_SOCKET_BAD)
continue;
@@ -765,7 +775,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
if(rc == 0) { /* no connection yet */
error = 0;
- if(curlx_tvdiff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
+ if(Curl_timediff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
infof(data, "After %ldms connect time, move on!\n",
conn->timeoutms_per_addr);
error = ETIMEDOUT;
@@ -773,7 +783,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
/* should we try another protocol family? */
if(i == 0 && conn->tempaddr[1] == NULL &&
- curlx_tvdiff(now, conn->connecttime) >= HAPPY_EYEBALLS_TIMEOUT) {
+ Curl_timediff(now, conn->connecttime) >= HAPPY_EYEBALLS_TIMEOUT) {
trynextip(conn, sockindex, 1);
}
}
@@ -785,6 +795,9 @@ CURLcode Curl_is_connected(struct connectdata *conn,
conn->sock[sockindex] = conn->tempsock[i];
conn->ip_addr = conn->tempaddr[i];
conn->tempsock[i] = CURL_SOCKET_BAD;
+#ifdef ENABLE_IPV6
+ conn->bits.ipv6 = (conn->ip_addr->ai_family == AF_INET6)?TRUE:FALSE;
+#endif
/* close the other socket, if open */
if(conn->tempsock[other] != CURL_SOCKET_BAD) {
@@ -900,7 +913,7 @@ void Curl_tcpnodelay(struct connectdata *conn, curl_socket_t sockfd)
static void nosigpipe(struct connectdata *conn,
curl_socket_t sockfd)
{
- struct Curl_easy *data= conn->data;
+ struct Curl_easy *data = conn->data;
int onoff = 1;
if(setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&onoff,
sizeof(onoff)) < 0)
@@ -978,6 +991,9 @@ static CURLcode singleipconnect(struct connectdata *conn,
char ipaddress[MAX_IPADR_LEN];
long port;
bool is_tcp;
+#ifdef TCP_FASTOPEN_CONNECT
+ int optval = 1;
+#endif
*sockp = CURL_SOCKET_BAD;
@@ -1051,25 +1067,45 @@ static CURLcode singleipconnect(struct connectdata *conn,
/* set socket non-blocking */
(void)curlx_nonblock(sockfd, TRUE);
- conn->connecttime = Curl_tvnow();
+ conn->connecttime = Curl_now();
if(conn->num_addr > 1)
Curl_expire(data, conn->timeoutms_per_addr, EXPIRE_DNS_PER_NAME);
/* Connect TCP sockets, bind UDP */
if(!isconnected && (conn->socktype == SOCK_STREAM)) {
if(conn->bits.tcp_fastopen) {
-#if defined(CONNECT_DATA_IDEMPOTENT) /* OS X */
- sa_endpoints_t endpoints;
- endpoints.sae_srcif = 0;
- endpoints.sae_srcaddr = NULL;
- endpoints.sae_srcaddrlen = 0;
- endpoints.sae_dstaddr = &addr.sa_addr;
- endpoints.sae_dstaddrlen = addr.addrlen;
-
- rc = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY,
- CONNECT_RESUME_ON_READ_WRITE | CONNECT_DATA_IDEMPOTENT,
- NULL, 0, NULL, NULL);
-#elif defined(MSG_FASTOPEN) /* Linux */
+#if defined(CONNECT_DATA_IDEMPOTENT) /* Darwin */
+# if defined(HAVE_BUILTIN_AVAILABLE)
+ /* while connectx function is available since macOS 10.11 / iOS 9,
+ it did not have the interface declared correctly until
+ Xcode 9 / macOS SDK 10.13 */
+ if(__builtin_available(macOS 10.11, iOS 9.0, tvOS 9.0, watchOS 2.0, *)) {
+ sa_endpoints_t endpoints;
+ endpoints.sae_srcif = 0;
+ endpoints.sae_srcaddr = NULL;
+ endpoints.sae_srcaddrlen = 0;
+ endpoints.sae_dstaddr = &addr.sa_addr;
+ endpoints.sae_dstaddrlen = addr.addrlen;
+
+ rc = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY,
+ CONNECT_RESUME_ON_READ_WRITE | CONNECT_DATA_IDEMPOTENT,
+ NULL, 0, NULL, NULL);
+ }
+ else {
+ rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
+ }
+# else
+ rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
+# endif /* HAVE_BUILTIN_AVAILABLE */
+#elif defined(TCP_FASTOPEN_CONNECT) /* Linux >= 4.11 */
+ if(setsockopt(sockfd, IPPROTO_TCP, TCP_FASTOPEN_CONNECT,
+ (void *)&optval, sizeof(optval)) < 0)
+ infof(data, "Failed to enable TCP Fast Open on fd %d\n", sockfd);
+ else
+ infof(data, "TCP_FASTOPEN_CONNECT set\n");
+
+ rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
+#elif defined(MSG_FASTOPEN) /* old Linux */
if(conn->given->flags & PROTOPT_SSL)
rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
else
@@ -1088,10 +1124,6 @@ static CURLcode singleipconnect(struct connectdata *conn,
return CURLE_OK;
}
-#ifdef ENABLE_IPV6
- conn->bits.ipv6 = (addr.family == AF_INET6)?TRUE:FALSE;
-#endif
-
if(-1 == rc) {
switch(error) {
case EINPROGRESS:
@@ -1136,10 +1168,10 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
const struct Curl_dns_entry *remotehost)
{
struct Curl_easy *data = conn->data;
- struct curltime before = Curl_tvnow();
+ struct curltime before = Curl_now();
CURLcode result = CURLE_COULDNT_CONNECT;
- time_t timeout_ms = Curl_timeleft(data, &before, TRUE);
+ timediff_t timeout_ms = Curl_timeleft(data, &before, TRUE);
if(timeout_ms < 0) {
/* a precaution, no need to continue if time already is up */
@@ -1152,7 +1184,6 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
conn->tempaddr[1] = NULL;
conn->tempsock[0] = CURL_SOCKET_BAD;
conn->tempsock[1] = CURL_SOCKET_BAD;
- Curl_expire(conn->data, HAPPY_EYEBALLS_TIMEOUT, EXPIRE_HAPPY_EYEBALLS);
/* Max time for the next connection attempt */
conn->timeoutms_per_addr =
@@ -1173,6 +1204,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
}
data->info.numconnects++; /* to track the number of connections made */
+ Curl_expire(conn->data, HAPPY_EYEBALLS_TIMEOUT, EXPIRE_HAPPY_EYEBALLS);
return CURLE_OK;
}
@@ -1216,7 +1248,7 @@ curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
find.tofind = data->state.lastconnect;
find.found = FALSE;
- Curl_conncache_foreach(data->multi_easy?
+ Curl_conncache_foreach(data, data->multi_easy?
&data->multi_easy->conn_cache:
&data->multi->conn_cache, &find, conn_is_conn);
@@ -1324,7 +1356,7 @@ CURLcode Curl_socket(struct connectdata *conn,
addr->family = ai->ai_family;
addr->socktype = conn->socktype;
- addr->protocol = conn->socktype==SOCK_DGRAM?IPPROTO_UDP:ai->ai_protocol;
+ addr->protocol = conn->socktype == SOCK_DGRAM?IPPROTO_UDP:ai->ai_protocol;
addr->addrlen = ai->ai_addrlen;
if(addr->addrlen > sizeof(struct Curl_sockaddr_storage))
diff --git a/lib/connect.h b/lib/connect.h
index 3f05c39..3974486 100644
--- a/lib/connect.h
+++ b/lib/connect.h
@@ -25,6 +25,7 @@
#include "nonblock.h" /* for curlx_nonblock(), formerly Curl_nonblock() */
#include "sockaddr.h"
+#include "timeval.h"
CURLcode Curl_is_connected(struct connectdata *conn,
int sockindex,
@@ -35,9 +36,9 @@ CURLcode Curl_connecthost(struct connectdata *conn,
/* generic function that returns how much time there's left to run, according
to the timeouts set */
-time_t Curl_timeleft(struct Curl_easy *data,
- struct curltime *nowp,
- bool duringconnect);
+timediff_t Curl_timeleft(struct Curl_easy *data,
+ struct curltime *nowp,
+ bool duringconnect);
#define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */
#define HAPPY_EYEBALLS_TIMEOUT 200 /* milliseconds to wait between
diff --git a/lib/content_encoding.c b/lib/content_encoding.c
index 652ed97..3d06137 100644
--- a/lib/content_encoding.c
+++ b/lib/content_encoding.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,22 +22,43 @@
#include "curl_setup.h"
-#ifdef HAVE_LIBZ
-
#include "urldata.h"
#include <curl/curl.h>
+#include <stddef.h>
+
+#ifdef HAVE_ZLIB_H
+#include <zlib.h>
+#ifdef __SYMBIAN32__
+/* zlib pollutes the namespace with this definition */
+#undef WIN32
+#endif
+#endif
+
+#ifdef HAVE_BROTLI
+#include <brotli/decode.h>
+#endif
+
#include "sendf.h"
+#include "http.h"
#include "content_encoding.h"
#include "strdup.h"
+#include "strcase.h"
#include "curl_memory.h"
#include "memdebug.h"
+#define CONTENT_ENCODING_DEFAULT "identity"
+
+#ifndef CURL_DISABLE_HTTP
+
+#define DSIZ CURL_MAX_WRITE_SIZE /* buffer size for decompressed data */
+
+
+#ifdef HAVE_LIBZ
+
/* Comment this out if zlib is always going to be at least ver. 1.2.0.4
(doing so will reduce code size slightly). */
#define OLD_ZLIB_SUPPORT 1
-#define DSIZ CURL_MAX_WRITE_SIZE /* buffer size for decompressed data */
-
#define GZIP_MAGIC_0 0x1f
#define GZIP_MAGIC_1 0x8b
@@ -49,6 +70,21 @@
#define COMMENT 0x10 /* bit 4 set: file comment present */
#define RESERVED 0xE0 /* bits 5..7: reserved */
+typedef enum {
+ ZLIB_UNINIT, /* uninitialized */
+ ZLIB_INIT, /* initialized */
+ ZLIB_GZIP_HEADER, /* reading gzip header */
+ ZLIB_GZIP_INFLATING, /* inflating gzip stream */
+ ZLIB_INIT_GZIP /* initialized in transparent gzip mode */
+} zlibInitState;
+
+/* Writer parameters. */
+typedef struct {
+ zlibInitState zlib_init; /* zlib init state */
+ z_stream z; /* State structure for zlib. */
+} zlib_params;
+
+
static voidpf
zalloc_cb(voidpf opaque, unsigned int items, unsigned int size)
{
@@ -79,19 +115,27 @@ process_zlib_error(struct connectdata *conn, z_stream *z)
}
static CURLcode
-exit_zlib(z_stream *z, zlibInitState *zlib_init, CURLcode result)
+exit_zlib(struct connectdata *conn,
+ z_stream *z, zlibInitState *zlib_init, CURLcode result)
{
- inflateEnd(z);
- *zlib_init = ZLIB_UNINIT;
+ if(*zlib_init == ZLIB_GZIP_HEADER)
+ Curl_safefree(z->next_in);
+
+ if(*zlib_init != ZLIB_UNINIT) {
+ if(inflateEnd(z) != Z_OK && result == CURLE_OK)
+ result = process_zlib_error(conn, z);
+ *zlib_init = ZLIB_UNINIT;
+ }
+
return result;
}
static CURLcode
-inflate_stream(struct connectdata *conn,
- struct SingleRequest *k)
+inflate_stream(struct connectdata *conn, contenc_writer *writer)
{
+ zlib_params *zp = (zlib_params *) &writer->params;
int allow_restart = 1;
- z_stream *z = &k->z; /* zlib state structure */
+ z_stream *z = &zp->z; /* zlib state structure */
uInt nread = z->avail_in;
Bytef *orig_in = z->next_in;
int status; /* zlib status */
@@ -102,44 +146,42 @@ inflate_stream(struct connectdata *conn,
large to hold on the stack */
decomp = malloc(DSIZ);
if(decomp == NULL) {
- return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
+ return exit_zlib(conn, z, &zp->zlib_init, CURLE_OUT_OF_MEMORY);
}
/* because the buffer size is fixed, iteratively decompress and transfer to
the client via client_write. */
for(;;) {
+ if(z->avail_in == 0) {
+ free(decomp);
+ return result;
+ }
+
/* (re)set buffer for decompressed output for every iteration */
- z->next_out = (Bytef *)decomp;
+ z->next_out = (Bytef *) decomp;
z->avail_out = DSIZ;
status = inflate(z, Z_SYNC_FLUSH);
if(status == Z_OK || status == Z_STREAM_END) {
allow_restart = 0;
- if((DSIZ - z->avail_out) && (!k->ignorebody)) {
- result = Curl_client_write(conn, CLIENTWRITE_BODY, decomp,
+ result = Curl_unencode_write(conn, writer->downstream, decomp,
DSIZ - z->avail_out);
- /* if !CURLE_OK, clean up, return */
- if(result) {
- free(decomp);
- return exit_zlib(z, &k->zlib_init, result);
- }
+ /* if !CURLE_OK, clean up, return */
+ if(result) {
+ free(decomp);
+ return exit_zlib(conn, z, &zp->zlib_init, result);
}
/* Done? clean up, return */
if(status == Z_STREAM_END) {
free(decomp);
- if(inflateEnd(z) == Z_OK)
- return exit_zlib(z, &k->zlib_init, result);
- return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
+ return exit_zlib(conn, z, &zp->zlib_init, result);
}
/* Done with these bytes, exit */
/* status is always Z_OK at this point! */
- if(z->avail_in == 0) {
- free(decomp);
- return result;
- }
+ continue;
}
else if(allow_restart && status == Z_DATA_ERROR) {
/* some servers seem to not generate zlib headers, so this is an attempt
@@ -148,7 +190,8 @@ inflate_stream(struct connectdata *conn,
(void) inflateEnd(z); /* don't care about the return code */
if(inflateInit2(z, -MAX_WBITS) != Z_OK) {
free(decomp);
- return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
+ zp->zlib_init = ZLIB_UNINIT; /* inflateEnd() already called. */
+ return exit_zlib(conn, z, &zp->zlib_init, process_zlib_error(conn, z));
}
z->next_in = orig_in;
z->avail_in = nread;
@@ -157,36 +200,97 @@ inflate_stream(struct connectdata *conn,
}
else { /* Error; exit loop, handle below */
free(decomp);
- return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
+ return exit_zlib(conn, z, &zp->zlib_init, process_zlib_error(conn, z));
}
}
- /* Will never get here */
+ /* UNREACHED */
}
-CURLcode
-Curl_unencode_deflate_write(struct connectdata *conn,
- struct SingleRequest *k,
- ssize_t nread)
+
+/* Deflate handler. */
+static CURLcode deflate_init_writer(struct connectdata *conn,
+ contenc_writer *writer)
{
- z_stream *z = &k->z; /* zlib state structure */
+ zlib_params *zp = (zlib_params *) &writer->params;
+ z_stream *z = &zp->z; /* zlib state structure */
- /* Initialize zlib? */
- if(k->zlib_init == ZLIB_UNINIT) {
- memset(z, 0, sizeof(z_stream));
- z->zalloc = (alloc_func)zalloc_cb;
- z->zfree = (free_func)zfree_cb;
+ if(!writer->downstream)
+ return CURLE_WRITE_ERROR;
- if(inflateInit(z) != Z_OK)
- return process_zlib_error(conn, z);
- k->zlib_init = ZLIB_INIT;
- }
+ /* Initialize zlib */
+ z->zalloc = (alloc_func) zalloc_cb;
+ z->zfree = (free_func) zfree_cb;
+
+ if(inflateInit(z) != Z_OK)
+ return process_zlib_error(conn, z);
+ zp->zlib_init = ZLIB_INIT;
+ return CURLE_OK;
+}
+
+static CURLcode deflate_unencode_write(struct connectdata *conn,
+ contenc_writer *writer,
+ const char *buf, size_t nbytes)
+{
+ zlib_params *zp = (zlib_params *) &writer->params;
+ z_stream *z = &zp->z; /* zlib state structure */
/* Set the compressed input when this function is called */
- z->next_in = (Bytef *)k->str;
- z->avail_in = (uInt)nread;
+ z->next_in = (Bytef *) buf;
+ z->avail_in = (uInt) nbytes;
/* Now uncompress the data */
- return inflate_stream(conn, k);
+ return inflate_stream(conn, writer);
+}
+
+static void deflate_close_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ zlib_params *zp = (zlib_params *) &writer->params;
+ z_stream *z = &zp->z; /* zlib state structure */
+
+ exit_zlib(conn, z, &zp->zlib_init, CURLE_OK);
+}
+
+static const content_encoding deflate_encoding = {
+ "deflate",
+ NULL,
+ deflate_init_writer,
+ deflate_unencode_write,
+ deflate_close_writer,
+ sizeof(zlib_params)
+};
+
+
+/* Gzip handler. */
+static CURLcode gzip_init_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ zlib_params *zp = (zlib_params *) &writer->params;
+ z_stream *z = &zp->z; /* zlib state structure */
+
+ if(!writer->downstream)
+ return CURLE_WRITE_ERROR;
+
+ /* Initialize zlib */
+ z->zalloc = (alloc_func) zalloc_cb;
+ z->zfree = (free_func) zfree_cb;
+
+ if(strcmp(zlibVersion(), "1.2.0.4") >= 0) {
+ /* zlib ver. >= 1.2.0.4 supports transparent gzip decompressing */
+ if(inflateInit2(z, MAX_WBITS + 32) != Z_OK) {
+ return process_zlib_error(conn, z);
+ }
+ zp->zlib_init = ZLIB_INIT_GZIP; /* Transparent gzip decompress state */
+ }
+ else {
+ /* we must parse the gzip header ourselves */
+ if(inflateInit2(z, -MAX_WBITS) != Z_OK) {
+ return process_zlib_error(conn, z);
+ }
+ zp->zlib_init = ZLIB_INIT; /* Initial call state */
+ }
+
+ return CURLE_OK;
}
#ifdef OLD_ZLIB_SUPPORT
@@ -227,7 +331,7 @@ static enum {
extra_len = (data[1] << 8) | data[0];
- if(len < (extra_len+2))
+ if(len < (extra_len + 2))
return GZIP_UNDERFLOW;
len -= (extra_len + 2);
@@ -273,47 +377,25 @@ static enum {
}
#endif
-CURLcode
-Curl_unencode_gzip_write(struct connectdata *conn,
- struct SingleRequest *k,
- ssize_t nread)
+static CURLcode gzip_unencode_write(struct connectdata *conn,
+ contenc_writer *writer,
+ const char *buf, size_t nbytes)
{
- z_stream *z = &k->z; /* zlib state structure */
-
- /* Initialize zlib? */
- if(k->zlib_init == ZLIB_UNINIT) {
- memset(z, 0, sizeof(z_stream));
- z->zalloc = (alloc_func)zalloc_cb;
- z->zfree = (free_func)zfree_cb;
-
- if(strcmp(zlibVersion(), "1.2.0.4") >= 0) {
- /* zlib ver. >= 1.2.0.4 supports transparent gzip decompressing */
- if(inflateInit2(z, MAX_WBITS+32) != Z_OK) {
- return process_zlib_error(conn, z);
- }
- k->zlib_init = ZLIB_INIT_GZIP; /* Transparent gzip decompress state */
- }
- else {
- /* we must parse the gzip header ourselves */
- if(inflateInit2(z, -MAX_WBITS) != Z_OK) {
- return process_zlib_error(conn, z);
- }
- k->zlib_init = ZLIB_INIT; /* Initial call state */
- }
- }
+ zlib_params *zp = (zlib_params *) &writer->params;
+ z_stream *z = &zp->z; /* zlib state structure */
- if(k->zlib_init == ZLIB_INIT_GZIP) {
+ if(zp->zlib_init == ZLIB_INIT_GZIP) {
/* Let zlib handle the gzip decompression entirely */
- z->next_in = (Bytef *)k->str;
- z->avail_in = (uInt)nread;
+ z->next_in = (Bytef *) buf;
+ z->avail_in = (uInt) nbytes;
/* Now uncompress the data */
- return inflate_stream(conn, k);
+ return inflate_stream(conn, writer);
}
#ifndef OLD_ZLIB_SUPPORT
/* Support for old zlib versions is compiled away and we are running with
an old version, so return an error. */
- return exit_zlib(z, &k->zlib_init, CURLE_WRITE_ERROR);
+ return exit_zlib(conn, z, &zp->zlib_init, CURLE_WRITE_ERROR);
#else
/* This next mess is to get around the potential case where there isn't
@@ -326,18 +408,18 @@ Curl_unencode_gzip_write(struct connectdata *conn,
* can handle the gzip header themselves.
*/
- switch(k->zlib_init) {
+ switch(zp->zlib_init) {
/* Skip over gzip header? */
case ZLIB_INIT:
{
/* Initial call state */
ssize_t hlen;
- switch(check_gzip_header((unsigned char *)k->str, nread, &hlen)) {
+ switch(check_gzip_header((unsigned char *) buf, nbytes, &hlen)) {
case GZIP_OK:
- z->next_in = (Bytef *)k->str + hlen;
- z->avail_in = (uInt)(nread - hlen);
- k->zlib_init = ZLIB_GZIP_INFLATING; /* Inflating stream state */
+ z->next_in = (Bytef *) buf + hlen;
+ z->avail_in = (uInt) (nbytes - hlen);
+ zp->zlib_init = ZLIB_GZIP_INFLATING; /* Inflating stream state */
break;
case GZIP_UNDERFLOW:
@@ -348,19 +430,19 @@ Curl_unencode_gzip_write(struct connectdata *conn,
* the first place, and it's even more unlikely for a transfer to fail
* immediately afterwards, it should seldom be a problem.
*/
- z->avail_in = (uInt)nread;
+ z->avail_in = (uInt) nbytes;
z->next_in = malloc(z->avail_in);
if(z->next_in == NULL) {
- return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
+ return exit_zlib(conn, z, &zp->zlib_init, CURLE_OUT_OF_MEMORY);
}
- memcpy(z->next_in, k->str, z->avail_in);
- k->zlib_init = ZLIB_GZIP_HEADER; /* Need more gzip header data state */
+ memcpy(z->next_in, buf, z->avail_in);
+ zp->zlib_init = ZLIB_GZIP_HEADER; /* Need more gzip header data state */
/* We don't have any data to inflate yet */
return CURLE_OK;
case GZIP_BAD:
default:
- return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
+ return exit_zlib(conn, z, &zp->zlib_init, process_zlib_error(conn, z));
}
}
@@ -370,22 +452,22 @@ Curl_unencode_gzip_write(struct connectdata *conn,
{
/* Need more gzip header data state */
ssize_t hlen;
- z->avail_in += (uInt)nread;
+ z->avail_in += (uInt) nbytes;
z->next_in = Curl_saferealloc(z->next_in, z->avail_in);
if(z->next_in == NULL) {
- return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
+ return exit_zlib(conn, z, &zp->zlib_init, CURLE_OUT_OF_MEMORY);
}
/* Append the new block of data to the previous one */
- memcpy(z->next_in + z->avail_in - nread, k->str, nread);
+ memcpy(z->next_in + z->avail_in - nbytes, buf, nbytes);
switch(check_gzip_header(z->next_in, z->avail_in, &hlen)) {
case GZIP_OK:
/* This is the zlib stream data */
free(z->next_in);
/* Don't point into the malloced block since we just freed it */
- z->next_in = (Bytef *)k->str + hlen + nread - z->avail_in;
- z->avail_in = (uInt)(z->avail_in - hlen);
- k->zlib_init = ZLIB_GZIP_INFLATING; /* Inflating stream state */
+ z->next_in = (Bytef *) buf + hlen + nbytes - z->avail_in;
+ z->avail_in = (uInt) (z->avail_in - hlen);
+ zp->zlib_init = ZLIB_GZIP_INFLATING; /* Inflating stream state */
break;
case GZIP_UNDERFLOW:
@@ -394,8 +476,7 @@ Curl_unencode_gzip_write(struct connectdata *conn,
case GZIP_BAD:
default:
- free(z->next_in);
- return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
+ return exit_zlib(conn, z, &zp->zlib_init, process_zlib_error(conn, z));
}
}
@@ -404,8 +485,8 @@ Curl_unencode_gzip_write(struct connectdata *conn,
case ZLIB_GZIP_INFLATING:
default:
/* Inflating stream state */
- z->next_in = (Bytef *)k->str;
- z->avail_in = (uInt)nread;
+ z->next_in = (Bytef *) buf;
+ z->avail_in = (uInt) nbytes;
break;
}
@@ -415,17 +496,465 @@ Curl_unencode_gzip_write(struct connectdata *conn,
}
/* We've parsed the header, now uncompress the data */
- return inflate_stream(conn, k);
+ return inflate_stream(conn, writer);
#endif
}
+static void gzip_close_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ zlib_params *zp = (zlib_params *) &writer->params;
+ z_stream *z = &zp->z; /* zlib state structure */
+
+ exit_zlib(conn, z, &zp->zlib_init, CURLE_OK);
+}
+
+static const content_encoding gzip_encoding = {
+ "gzip",
+ "x-gzip",
+ gzip_init_writer,
+ gzip_unencode_write,
+ gzip_close_writer,
+ sizeof(zlib_params)
+};
+
+#endif /* HAVE_LIBZ */
+
+
+#ifdef HAVE_BROTLI
+
+/* Writer parameters. */
+typedef struct {
+ BrotliDecoderState *br; /* State structure for brotli. */
+} brotli_params;
+
+
+static CURLcode brotli_map_error(BrotliDecoderErrorCode be)
+{
+ switch(be) {
+ case BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:
+ case BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:
+ case BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:
+ case BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:
+ case BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:
+ case BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:
+ case BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:
+ case BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:
+ case BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:
+ case BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:
+ case BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:
+ case BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:
+ case BROTLI_DECODER_ERROR_FORMAT_PADDING_1:
+ case BROTLI_DECODER_ERROR_FORMAT_PADDING_2:
+ case BROTLI_DECODER_ERROR_COMPOUND_DICTIONARY:
+ case BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:
+ case BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:
+ return CURLE_BAD_CONTENT_ENCODING;
+ case BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:
+ case BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:
+ case BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:
+ case BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:
+ case BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:
+ case BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:
+ return CURLE_OUT_OF_MEMORY;
+ default:
+ break;
+ }
+ return CURLE_WRITE_ERROR;
+}
+
+static CURLcode brotli_init_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ brotli_params *bp = (brotli_params *) &writer->params;
+
+ (void) conn;
+
+ if(!writer->downstream)
+ return CURLE_WRITE_ERROR;
+
+ bp->br = BrotliDecoderCreateInstance(NULL, NULL, NULL);
+ return bp->br? CURLE_OK: CURLE_OUT_OF_MEMORY;
+}
+
+static CURLcode brotli_unencode_write(struct connectdata *conn,
+ contenc_writer *writer,
+ const char *buf, size_t nbytes)
+{
+ brotli_params *bp = (brotli_params *) &writer->params;
+ const uint8_t *src = (const uint8_t *) buf;
+ char *decomp;
+ uint8_t *dst;
+ size_t dstleft;
+ CURLcode result = CURLE_OK;
+
+ if(!bp->br)
+ return CURLE_WRITE_ERROR; /* Stream already ended. */
+
+ decomp = malloc(DSIZ);
+ if(!decomp)
+ return CURLE_OUT_OF_MEMORY;
+
+ while(nbytes && result == CURLE_OK) {
+ BrotliDecoderResult r;
+
+ dst = (uint8_t *) decomp;
+ dstleft = DSIZ;
+ r = BrotliDecoderDecompressStream(bp->br,
+ &nbytes, &src, &dstleft, &dst, NULL);
+ result = Curl_unencode_write(conn, writer->downstream,
+ decomp, DSIZ - dstleft);
+ if(result)
+ break;
+ switch(r) {
+ case BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:
+ case BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:
+ break;
+ case BROTLI_DECODER_RESULT_SUCCESS:
+ BrotliDecoderDestroyInstance(bp->br);
+ bp->br = NULL;
+ if(nbytes)
+ result = CURLE_WRITE_ERROR;
+ break;
+ default:
+ result = brotli_map_error(BrotliDecoderGetErrorCode(bp->br));
+ break;
+ }
+ }
+ free(decomp);
+ return result;
+}
+
+static void brotli_close_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ brotli_params *bp = (brotli_params *) &writer->params;
+
+ (void) conn;
+
+ if(bp->br) {
+ BrotliDecoderDestroyInstance(bp->br);
+ bp->br = NULL;
+ }
+}
+
+static const content_encoding brotli_encoding = {
+ "br",
+ NULL,
+ brotli_init_writer,
+ brotli_unencode_write,
+ brotli_close_writer,
+ sizeof(brotli_params)
+};
+#endif
+
+
+/* Identity handler. */
+static CURLcode identity_init_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ (void) conn;
+ return writer->downstream? CURLE_OK: CURLE_WRITE_ERROR;
+}
+
+static CURLcode identity_unencode_write(struct connectdata *conn,
+ contenc_writer *writer,
+ const char *buf, size_t nbytes)
+{
+ return Curl_unencode_write(conn, writer->downstream, buf, nbytes);
+}
+
+static void identity_close_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ (void) conn;
+ (void) writer;
+}
+
+static const content_encoding identity_encoding = {
+ "identity",
+ NULL,
+ identity_init_writer,
+ identity_unencode_write,
+ identity_close_writer,
+ 0
+};
+
+
+/* supported content encodings table. */
+static const content_encoding * const encodings[] = {
+ &identity_encoding,
+#ifdef HAVE_LIBZ
+ &deflate_encoding,
+ &gzip_encoding,
+#endif
+#ifdef HAVE_BROTLI
+ &brotli_encoding,
+#endif
+ NULL
+};
+
+
+/* Return a list of comma-separated names of supported encodings. */
+char *Curl_all_content_encodings(void)
+{
+ size_t len = 0;
+ const content_encoding * const *cep;
+ const content_encoding *ce;
+ char *ace;
+ char *p;
+
+ for(cep = encodings; *cep; cep++) {
+ ce = *cep;
+ if(!strcasecompare(ce->name, CONTENT_ENCODING_DEFAULT))
+ len += strlen(ce->name) + 2;
+ }
+
+ if(!len)
+ return strdup(CONTENT_ENCODING_DEFAULT);
+
+ ace = malloc(len);
+ if(ace) {
+ p = ace;
+ for(cep = encodings; *cep; cep++) {
+ ce = *cep;
+ if(!strcasecompare(ce->name, CONTENT_ENCODING_DEFAULT)) {
+ strcpy(p, ce->name);
+ p += strlen(p);
+ *p++ = ',';
+ *p++ = ' ';
+ }
+ }
+ p[-2] = '\0';
+ }
+
+ return ace;
+}
+
+
+/* Real client writer: no downstream. */
+static CURLcode client_init_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ (void) conn;
+ return writer->downstream? CURLE_WRITE_ERROR: CURLE_OK;
+}
+
+static CURLcode client_unencode_write(struct connectdata *conn,
+ contenc_writer *writer,
+ const char *buf, size_t nbytes)
+{
+ struct Curl_easy *data = conn->data;
+ struct SingleRequest *k = &data->req;
+
+ (void) writer;
+
+ if(!nbytes || k->ignorebody)
+ return CURLE_OK;
+
+ return Curl_client_write(conn, CLIENTWRITE_BODY, (char *) buf, nbytes);
+}
+
+static void client_close_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ (void) conn;
+ (void) writer;
+}
+
+static const content_encoding client_encoding = {
+ NULL,
+ NULL,
+ client_init_writer,
+ client_unencode_write,
+ client_close_writer,
+ 0
+};
+
+
+/* Deferred error dummy writer. */
+static CURLcode error_init_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ (void) conn;
+ return writer->downstream? CURLE_OK: CURLE_WRITE_ERROR;
+}
+
+static CURLcode error_unencode_write(struct connectdata *conn,
+ contenc_writer *writer,
+ const char *buf, size_t nbytes)
+{
+ char *all = Curl_all_content_encodings();
+
+ (void) writer;
+ (void) buf;
+ (void) nbytes;
+
+ if(!all)
+ return CURLE_OUT_OF_MEMORY;
+ failf(conn->data, "Unrecognized content encoding type. "
+ "libcurl understands %s content encodings.", all);
+ free(all);
+ return CURLE_BAD_CONTENT_ENCODING;
+}
+
+static void error_close_writer(struct connectdata *conn,
+ contenc_writer *writer)
+{
+ (void) conn;
+ (void) writer;
+}
+
+static const content_encoding error_encoding = {
+ NULL,
+ NULL,
+ error_init_writer,
+ error_unencode_write,
+ error_close_writer,
+ 0
+};
+
+/* Create an unencoding writer stage using the given handler. */
+static contenc_writer *new_unencoding_writer(struct connectdata *conn,
+ const content_encoding *handler,
+ contenc_writer *downstream)
+{
+ size_t sz = offsetof(contenc_writer, params) + handler->paramsize;
+ contenc_writer *writer = (contenc_writer *) malloc(sz);
+
+ if(writer) {
+ memset(writer, 0, sz);
+ writer->handler = handler;
+ writer->downstream = downstream;
+ if(handler->init_writer(conn, writer)) {
+ free(writer);
+ writer = NULL;
+ }
+ }
+
+ return writer;
+}
+
+/* Write data using an unencoding writer stack. */
+CURLcode Curl_unencode_write(struct connectdata *conn, contenc_writer *writer,
+ const char *buf, size_t nbytes)
+{
+ if(!nbytes)
+ return CURLE_OK;
+ return writer->handler->unencode_write(conn, writer, buf, nbytes);
+}
+
+/* Close and clean-up the connection's writer stack. */
void Curl_unencode_cleanup(struct connectdata *conn)
{
struct Curl_easy *data = conn->data;
struct SingleRequest *k = &data->req;
- z_stream *z = &k->z;
- if(k->zlib_init != ZLIB_UNINIT)
- (void) exit_zlib(z, &k->zlib_init, CURLE_OK);
+ contenc_writer *writer = k->writer_stack;
+
+ while(writer) {
+ k->writer_stack = writer->downstream;
+ writer->handler->close_writer(conn, writer);
+ free(writer);
+ writer = k->writer_stack;
+ }
}
-#endif /* HAVE_LIBZ */
+/* Find the content encoding by name. */
+static const content_encoding *find_encoding(const char *name, size_t len)
+{
+ const content_encoding * const *cep;
+ const content_encoding *ce;
+
+ for(cep = encodings; *cep; cep++) {
+ ce = *cep;
+ if((strncasecompare(name, ce->name, len) && !ce->name[len]) ||
+ (ce->alias && strncasecompare(name, ce->alias, len) && !ce->alias[len]))
+ return ce;
+ }
+ return NULL;
+}
+
+/* Set-up the unencoding stack from the Content-Encoding header value.
+ * See RFC 7231 section 3.1.2.2. */
+CURLcode Curl_build_unencoding_stack(struct connectdata *conn,
+ const char *enclist, int maybechunked)
+{
+ struct Curl_easy *data = conn->data;
+ struct SingleRequest *k = &data->req;
+
+ do {
+ const char *name;
+ size_t namelen;
+
+ /* Parse a single encoding name. */
+ while(ISSPACE(*enclist) || *enclist == ',')
+ enclist++;
+
+ name = enclist;
+
+ for(namelen = 0; *enclist && *enclist != ','; enclist++)
+ if(!ISSPACE(*enclist))
+ namelen = enclist - name + 1;
+
+ /* Special case: chunked encoding is handled at the reader level. */
+ if(maybechunked && namelen == 7 && strncasecompare(name, "chunked", 7)) {
+ k->chunk = TRUE; /* chunks coming our way. */
+ Curl_httpchunk_init(conn); /* init our chunky engine. */
+ }
+ else if(namelen) {
+ const content_encoding *encoding = find_encoding(name, namelen);
+ contenc_writer *writer;
+
+ if(!k->writer_stack) {
+ k->writer_stack = new_unencoding_writer(conn, &client_encoding, NULL);
+
+ if(!k->writer_stack)
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ if(!encoding)
+ encoding = &error_encoding; /* Defer error at stack use. */
+
+ /* Stack the unencoding stage. */
+ writer = new_unencoding_writer(conn, encoding, k->writer_stack);
+ if(!writer)
+ return CURLE_OUT_OF_MEMORY;
+ k->writer_stack = writer;
+ }
+ } while(*enclist);
+
+ return CURLE_OK;
+}
+
+#else
+/* Stubs for builds without HTTP. */
+CURLcode Curl_build_unencoding_stack(struct connectdata *conn,
+ const char *enclist, int maybechunked)
+{
+ (void) conn;
+ (void) enclist;
+ (void) maybechunked;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode Curl_unencode_write(struct connectdata *conn, contenc_writer *writer,
+ const char *buf, size_t nbytes)
+{
+ (void) conn;
+ (void) writer;
+ (void) buf;
+ (void) nbytes;
+ return CURLE_NOT_BUILT_IN;
+}
+
+void Curl_unencode_cleanup(struct connectdata *conn)
+{
+ (void) conn;
+}
+
+char *Curl_all_content_encodings(void)
+{
+ return strdup(CONTENT_ENCODING_DEFAULT); /* Satisfy caller. */
+}
+
+#endif /* CURL_DISABLE_HTTP */
diff --git a/lib/content_encoding.h b/lib/content_encoding.h
index 3fadd28..4cd52be 100644
--- a/lib/content_encoding.h
+++ b/lib/content_encoding.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,26 +23,33 @@
***************************************************************************/
#include "curl_setup.h"
-/*
- * Comma-separated list all supported Content-Encodings ('identity' is implied)
- */
-#ifdef HAVE_LIBZ
-#define ALL_CONTENT_ENCODINGS "deflate, gzip"
-/* force a cleanup */
-void Curl_unencode_cleanup(struct connectdata *conn);
-#else
-#define ALL_CONTENT_ENCODINGS "identity"
-#define Curl_unencode_cleanup(x) Curl_nop_stmt
-#endif
+/* Decoding writer. */
+typedef struct contenc_writer_s contenc_writer;
+typedef struct content_encoding_s content_encoding;
+
+struct contenc_writer_s {
+ const content_encoding *handler; /* Encoding handler. */
+ contenc_writer *downstream; /* Downstream writer. */
+ void *params; /* Encoding-specific storage (variable length). */
+};
-CURLcode Curl_unencode_deflate_write(struct connectdata *conn,
- struct SingleRequest *req,
- ssize_t nread);
+/* Content encoding writer. */
+struct content_encoding_s {
+ const char *name; /* Encoding name. */
+ const char *alias; /* Encoding name alias. */
+ CURLcode (*init_writer)(struct connectdata *conn, contenc_writer *writer);
+ CURLcode (*unencode_write)(struct connectdata *conn, contenc_writer *writer,
+ const char *buf, size_t nbytes);
+ void (*close_writer)(struct connectdata *conn, contenc_writer *writer);
+ size_t paramsize;
+};
-CURLcode
-Curl_unencode_gzip_write(struct connectdata *conn,
- struct SingleRequest *k,
- ssize_t nread);
+CURLcode Curl_build_unencoding_stack(struct connectdata *conn,
+ const char *enclist, int maybechunked);
+CURLcode Curl_unencode_write(struct connectdata *conn, contenc_writer *writer,
+ const char *buf, size_t nbytes);
+void Curl_unencode_cleanup(struct connectdata *conn);
+char *Curl_all_content_encodings(void);
#endif /* HEADER_CURL_CONTENT_ENCODING_H */
diff --git a/lib/cookie.c b/lib/cookie.c
index 6b678ae..c7afc7a 100644
--- a/lib/cookie.c
+++ b/lib/cookie.c
@@ -125,7 +125,7 @@ static bool tailmatch(const char *cooke_domain, const char *hostname)
if(hostname_len < cookie_domain_len)
return FALSE;
- if(!strcasecompare(cooke_domain, hostname+hostname_len-cookie_domain_len))
+ if(!strcasecompare(cooke_domain, hostname + hostname_len-cookie_domain_len))
return FALSE;
/* A lead char of cookie_domain is not '.'.
@@ -309,7 +309,7 @@ static void remove_expired(struct CookieInfo *cookies)
while(co) {
nx = co->next;
if(co->expires && co->expires < now) {
- if(co == cookies->cookies) {
+ if(!pv) {
cookies->cookies = co->next;
}
else {
@@ -375,9 +375,8 @@ Curl_cookie_add(struct Curl_easy *data,
unless set */
{
struct Cookie *clist;
- char name[MAX_NAME];
struct Cookie *co;
- struct Cookie *lastc=NULL;
+ struct Cookie *lastc = NULL;
time_t now = time(NULL);
bool replace_old = FALSE;
bool badcookie = FALSE; /* cookies are good by default. mmmmm yummy */
@@ -397,17 +396,19 @@ Curl_cookie_add(struct Curl_easy *data,
if(httpheader) {
/* This line was read off a HTTP-header */
+ char name[MAX_NAME];
+ char what[MAX_NAME];
const char *ptr;
const char *semiptr;
- char *what;
- what = malloc(MAX_COOKIE_LINE);
- if(!what) {
+ size_t linelength = strlen(lineptr);
+ if(linelength > MAX_COOKIE_LINE) {
+ /* discard overly long lines at once */
free(co);
return NULL;
}
- semiptr=strchr(lineptr, ';'); /* first, find a semicolon */
+ semiptr = strchr(lineptr, ';'); /* first, find a semicolon */
while(*lineptr && ISBLANK(*lineptr))
lineptr++;
@@ -415,9 +416,9 @@ Curl_cookie_add(struct Curl_easy *data,
ptr = lineptr;
do {
/* we have a <what>=<this> pair or a stand-alone word here */
- name[0]=what[0]=0; /* init the buffers */
+ name[0] = what[0] = 0; /* init the buffers */
if(1 <= sscanf(ptr, "%" MAX_NAME_TXT "[^;\r\n=] =%"
- MAX_COOKIE_LINE_TXT "[^;\r\n]",
+ MAX_NAME_TXT "[^;\r\n]",
name, what)) {
/* Use strstore() below to properly deal with received cookie
headers that have the same string property set more than once,
@@ -425,10 +426,24 @@ Curl_cookie_add(struct Curl_easy *data,
const char *whatptr;
bool done = FALSE;
bool sep;
- size_t len=strlen(what);
+ size_t len = strlen(what);
size_t nlen = strlen(name);
const char *endofn = &ptr[ nlen ];
+ infof(data, "cookie size: name/val %d + %d bytes\n",
+ nlen, len);
+
+ if(nlen >= (MAX_NAME-1) || len >= (MAX_NAME-1) ||
+ ((nlen + len) > MAX_NAME)) {
+ /* too long individual name or contents, or too long combination of
+ name + contents. Chrome and Firefox support 4095 or 4096 bytes
+ combo. */
+ freecookie(co);
+ infof(data, "oversized cookie dropped, name/val %d + %d bytes\n",
+ nlen, len);
+ return NULL;
+ }
+
/* name ends with a '=' ? */
sep = (*endofn == '=')?TRUE:FALSE;
@@ -440,18 +455,18 @@ Curl_cookie_add(struct Curl_easy *data,
endofn--;
nlen--;
}
- name[nlen]=0; /* new end of name */
+ name[nlen] = 0; /* new end of name */
}
}
/* Strip off trailing whitespace from the 'what' */
while(len && ISBLANK(what[len-1])) {
- what[len-1]=0;
+ what[len-1] = 0;
len--;
}
/* Skip leading whitespace from the 'what' */
- whatptr=what;
+ whatptr = what;
while(*whatptr && ISBLANK(*whatptr))
whatptr++;
@@ -484,6 +499,7 @@ Curl_cookie_add(struct Curl_easy *data,
badcookie = TRUE; /* out of memory bad */
break;
}
+ free(co->spath); /* if this is set again */
co->spath = sanitize_cookie_path(co->path);
if(!co->spath) {
badcookie = TRUE; /* out of memory bad */
@@ -510,7 +526,7 @@ Curl_cookie_add(struct Curl_easy *data,
/* check for more dots */
dotp = strchr(whatptr, '.');
if(!dotp && !strcasecompare("localhost", whatptr))
- domain=":";
+ domain = ":";
}
#endif
@@ -525,14 +541,14 @@ Curl_cookie_add(struct Curl_easy *data,
break;
}
if(!is_ip)
- co->tailmatch=TRUE; /* we always do that if the domain name was
- given */
+ co->tailmatch = TRUE; /* we always do that if the domain name was
+ given */
}
else {
/* we did not get a tailmatch and then the attempted set domain
is not a domain to which the current host belongs. Mark as
bad. */
- badcookie=TRUE;
+ badcookie = TRUE;
infof(data, "skipped cookie with bad tailmatch domain: %s\n",
whatptr);
}
@@ -581,26 +597,32 @@ Curl_cookie_add(struct Curl_easy *data,
continue;
}
- ptr=semiptr+1;
+ ptr = semiptr + 1;
while(*ptr && ISBLANK(*ptr))
ptr++;
- semiptr=strchr(ptr, ';'); /* now, find the next semicolon */
+ semiptr = strchr(ptr, ';'); /* now, find the next semicolon */
if(!semiptr && *ptr)
/* There are no more semicolons, but there's a final name=value pair
coming up */
- semiptr=strchr(ptr, '\0');
+ semiptr = strchr(ptr, '\0');
} while(semiptr);
if(co->maxage) {
- co->expires =
- curlx_strtoofft((*co->maxage=='\"')?
- &co->maxage[1]:&co->maxage[0], NULL, 10);
- if(CURL_OFF_T_MAX - now < co->expires)
- /* avoid overflow */
+ CURLofft offt;
+ offt = curlx_strtoofft((*co->maxage == '\"')?
+ &co->maxage[1]:&co->maxage[0], NULL, 10,
+ &co->expires);
+ if(offt == CURL_OFFT_FLOW)
+ /* overflow, used max value */
co->expires = CURL_OFF_T_MAX;
- else
- co->expires += now;
+ else if(!offt) {
+ if(CURL_OFF_T_MAX - now < co->expires)
+ /* would overflow */
+ co->expires = CURL_OFF_T_MAX;
+ else
+ co->expires += now;
+ }
}
else if(co->expirestr) {
/* Note that if the date couldn't get parsed for whatever reason,
@@ -619,7 +641,7 @@ Curl_cookie_add(struct Curl_easy *data,
if(!badcookie && !co->domain) {
if(domain) {
/* no domain was given in the header line, set the default */
- co->domain=strdup(domain);
+ co->domain = strdup(domain);
if(!co->domain)
badcookie = TRUE;
}
@@ -639,11 +661,11 @@ Curl_cookie_add(struct Curl_easy *data,
else
endslash = memrchr(path, '/', (size_t)(queryp - path));
if(endslash) {
- size_t pathlen = (size_t)(endslash-path+1); /* include ending slash */
- co->path=malloc(pathlen+1); /* one extra for the zero byte */
+ size_t pathlen = (size_t)(endslash-path + 1); /* include end slash */
+ co->path = malloc(pathlen + 1); /* one extra for the zero byte */
if(co->path) {
memcpy(co->path, path, pathlen);
- co->path[pathlen]=0; /* zero terminate */
+ co->path[pathlen] = 0; /* zero terminate */
co->spath = sanitize_cookie_path(co->path);
if(!co->spath)
badcookie = TRUE; /* out of memory bad */
@@ -653,8 +675,6 @@ Curl_cookie_add(struct Curl_easy *data,
}
}
- free(what);
-
if(badcookie || !co->name) {
/* we didn't get a cookie name or a bad one,
this is an illegal line, bail out */
@@ -668,7 +688,7 @@ Curl_cookie_add(struct Curl_easy *data,
reading the odd netscape cookies-file format here */
char *ptr;
char *firstptr;
- char *tok_buf=NULL;
+ char *tok_buf = NULL;
int fields;
/* IE introduced HTTP-only cookies to prevent XSS attacks. Cookies
@@ -689,19 +709,19 @@ Curl_cookie_add(struct Curl_easy *data,
return NULL;
}
/* strip off the possible end-of-line characters */
- ptr=strchr(lineptr, '\r');
+ ptr = strchr(lineptr, '\r');
if(ptr)
- *ptr=0; /* clear it */
- ptr=strchr(lineptr, '\n');
+ *ptr = 0; /* clear it */
+ ptr = strchr(lineptr, '\n');
if(ptr)
- *ptr=0; /* clear it */
+ *ptr = 0; /* clear it */
- firstptr=strtok_r(lineptr, "\t", &tok_buf); /* tokenize it on the TAB */
+ firstptr = strtok_r(lineptr, "\t", &tok_buf); /* tokenize it on the TAB */
/* Now loop through the fields and init the struct we already have
allocated */
- for(ptr=firstptr, fields=0; ptr && !badcookie;
- ptr=strtok_r(NULL, "\t", &tok_buf), fields++) {
+ for(ptr = firstptr, fields = 0; ptr && !badcookie;
+ ptr = strtok_r(NULL, "\t", &tok_buf), fields++) {
switch(fields) {
case 0:
if(ptr[0]=='.') /* skip preceding dots */
@@ -753,7 +773,8 @@ Curl_cookie_add(struct Curl_easy *data,
co->secure = strcasecompare(ptr, "TRUE")?TRUE:FALSE;
break;
case 4:
- co->expires = curlx_strtoofft(ptr, NULL, 10);
+ if(curlx_strtoofft(ptr, NULL, 10, &co->expires))
+ badcookie = TRUE;
break;
case 5:
co->name = strdup(ptr);
@@ -828,7 +849,7 @@ Curl_cookie_add(struct Curl_easy *data,
if(strcasecompare(clist->domain, co->domain) &&
(clist->tailmatch == co->tailmatch))
/* The domains are identical */
- replace_old=TRUE;
+ replace_old = TRUE;
}
else if(!clist->domain && !co->domain)
replace_old = TRUE;
@@ -957,7 +978,7 @@ struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
{
struct CookieInfo *c;
FILE *fp = NULL;
- bool fromfile=TRUE;
+ bool fromfile = TRUE;
char *line = NULL;
if(NULL == inc) {
@@ -977,7 +998,7 @@ struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
if(file && !strcmp(file, "-")) {
fp = stdin;
- fromfile=FALSE;
+ fromfile = FALSE;
}
else if(file && !*file) {
/* points to a "" string */
@@ -998,12 +1019,12 @@ struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
while(get_line(line, MAX_COOKIE_LINE, fp)) {
if(checkprefix("Set-Cookie:", line)) {
/* This is a cookie line, get it! */
- lineptr=&line[11];
- headerline=TRUE;
+ lineptr = &line[11];
+ headerline = TRUE;
}
else {
- lineptr=line;
- headerline=FALSE;
+ lineptr = line;
+ headerline = FALSE;
}
while(*lineptr && ISBLANK(*lineptr))
lineptr++;
@@ -1113,7 +1134,7 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
struct Cookie *newco;
struct Cookie *co;
time_t now = time(NULL);
- struct Cookie *mainco=NULL;
+ struct Cookie *mainco = NULL;
size_t matches = 0;
bool is_ip;
@@ -1185,7 +1206,7 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
co = mainco;
- for(i=0; co; co = co->next)
+ for(i = 0; co; co = co->next)
array[i++] = co;
/* now sort the cookie pointers in path length order */
@@ -1194,8 +1215,8 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
/* remake the linked list order according to the new order */
mainco = array[0]; /* start here */
- for(i=0; i<matches-1; i++)
- array[i]->next = array[i+1];
+ for(i = 0; i<matches-1; i++)
+ array[i]->next = array[i + 1];
array[matches-1]->next = NULL; /* terminate the list */
free(array); /* remove the temporary data again */
@@ -1335,7 +1356,7 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
{
struct Cookie *co;
FILE *out;
- bool use_stdout=FALSE;
+ bool use_stdout = FALSE;
char *format_ptr;
if((NULL == c) || (0 == c->numcookies))
@@ -1349,7 +1370,7 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
if(!strcmp("-", dumphere)) {
/* use stdout */
out = stdout;
- use_stdout=TRUE;
+ use_stdout = TRUE;
}
else {
out = fopen(dumphere, FOPEN_WRITETEXT);
@@ -1382,7 +1403,7 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
return 0;
}
-struct curl_slist *Curl_cookie_list(struct Curl_easy *data)
+static struct curl_slist *cookie_list(struct Curl_easy *data)
{
struct curl_slist *list = NULL;
struct curl_slist *beg;
@@ -1413,6 +1434,15 @@ struct curl_slist *Curl_cookie_list(struct Curl_easy *data)
return list;
}
+struct curl_slist *Curl_cookie_list(struct Curl_easy *data)
+{
+ struct curl_slist *list;
+ Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
+ list = cookie_list(data);
+ Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
+ return list;
+}
+
void Curl_flush_cookies(struct Curl_easy *data, int cleanup)
{
if(data->set.str[STRING_COOKIEJAR]) {
diff --git a/lib/cookie.h b/lib/cookie.h
index a9a4578..cb50b71 100644
--- a/lib/cookie.h
+++ b/lib/cookie.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -62,13 +62,16 @@ struct CookieInfo {
that comprise the cookie non-terminal in the syntax description of the
Set-Cookie header)"
+ We allow max 5000 bytes cookie header. Max 4095 bytes length per cookie
+ name and value. Name + value may not exceed 4096 bytes.
+
*/
#define MAX_COOKIE_LINE 5000
#define MAX_COOKIE_LINE_TXT "4999"
-/* This is the maximum length of a cookie name we deal with: */
-#define MAX_NAME 1024
-#define MAX_NAME_TXT "1023"
+/* This is the maximum length of a cookie name or content we deal with: */
+#define MAX_NAME 4096
+#define MAX_NAME_TXT "4095"
struct Curl_easy;
/*
diff --git a/lib/curl_addrinfo.c b/lib/curl_addrinfo.c
index 1adf319..6eb28bb 100644
--- a/lib/curl_addrinfo.c
+++ b/lib/curl_addrinfo.c
@@ -286,7 +286,7 @@ Curl_he2ai(const struct hostent *he, int port)
DEBUGASSERT((he->h_name != NULL) && (he->h_addr_list != NULL));
- for(i=0; (curr = he->h_addr_list[i]) != NULL; i++) {
+ for(i = 0; (curr = he->h_addr_list[i]) != NULL; i++) {
size_t ss_size;
#ifdef ENABLE_IPV6
@@ -570,9 +570,9 @@ curl_dogetaddrinfo(const char *hostname,
int line, const char *source)
{
#ifdef USE_LWIPSOCK
- int res=lwip_getaddrinfo(hostname, service, hints, result);
+ int res = lwip_getaddrinfo(hostname, service, hints, result);
#else
- int res=(getaddrinfo)(hostname, service, hints, result);
+ int res = (getaddrinfo)(hostname, service, hints, result);
#endif
if(0 == res)
/* success */
diff --git a/lib/curl_config.h b/lib/curl_config.h
index 4a0b8d3..f5ba927 100644
--- a/lib/curl_config.h
+++ b/lib/curl_config.h
@@ -10,6 +10,9 @@
/* Location of default ca path */
#define CURL_CA_PATH "/system/etc/security/cacerts"
+/* Default SSL backend */
+/* #undef CURL_DEFAULT_SSL_BACKEND */
+
/* to disable cookies support */
/* #undef CURL_DISABLE_COOKIES */
@@ -73,6 +76,9 @@
/* Definition to make a library symbol externally visible. */
#define CURL_EXTERN_SYMBOL __attribute__ ((__visibility__ ("default")))
+/* built with multiple SSL backends */
+/* #undef CURL_WITH_MULTI_SSL */
+
/* your Entropy Gathering Daemon socket pathname */
/* #undef EGD_SOCKET */
@@ -127,6 +133,15 @@
/* Define to 1 if using BoringSSL. */
#define HAVE_BORINGSSL 1
+/* if BROTLI is in use */
+/* #undef HAVE_BROTLI */
+
+/* Define to 1 if you have the <brotli/decode.h> header file. */
+/* #undef HAVE_BROTLI_DECODE_H */
+
+/* Define to 1 if you have the __builtin_available function. */
+/* #undef HAVE_BUILTIN_AVAILABLE */
+
/* Define to 1 if you have the clock_gettime function and monotonic timer. */
#if !defined(__APPLE__)
/* CLOCK_MONOTONIC is not defined in mac when building for the host. */
@@ -387,6 +402,9 @@
/* Define to 1 if you have the `ldap_url_parse' function. */
/* #undef HAVE_LDAP_URL_PARSE */
+/* Define to 1 if you have the `brotlidec' library (-lbrotlidec). */
+/* #undef HAVE_LIBBROTLIDEC */
+
/* Define to 1 if you have the <libgen.h> header file. */
#define HAVE_LIBGEN_H 1
@@ -414,6 +432,9 @@
/* Define to 1 if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1
+/* Define to 1 if you have the <linux/tcp.h> header file. */
+#define HAVE_LINUX_TCP_H 1
+
/* if your compiler supports LL */
#define HAVE_LL 1
@@ -426,6 +447,9 @@
/* Define to 1 if the compiler supports the 'long long' data type. */
#define HAVE_LONGLONG 1
+/* Define to 1 if you have the `mach_absolute_time' function. */
+/* #undef HAVE_MACH_ABSOLUTE_TIME */
+
/* Define to 1 if you have the malloc.h header file. */
#define HAVE_MALLOC_H 1
@@ -476,9 +500,6 @@
/* Define to 1 if you have the <openssl/pem.h> header file. */
#define HAVE_OPENSSL_PEM_H 1
-/* Define to 1 if you have the <openssl/pkcs12.h> header file. */
-#define HAVE_OPENSSL_PKCS12_H 1
-
/* Define to 1 if you have the <openssl/rsa.h> header file. */
#define HAVE_OPENSSL_RSA_H 1
@@ -869,6 +890,9 @@
/* Define to the function return type for send. */
#define SEND_TYPE_RETV ssize_t
+/* The size of `curl_off_t', as computed by sizeof. */
+#define SIZEOF_CURL_OFF_T 8
+
/* The size of `int', as computed by sizeof. */
#define SIZEOF_INT 4
diff --git a/lib/curl_config.h.cmake b/lib/curl_config.h.cmake
index c1452b3..e4d14c7 100644
--- a/lib/curl_config.h.cmake
+++ b/lib/curl_config.h.cmake
@@ -51,9 +51,6 @@
/* to disable RTSP */
#cmakedefine CURL_DISABLE_RTSP 1
-/* to disable RTMP */
-#cmakedefine CURL_DISABLE_RTMP 1
-
/* to disable SMB */
#cmakedefine CURL_DISABLE_SMB 1
@@ -82,9 +79,6 @@
/* when not building a shared library */
#cmakedefine CURL_STATICLIB 1
-/* Set to explicitly specify we don't want to use thread-safe functions */
-#cmakedefine DISABLED_THREADSAFE 1
-
/* your Entropy Gathering Daemon socket pathname */
#cmakedefine EGD_SOCKET ${EGD_SOCKET}
@@ -894,6 +888,9 @@
/* The size of `off_t', as computed by sizeof. */
#cmakedefine SIZEOF_OFF_T ${SIZEOF_OFF_T}
+/* The size of `curl_off_t', as computed by sizeof. */
+#cmakedefine SIZEOF_CURL_OFF_T ${SIZEOF_CURL_OFF_T}
+
/* The size of `size_t', as computed by sizeof. */
#cmakedefine SIZEOF_SIZE_T ${SIZEOF_SIZE_T}
@@ -1003,3 +1000,6 @@
/* the signed version of size_t */
#cmakedefine ssize_t ${ssize_t}
+
+/* Define to 1 if you have the mach_absolute_time function. */
+#cmakedefine HAVE_MACH_ABSOLUTE_TIME 1
diff --git a/lib/curl_config.h.in b/lib/curl_config.h.in
index a8edda5..3a3368b 100644
--- a/lib/curl_config.h.in
+++ b/lib/curl_config.h.in
@@ -9,6 +9,9 @@
/* Location of default ca path */
#undef CURL_CA_PATH
+/* Default SSL backend */
+#undef CURL_DEFAULT_SSL_BACKEND
+
/* to disable cookies support */
#undef CURL_DISABLE_COOKIES
@@ -72,6 +75,9 @@
/* Definition to make a library symbol externally visible. */
#undef CURL_EXTERN_SYMBOL
+/* built with multiple SSL backends */
+#undef CURL_WITH_MULTI_SSL
+
/* your Entropy Gathering Daemon socket pathname */
#undef EGD_SOCKET
@@ -126,6 +132,15 @@
/* Define to 1 if using BoringSSL. */
#undef HAVE_BORINGSSL
+/* if BROTLI is in use */
+#undef HAVE_BROTLI
+
+/* Define to 1 if you have the <brotli/decode.h> header file. */
+#undef HAVE_BROTLI_DECODE_H
+
+/* Define to 1 if you have the __builtin_available function. */
+#undef HAVE_BUILTIN_AVAILABLE
+
/* Define to 1 if you have the clock_gettime function and monotonic timer. */
#undef HAVE_CLOCK_GETTIME_MONOTONIC
@@ -383,6 +398,9 @@
/* Define to 1 if you have the `ldap_url_parse' function. */
#undef HAVE_LDAP_URL_PARSE
+/* Define to 1 if you have the `brotlidec' library (-lbrotlidec). */
+#undef HAVE_LIBBROTLIDEC
+
/* Define to 1 if you have the <libgen.h> header file. */
#undef HAVE_LIBGEN_H
@@ -410,6 +428,9 @@
/* Define to 1 if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
+/* Define to 1 if you have the <linux/tcp.h> header file. */
+#undef HAVE_LINUX_TCP_H
+
/* if your compiler supports LL */
#undef HAVE_LL
@@ -422,6 +443,9 @@
/* Define to 1 if the compiler supports the 'long long' data type. */
#undef HAVE_LONGLONG
+/* Define to 1 if you have the `mach_absolute_time' function. */
+#undef HAVE_MACH_ABSOLUTE_TIME
+
/* Define to 1 if you have the malloc.h header file. */
#undef HAVE_MALLOC_H
@@ -468,9 +492,6 @@
/* Define to 1 if you have the <openssl/pem.h> header file. */
#undef HAVE_OPENSSL_PEM_H
-/* Define to 1 if you have the <openssl/pkcs12.h> header file. */
-#undef HAVE_OPENSSL_PKCS12_H
-
/* Define to 1 if you have the <openssl/rsa.h> header file. */
#undef HAVE_OPENSSL_RSA_H
@@ -864,6 +885,9 @@
/* Define to the function return type for send. */
#undef SEND_TYPE_RETV
+/* The size of `curl_off_t', as computed by sizeof. */
+#undef SIZEOF_CURL_OFF_T
+
/* The size of `int', as computed by sizeof. */
#undef SIZEOF_INT
@@ -885,9 +909,6 @@
/* The size of `time_t', as computed by sizeof. */
#undef SIZEOF_TIME_T
-/* The size of `void*', as computed by sizeof. */
-#undef SIZEOF_VOIDP
-
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
diff --git a/lib/curl_fnmatch.c b/lib/curl_fnmatch.c
index 46d3ada..8a1e106 100644
--- a/lib/curl_fnmatch.c
+++ b/lib/curl_fnmatch.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -133,6 +133,9 @@ static int setcharset(unsigned char **p, unsigned char *charset)
unsigned char c;
for(;;) {
c = **p;
+ if(!c)
+ return SETCHARSET_FAIL;
+
switch(state) {
case CURLFNM_SCHS_DEFAULT:
if(ISALNUM(c)) { /* ASCII value */
@@ -151,7 +154,7 @@ static int setcharset(unsigned char **p, unsigned char *charset)
(*p)++;
}
else if(c == '[') {
- char c2 = *((*p)+1);
+ char c2 = *((*p) + 1);
if(c2 == ':') { /* there has to be a keyword */
(*p) += 2;
if(parsekeyword(p, charset)) {
@@ -196,9 +199,6 @@ static int setcharset(unsigned char **p, unsigned char *charset)
else
return SETCHARSET_FAIL;
}
- else if(c == '\0') {
- return SETCHARSET_FAIL;
- }
else {
charset[c] = 1;
(*p)++;
@@ -235,15 +235,10 @@ static int setcharset(unsigned char **p, unsigned char *charset)
return SETCHARSET_FAIL;
break;
case CURLFNM_SCHS_MAYRANGE2:
- if(c == '\\') {
- c = *(++(*p));
- if(!ISPRINT(c))
- return SETCHARSET_FAIL;
- }
if(c == ']') {
return SETCHARSET_OK;
}
- if(c == '\\') {
+ else if(c == '\\') {
c = *(++(*p));
if(ISPRINT(c)) {
charset[c] = 1;
@@ -253,7 +248,7 @@ static int setcharset(unsigned char **p, unsigned char *charset)
else
return SETCHARSET_FAIL;
}
- if(c >= rangestart) {
+ else if(c >= rangestart) {
if((ISLOWER(c) && ISLOWER(rangestart)) ||
(ISDIGIT(c) && ISDIGIT(rangestart)) ||
(ISUPPER(c) && ISUPPER(rangestart))) {
@@ -267,6 +262,8 @@ static int setcharset(unsigned char **p, unsigned char *charset)
else
return SETCHARSET_FAIL;
}
+ else
+ return SETCHARSET_FAIL;
break;
case CURLFNM_SCHS_RIGHTBR:
if(c == '[') {
@@ -277,9 +274,6 @@ static int setcharset(unsigned char **p, unsigned char *charset)
else if(c == ']') {
return SETCHARSET_OK;
}
- else if(c == '\0') {
- return SETCHARSET_FAIL;
- }
else if(ISPRINT(c)) {
charset[c] = 1;
(*p)++;
@@ -319,9 +313,9 @@ static int loop(const unsigned char *pattern, const unsigned char *string)
switch(state) {
case CURLFNM_LOOP_DEFAULT:
if(*p == '*') {
- while(*(p+1) == '*') /* eliminate multiple stars */
+ while(*(p + 1) == '*') /* eliminate multiple stars */
p++;
- if(*s == '\0' && *(p+1) == '\0')
+ if(*s == '\0' && *(p + 1) == '\0')
return CURL_FNMATCH_MATCH;
rc = loop(p + 1, s); /* *.txt matches .txt <=> .txt matches .txt */
if(rc == CURL_FNMATCH_MATCH)
@@ -351,7 +345,7 @@ static int loop(const unsigned char *pattern, const unsigned char *string)
p++;
}
else if(*p == '[') {
- unsigned char *pp = p+1; /* cannot handle with pointer to register */
+ unsigned char *pp = p + 1; /* cannot handle with pointer to register */
if(setcharset(&pp, charset)) {
int found = FALSE;
if(charset[(unsigned int)*s])
@@ -381,7 +375,7 @@ static int loop(const unsigned char *pattern, const unsigned char *string)
found = !found;
if(found) {
- p = pp+1;
+ p = pp + 1;
s++;
memset(charset, 0, CURLFNM_CHSET_SIZE);
}
diff --git a/lib/curl_ntlm_core.c b/lib/curl_ntlm_core.c
index aea5452..e896276 100644
--- a/lib/curl_ntlm_core.c
+++ b/lib/curl_ntlm_core.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,6 +31,25 @@
* https://www.innovation.ch/java/ntlm.html
*/
+/* Please keep the SSL backend-specific #if branches in this order:
+
+ 1. USE_OPENSSL
+ 2. USE_GNUTLS_NETTLE
+ 3. USE_GNUTLS
+ 4. USE_NSS
+ 5. USE_MBEDTLS
+ 6. USE_DARWINSSL
+ 7. USE_OS400CRYPTO
+ 8. USE_WIN32_CRYPTO
+
+ This ensures that:
+ - the same SSL branch gets activated throughout this source
+ file even if multiple backends are enabled at the same time.
+ - OpenSSL and NSS have higher priority than Windows Crypt, due
+ to issues with the latter supporting NTLM2Session responses
+ in NTLM type-3 messages.
+ */
+
#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
#ifdef USE_OPENSSL
@@ -76,14 +95,6 @@
# define MD5_DIGEST_LENGTH 16
# define MD4_DIGEST_LENGTH 16
-#elif defined(USE_MBEDTLS)
-
-# include <mbedtls/des.h>
-# include <mbedtls/md4.h>
-# if !defined(MBEDTLS_MD4_C)
-# include "curl_md4.h"
-# endif
-
#elif defined(USE_NSS)
# include <nss.h>
@@ -92,6 +103,14 @@
# include "curl_md4.h"
# define MD5_DIGEST_LENGTH MD5_LENGTH
+#elif defined(USE_MBEDTLS)
+
+# include <mbedtls/des.h>
+# include <mbedtls/md4.h>
+# if !defined(MBEDTLS_MD4_C)
+# include "curl_md4.h"
+# endif
+
#elif defined(USE_DARWINSSL)
# include <CommonCrypto/CommonCryptor.h>
@@ -196,26 +215,6 @@ static void setup_des_key(const unsigned char *key_56,
gcry_cipher_setkey(*des, key, sizeof(key));
}
-#elif defined(USE_MBEDTLS)
-
-static bool encrypt_des(const unsigned char *in, unsigned char *out,
- const unsigned char *key_56)
-{
- mbedtls_des_context ctx;
- char key[8];
-
- /* Expand the 56-bit key to 64-bits */
- extend_key_56_to_64(key_56, key);
-
- /* Set the key parity to odd */
- mbedtls_des_key_set_parity((unsigned char *) key);
-
- /* Perform the encryption */
- mbedtls_des_init(&ctx);
- mbedtls_des_setkey_enc(&ctx, (unsigned char *) key);
- return mbedtls_des_crypt_ecb(&ctx, in, out) == 0;
-}
-
#elif defined(USE_NSS)
/*
@@ -281,6 +280,26 @@ fail:
return rv;
}
+#elif defined(USE_MBEDTLS)
+
+static bool encrypt_des(const unsigned char *in, unsigned char *out,
+ const unsigned char *key_56)
+{
+ mbedtls_des_context ctx;
+ char key[8];
+
+ /* Expand the 56-bit key to 64-bits */
+ extend_key_56_to_64(key_56, key);
+
+ /* Set the key parity to odd */
+ mbedtls_des_key_set_parity((unsigned char *) key);
+
+ /* Perform the encryption */
+ mbedtls_des_init(&ctx);
+ mbedtls_des_setkey_enc(&ctx, (unsigned char *) key);
+ return mbedtls_des_crypt_ecb(&ctx, in, out) == 0;
+}
+
#elif defined(USE_DARWINSSL)
static bool encrypt_des(const unsigned char *in, unsigned char *out,
@@ -428,7 +447,7 @@ void Curl_ntlm_core_lm_resp(const unsigned char *keys,
setup_des_key(keys + 14, &des);
gcry_cipher_encrypt(des, results + 16, 8, plaintext, 8);
gcry_cipher_close(des);
-#elif defined(USE_MBEDTLS) || defined(USE_NSS) || defined(USE_DARWINSSL) \
+#elif defined(USE_NSS) || defined(USE_MBEDTLS) || defined(USE_DARWINSSL) \
|| defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO)
encrypt_des(plaintext, results, keys);
encrypt_des(plaintext, results + 8, keys + 7);
@@ -492,7 +511,7 @@ CURLcode Curl_ntlm_core_mk_lm_hash(struct Curl_easy *data,
setup_des_key(pw + 7, &des);
gcry_cipher_encrypt(des, lmbuffer + 8, 8, magic, 8);
gcry_cipher_close(des);
-#elif defined(USE_MBEDTLS) || defined(USE_NSS) || defined(USE_DARWINSSL) \
+#elif defined(USE_NSS) || defined(USE_MBEDTLS) || defined(USE_DARWINSSL) \
|| defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO)
encrypt_des(magic, lmbuffer, pw);
encrypt_des(magic, lmbuffer + 8, pw + 7);
@@ -538,7 +557,7 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
unsigned char *ntbuffer /* 21 bytes */)
{
size_t len = strlen(password);
- unsigned char *pw = malloc(len * 2);
+ unsigned char *pw = len ? malloc(len * 2) : strdup("");
CURLcode result;
if(!pw)
return CURLE_OUT_OF_MEMORY;
@@ -571,13 +590,18 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
gcry_md_write(MD4pw, pw, 2 * len);
memcpy(ntbuffer, gcry_md_read(MD4pw, 0), MD4_DIGEST_LENGTH);
gcry_md_close(MD4pw);
-#elif defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
- (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))
+#elif defined(USE_NSS)
Curl_md4it(ntbuffer, pw, 2 * len);
#elif defined(USE_MBEDTLS)
+#if defined(MBEDTLS_MD4_C)
mbedtls_md4(pw, 2 * len, ntbuffer);
+#else
+ Curl_md4it(ntbuffer, pw, 2 * len);
+#endif
#elif defined(USE_DARWINSSL)
(void)CC_MD4(pw, (CC_LONG)(2 * len), ntbuffer);
+#elif defined(USE_OS400CRYPTO)
+ Curl_md4it(ntbuffer, pw, 2 * len);
#elif defined(USE_WIN32_CRYPTO)
HCRYPTPROV hprov;
if(CryptAcquireContext(&hprov, NULL, NULL, PROV_RSA_FULL,
@@ -622,6 +646,15 @@ CURLcode Curl_hmac_md5(const unsigned char *key, unsigned int keylen,
return CURLE_OK;
}
+#ifndef SIZE_T_MAX
+/* some limits.h headers have this defined, some don't */
+#if defined(SIZEOF_SIZE_T) && (SIZEOF_SIZE_T > 4)
+#define SIZE_T_MAX 18446744073709551615U
+#else
+#define SIZE_T_MAX 4294967295U
+#endif
+#endif
+
/* This creates the NTLMv2 hash by using NTLM hash as the key and Unicode
* (uppercase UserName + Domain) as the data
*/
@@ -631,10 +664,20 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_hash(const char *user, size_t userlen,
unsigned char *ntlmv2hash)
{
/* Unicode representation */
- size_t identity_len = (userlen + domlen) * 2;
- unsigned char *identity = malloc(identity_len);
+ size_t identity_len;
+ unsigned char *identity;
CURLcode result = CURLE_OK;
+ /* we do the length checks below separately to avoid integer overflow risk
+ on extreme data lengths */
+ if((userlen > SIZE_T_MAX/2) ||
+ (domlen > SIZE_T_MAX/2) ||
+ ((userlen + domlen) > SIZE_T_MAX/2))
+ return CURLE_OUT_OF_MEMORY;
+
+ identity_len = (userlen + domlen) * 2;
+ identity = malloc(identity_len);
+
if(!identity)
return CURLE_OUT_OF_MEMORY;
@@ -780,7 +823,7 @@ CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
/* Concatenate the HMAC MD5 output with the client nonce */
memcpy(lmresp, hmac_output, 16);
- memcpy(lmresp+16, challenge_client, 8);
+ memcpy(lmresp + 16, challenge_client, 8);
return result;
}
diff --git a/lib/curl_ntlm_core.h b/lib/curl_ntlm_core.h
index 4a83d40..07ef5de 100644
--- a/lib/curl_ntlm_core.h
+++ b/lib/curl_ntlm_core.h
@@ -26,13 +26,19 @@
#if defined(USE_NTLM)
+/* If NSS is the first available SSL backend (see order in curl_ntlm_core.c)
+ then it must be initialized to be used by NTLM. */
+#if !defined(USE_OPENSSL) && \
+ !defined(USE_GNUTLS_NETTLE) && \
+ !defined(USE_GNUTLS) && \
+ defined(USE_NSS)
+#define NTLM_NEEDS_NSS_INIT
+#endif
+
#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
#ifdef USE_OPENSSL
-# if !defined(OPENSSL_VERSION_NUMBER) && \
- !defined(HEADER_SSL_H) && !defined(HEADER_MD5_H)
-# error "curl_ntlm_core.h shall not be included before OpenSSL headers."
-# endif
+# include <openssl/ssl.h>
#endif
/* Define USE_NTRESPONSES in order to make the type-3 message include
diff --git a/lib/curl_ntlm_wb.c b/lib/curl_ntlm_wb.c
index 9e9586c..03f47a3 100644
--- a/lib/curl_ntlm_wb.c
+++ b/lib/curl_ntlm_wb.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -48,6 +48,7 @@
#include "sendf.h"
#include "select.h"
#include "vauth/ntlm.h"
+#include "curl_ntlm_core.h"
#include "curl_ntlm_wb.h"
#include "url.h"
#include "strerror.h"
@@ -357,7 +358,7 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
/* not set means empty */
if(!userp)
- userp="";
+ userp = "";
switch(ntlm->state) {
case NTLMSTATE_TYPE1:
@@ -413,7 +414,7 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
/* connection is already authenticated,
* don't send a header in future requests */
free(*allocuserpwd);
- *allocuserpwd=NULL;
+ *allocuserpwd = NULL;
authp->done = TRUE;
break;
}
diff --git a/lib/curl_sasl.c b/lib/curl_sasl.c
index bd574b5..550433d 100644
--- a/lib/curl_sasl.c
+++ b/lib/curl_sasl.c
@@ -331,7 +331,8 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
sasl->authused = SASL_MECH_NTLM;
if(force_ir || data->set.sasl_ir)
- result = Curl_auth_create_ntlm_type1_message(conn->user, conn->passwd,
+ result = Curl_auth_create_ntlm_type1_message(data,
+ conn->user, conn->passwd,
&conn->ntlm, &resp, &len);
}
else
@@ -493,7 +494,8 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
#ifdef USE_NTLM
case SASL_NTLM:
/* Create the type-1 message */
- result = Curl_auth_create_ntlm_type1_message(conn->user, conn->passwd,
+ result = Curl_auth_create_ntlm_type1_message(data,
+ conn->user, conn->passwd,
&conn->ntlm, &resp, &len);
newstate = SASL_NTLM_TYPE2MSG;
break;
diff --git a/lib/curl_setup.h b/lib/curl_setup.h
index 4a3b85c..25a7b4c 100644
--- a/lib/curl_setup.h
+++ b/lib/curl_setup.h
@@ -141,14 +141,7 @@
#include <curl/curl.h>
-/*
- * Ensure that no one is using the old SIZEOF_CURL_OFF_T macro
- */
-
-#ifdef SIZEOF_CURL_OFF_T
-# error "SIZEOF_CURL_OFF_T shall not be defined!"
- Error Compilation_aborted_SIZEOF_CURL_OFF_T_shall_not_be_defined
-#endif
+#define CURL_SIZEOF_CURL_OFF_T SIZEOF_CURL_OFF_T
/*
* Disable other protocols when http is the only one desired.
@@ -185,9 +178,6 @@
# ifndef CURL_DISABLE_SMTP
# define CURL_DISABLE_SMTP
# endif
-# ifndef CURL_DISABLE_RTMP
-# define CURL_DISABLE_RTMP
-# endif
# ifndef CURL_DISABLE_GOPHER
# define CURL_DISABLE_GOPHER
# endif
@@ -727,6 +717,7 @@ Therefore we specify it explicitly. https://github.com/curl/curl/pull/258
#if defined(WIN32) || defined(MSDOS)
#define FOPEN_READTEXT "rt"
#define FOPEN_WRITETEXT "wt"
+#define FOPEN_APPENDTEXT "at"
#elif defined(__CYGWIN__)
/* Cygwin has specific behavior we need to address when WIN32 is not defined.
https://cygwin.com/cygwin-ug-net/using-textbinary.html
@@ -736,9 +727,11 @@ endings either CRLF or LF so 't' is appropriate.
*/
#define FOPEN_READTEXT "rt"
#define FOPEN_WRITETEXT "w"
+#define FOPEN_APPENDTEXT "a"
#else
#define FOPEN_READTEXT "r"
#define FOPEN_WRITETEXT "w"
+#define FOPEN_APPENDTEXT "a"
#endif
/* WinSock destroys recv() buffer when send() failed.
@@ -758,9 +751,10 @@ endings either CRLF or LF so 't' is appropriate.
/* Detect Windows App environment which has a restricted access
* to the Win32 APIs. */
-# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0602)
+# if (defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0602)) || \
+ defined(WINAPI_FAMILY)
# include <winapifamily.h>
-# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && \
+# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && \
!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
# define CURL_WINDOWS_APP
# endif
diff --git a/lib/curl_sha256.h b/lib/curl_sha256.h
new file mode 100644
index 0000000..6db4b04
--- /dev/null
+++ b/lib/curl_sha256.h
@@ -0,0 +1,32 @@
+#ifndef HEADER_CURL_SHA256_H
+#define HEADER_CURL_SHA256_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2010, Florin Petriuc, <petriuc.florin@gmail.com>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#ifndef CURL_DISABLE_CRYPTO_AUTH
+
+void Curl_sha256it(unsigned char *outbuffer,
+ const unsigned char *input);
+
+#endif
+
+#endif /* HEADER_CURL_SHA256_H */
diff --git a/lib/curlx.h b/lib/curlx.h
index 6168dc1..6e41826 100644
--- a/lib/curlx.h
+++ b/lib/curlx.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -42,16 +42,6 @@
curl_off_t number from a given string.
*/
-#include "timeval.h"
-/*
- "timeval.h" sets up a 'struct timeval' even for platforms that otherwise
- don't have one and has protos for these functions:
-
- curlx_tvnow()
- curlx_tvdiff()
- curlx_tvdiff_secs()
-*/
-
#include "nonblock.h"
/* "nonblock.h" provides curlx_nonblock() */
diff --git a/lib/dict.c b/lib/dict.c
index 81d89fc..4fc8552 100644
--- a/lib/dict.c
+++ b/lib/dict.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -98,7 +98,7 @@ static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
char *ptr;
size_t len;
char ch;
- int olen=0;
+ int olen = 0;
CURLcode result = Curl_urldecode(data, inputbuff, 0, &newp, &len, FALSE);
if(!newp || result)
@@ -117,7 +117,7 @@ static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
}
dictp[olen++] = ch;
}
- dictp[olen]=0;
+ dictp[olen] = 0;
}
free(newp);
return dictp;
@@ -132,8 +132,8 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
char *strategy = NULL;
char *nthdef = NULL; /* This is not part of the protocol, but required
by RFC 2229 */
- CURLcode result=CURLE_OK;
- struct Curl_easy *data=conn->data;
+ CURLcode result = CURLE_OK;
+ struct Curl_easy *data = conn->data;
curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
char *path = data->state.path;
@@ -168,7 +168,7 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
if((word == NULL) || (*word == (char)0)) {
infof(data, "lookup word is missing\n");
- word=(char *)"default";
+ word = (char *)"default";
}
if((database == NULL) || (*database == (char)0)) {
database = (char *)"!";
@@ -222,7 +222,7 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
if((word == NULL) || (*word == (char)0)) {
infof(data, "lookup word is missing\n");
- word=(char *)"default";
+ word = (char *)"default";
}
if((database == NULL) || (*database == (char)0)) {
database = (char *)"!";
diff --git a/lib/dotdot.c b/lib/dotdot.c
index 20603bc..cbb308d 100644
--- a/lib/dotdot.c
+++ b/lib/dotdot.c
@@ -55,7 +55,7 @@ char *Curl_dedotdotify(const char *input)
size_t inlen = strlen(input);
char *clone;
size_t clen = inlen; /* the length of the cloned input */
- char *out = malloc(inlen+1);
+ char *out = malloc(inlen + 1);
char *outptr;
char *orgclone;
char *queryp;
@@ -92,25 +92,25 @@ char *Curl_dedotdotify(const char *input)
remove that prefix from the input buffer; otherwise, */
if(!strncmp("./", clone, 2)) {
- clone+=2;
- clen-=2;
+ clone += 2;
+ clen -= 2;
}
else if(!strncmp("../", clone, 3)) {
- clone+=3;
- clen-=3;
+ clone += 3;
+ clen -= 3;
}
/* B. if the input buffer begins with a prefix of "/./" or "/.", where
"." is a complete path segment, then replace that prefix with "/" in
the input buffer; otherwise, */
else if(!strncmp("/./", clone, 3)) {
- clone+=2;
- clen-=2;
+ clone += 2;
+ clen -= 2;
}
else if(!strcmp("/.", clone)) {
clone[1]='/';
clone++;
- clen-=1;
+ clen -= 1;
}
/* C. if the input buffer begins with a prefix of "/../" or "/..", where
@@ -119,8 +119,8 @@ char *Curl_dedotdotify(const char *input)
any) from the output buffer; otherwise, */
else if(!strncmp("/../", clone, 4)) {
- clone+=3;
- clen-=3;
+ clone += 3;
+ clen -= 3;
/* remove the last segment from the output buffer */
while(outptr > out) {
outptr--;
@@ -131,8 +131,8 @@ char *Curl_dedotdotify(const char *input)
}
else if(!strcmp("/..", clone)) {
clone[2]='/';
- clone+=2;
- clen-=2;
+ clone += 2;
+ clen -= 2;
/* remove the last segment from the output buffer */
while(outptr > out) {
outptr--;
@@ -146,8 +146,8 @@ char *Curl_dedotdotify(const char *input)
that from the input buffer; otherwise, */
else if(!strcmp(".", clone) || !strcmp("..", clone)) {
- *clone=0;
- *out=0;
+ *clone = 0;
+ *out = 0;
}
else {
@@ -172,7 +172,7 @@ char *Curl_dedotdotify(const char *input)
from the correct index. */
size_t oindex = queryp - orgclone;
qlen = strlen(&input[oindex]);
- memcpy(outptr, &input[oindex], qlen+1); /* include the ending zero byte */
+ memcpy(outptr, &input[oindex], qlen + 1); /* include the end zero byte */
}
free(orgclone);
diff --git a/lib/easy.c b/lib/easy.c
index 66ec38a..5917db3 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -68,10 +68,11 @@
#include "amigaos.h"
#include "non-ascii.h"
#include "warnless.h"
-#include "conncache.h"
#include "multiif.h"
#include "sigpipe.h"
#include "ssh.h"
+#include "setopt.h"
+
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -214,11 +215,10 @@ static CURLcode global_init(long flags, bool memoryfuncs)
#endif
}
- if(flags & CURL_GLOBAL_SSL)
- if(!Curl_ssl_init()) {
- DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n"));
- return CURLE_FAILED_INIT;
- }
+ if(!Curl_ssl_init()) {
+ DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n"));
+ return CURLE_FAILED_INIT;
+ }
if(flags & CURL_GLOBAL_WIN32)
if(win32_init()) {
@@ -318,10 +318,7 @@ void curl_global_cleanup(void)
return;
Curl_global_host_cache_dtor();
-
- if(init_flags & CURL_GLOBAL_SSL)
- Curl_ssl_cleanup();
-
+ Curl_ssl_cleanup();
Curl_resolver_global_cleanup();
if(init_flags & CURL_GLOBAL_WIN32)
@@ -365,28 +362,6 @@ struct Curl_easy *curl_easy_init(void)
return data;
}
-/*
- * curl_easy_setopt() is the external interface for setting options on an
- * easy handle.
- */
-
-#undef curl_easy_setopt
-CURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag, ...)
-{
- va_list arg;
- CURLcode result;
-
- if(!data)
- return CURLE_BAD_FUNCTION_ARGUMENT;
-
- va_start(arg, tag);
-
- result = Curl_setopt(data, tag, arg);
-
- va_end(arg);
- return result;
-}
-
#ifdef CURLDEBUG
struct socketmonitor {
@@ -433,7 +408,7 @@ static int events_timer(struct Curl_multi *multi, /* multi handle */
*/
static int poll2cselect(int pollmask)
{
- int omask=0;
+ int omask = 0;
if(pollmask & POLLIN)
omask |= CURL_CSELECT_IN;
if(pollmask & POLLOUT)
@@ -450,7 +425,7 @@ static int poll2cselect(int pollmask)
*/
static short socketcb2poll(int pollmask)
{
- short omask=0;
+ short omask = 0;
if(pollmask & CURL_POLL_IN)
omask |= POLLIN;
if(pollmask & CURL_POLL_OUT)
@@ -473,7 +448,7 @@ static int events_socket(struct Curl_easy *easy, /* easy handle */
{
struct events *ev = userp;
struct socketmonitor *m;
- struct socketmonitor *prev=NULL;
+ struct socketmonitor *prev = NULL;
#if defined(CURL_DISABLE_VERBOSE_STRINGS)
(void) easy;
@@ -569,14 +544,14 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
struct socketmonitor *m;
struct pollfd *f;
struct pollfd fds[4];
- int numfds=0;
+ int numfds = 0;
int pollrc;
int i;
struct curltime before;
struct curltime after;
/* populate the fds[] array */
- for(m = ev->list, f=&fds[0]; m; m = m->next) {
+ for(m = ev->list, f = &fds[0]; m; m = m->next) {
f->fd = m->socket.fd;
f->events = m->socket.events;
f->revents = 0;
@@ -586,12 +561,12 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
}
/* get the time stamp to use to figure out how long poll takes */
- before = curlx_tvnow();
+ before = Curl_now();
/* wait for activity or timeout */
pollrc = Curl_poll(fds, numfds, (int)ev->ms);
- after = curlx_tvnow();
+ after = Curl_now();
ev->msbump = FALSE; /* reset here */
@@ -619,7 +594,7 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
/* If nothing updated the timeout, we decrease it by the spent time.
* If it was updated, it has the new timeout time stored already.
*/
- time_t timediff = curlx_tvdiff(after, before);
+ timediff_t timediff = Curl_timediff(after, before);
if(timediff > 0) {
if(timediff > ev->ms)
ev->ms = 0;
@@ -655,7 +630,7 @@ static CURLcode easy_events(struct Curl_multi *multi)
{
/* this struct is made static to allow it to be used after this function
returns and curl_multi_remove_handle() is called */
- static struct events evs= {2, FALSE, 0, NULL, 0};
+ static struct events evs = {2, FALSE, 0, NULL, 0};
/* if running event-based, do some further multi inits */
events_setup(multi, &evs);
@@ -680,17 +655,17 @@ static CURLcode easy_transfer(struct Curl_multi *multi)
int still_running = 0;
int rc;
- before = curlx_tvnow();
+ before = Curl_now();
mcode = curl_multi_wait(multi, NULL, 0, 1000, &rc);
if(!mcode) {
if(!rc) {
- struct curltime after = curlx_tvnow();
+ struct curltime after = Curl_now();
/* If it returns without any filedescriptor instantly, we need to
avoid busy-looping during periods where it has nothing particular
to wait for */
- if(curlx_tvdiff(after, before) <= 10) {
+ if(Curl_timediff(after, before) <= 10) {
without_fds++;
if(without_fds > 2) {
int sleep_ms = without_fds < 10 ? (1 << (without_fds - 1)) : 1000;
@@ -861,6 +836,40 @@ CURLcode curl_easy_getinfo(struct Curl_easy *data, CURLINFO info, ...)
return result;
}
+static CURLcode dupset(struct Curl_easy *dst, struct Curl_easy *src)
+{
+ CURLcode result = CURLE_OK;
+ enum dupstring i;
+
+ /* Copy src->set into dst->set first, then deal with the strings
+ afterwards */
+ dst->set = src->set;
+
+ /* clear all string pointers first */
+ memset(dst->set.str, 0, STRING_LAST * sizeof(char *));
+
+ /* duplicate all strings */
+ for(i = (enum dupstring)0; i< STRING_LASTZEROTERMINATED; i++) {
+ result = Curl_setstropt(&dst->set.str[i], src->set.str[i]);
+ if(result)
+ return result;
+ }
+
+ /* duplicate memory areas pointed to */
+ i = STRING_COPYPOSTFIELDS;
+ if(src->set.postfieldsize && src->set.str[i]) {
+ /* postfieldsize is curl_off_t, Curl_memdup() takes a size_t ... */
+ dst->set.str[i] = Curl_memdup(src->set.str[i],
+ curlx_sotouz(src->set.postfieldsize));
+ if(!dst->set.str[i])
+ return CURLE_OUT_OF_MEMORY;
+ /* point to the new copy */
+ dst->set.postfields = dst->set.str[i];
+ }
+
+ return CURLE_OK;
+}
+
/*
* curl_easy_duphandle() is an external interface to allow duplication of a
* given input easy handle. The returned handle will be a new working handle
@@ -888,7 +897,7 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
outcurl->state.headersize = HEADERSIZE;
/* copy all userdefined values */
- if(Curl_dupset(outcurl, data))
+ if(dupset(outcurl, data))
goto fail;
/* the connection cache is setup on demand */
@@ -1027,13 +1036,13 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
struct tempbuf writebuf[3]; /* there can only be three */
/* copy the structs to allow for immediate re-pausing */
- for(i=0; i < data->state.tempcount; i++) {
+ for(i = 0; i < data->state.tempcount; i++) {
writebuf[i] = data->state.tempwrite[i];
data->state.tempwrite[i].buf = NULL;
}
data->state.tempcount = 0;
- for(i=0; i < count; i++) {
+ for(i = 0; i < count; i++) {
/* even if one function returns error, this loops through and frees all
buffers */
if(!result)
diff --git a/lib/escape.c b/lib/escape.c
index 973aeb6..b7e2d32 100644
--- a/lib/escape.c
+++ b/lib/escape.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -84,14 +84,14 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
char *testing_ptr = NULL;
unsigned char in; /* we need to treat the characters unsigned */
size_t newlen;
- size_t strindex=0;
+ size_t strindex = 0;
size_t length;
CURLcode result;
if(inlength < 0)
return NULL;
- alloc = (inlength?(size_t)inlength:strlen(string))+1;
+ alloc = (inlength?(size_t)inlength:strlen(string)) + 1;
newlen = alloc;
ns = malloc(alloc);
@@ -104,7 +104,7 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
if(Curl_isunreserved(in))
/* just copy this */
- ns[strindex++]=in;
+ ns[strindex++] = in;
else {
/* encode it */
newlen += 2; /* the size grows with two, since this'll become a %XX */
@@ -116,7 +116,7 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
ns = testing_ptr;
}
- result = Curl_convert_to_network(data, &in, 1);
+ result = Curl_convert_to_network(data, (char *)&in, 1);
if(result) {
/* Curl_convert_to_network calls failf if unsuccessful */
free(ns);
@@ -125,11 +125,11 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
snprintf(&ns[strindex], 4, "%%%02X", in);
- strindex+=3;
+ strindex += 3;
}
string++;
}
- ns[strindex]=0; /* terminate it */
+ ns[strindex] = 0; /* terminate it */
return ns;
}
@@ -148,10 +148,10 @@ CURLcode Curl_urldecode(struct Curl_easy *data,
char **ostring, size_t *olen,
bool reject_ctrl)
{
- size_t alloc = (length?length:strlen(string))+1;
+ size_t alloc = (length?length:strlen(string)) + 1;
char *ns = malloc(alloc);
unsigned char in;
- size_t strindex=0;
+ size_t strindex = 0;
unsigned long hex;
CURLcode result;
@@ -173,15 +173,15 @@ CURLcode Curl_urldecode(struct Curl_easy *data,
in = curlx_ultouc(hex); /* this long is never bigger than 255 anyway */
- result = Curl_convert_from_network(data, &in, 1);
+ result = Curl_convert_from_network(data, (char *)&in, 1);
if(result) {
/* Curl_convert_from_network calls failf if unsuccessful */
free(ns);
return result;
}
- string+=2;
- alloc-=2;
+ string += 2;
+ alloc -= 2;
}
if(reject_ctrl && (in < 0x20)) {
@@ -192,7 +192,7 @@ CURLcode Curl_urldecode(struct Curl_easy *data,
ns[strindex++] = in;
string++;
}
- ns[strindex]=0; /* terminate it */
+ ns[strindex] = 0; /* terminate it */
if(olen)
/* store output size */
diff --git a/lib/file.c b/lib/file.c
index 666cbe7..0bbc0e1 100644
--- a/lib/file.c
+++ b/lib/file.c
@@ -133,37 +133,42 @@ static CURLcode file_setup_connection(struct connectdata *conn)
static CURLcode file_range(struct connectdata *conn)
{
curl_off_t from, to;
- curl_off_t totalsize=-1;
+ curl_off_t totalsize = -1;
char *ptr;
char *ptr2;
struct Curl_easy *data = conn->data;
if(data->state.use_range && data->state.range) {
- from=curlx_strtoofft(data->state.range, &ptr, 0);
- while(*ptr && (ISSPACE(*ptr) || (*ptr=='-')))
+ CURLofft from_t;
+ CURLofft to_t;
+ from_t = curlx_strtoofft(data->state.range, &ptr, 0, &from);
+ if(from_t == CURL_OFFT_FLOW)
+ return CURLE_RANGE_ERROR;
+ while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
ptr++;
- to=curlx_strtoofft(ptr, &ptr2, 0);
- if(ptr == ptr2) {
- /* we didn't get any digit */
- to=-1;
- }
- if((-1 == to) && (from>=0)) {
+ to_t = curlx_strtoofft(ptr, &ptr2, 0, &to);
+ if(to_t == CURL_OFFT_FLOW)
+ return CURLE_RANGE_ERROR;
+ if((to_t == CURL_OFFT_INVAL) && !from_t) {
/* X - */
data->state.resume_from = from;
DEBUGF(infof(data, "RANGE %" CURL_FORMAT_CURL_OFF_T " to end of file\n",
from));
}
- else if(from < 0) {
+ else if((from_t == CURL_OFFT_INVAL) && !to_t) {
/* -Y */
- data->req.maxdownload = -from;
- data->state.resume_from = from;
+ data->req.maxdownload = to;
+ data->state.resume_from = -to;
DEBUGF(infof(data, "RANGE the last %" CURL_FORMAT_CURL_OFF_T " bytes\n",
- -from));
+ to));
}
else {
/* X-Y */
totalsize = to-from;
- data->req.maxdownload = totalsize+1; /* include last byte */
+ if(totalsize == CURL_OFF_T_MAX)
+ /* this is too big to increase, so bail out */
+ return CURLE_RANGE_ERROR;
+ data->req.maxdownload = totalsize + 1; /* include last byte */
data->state.resume_from = from;
DEBUGF(infof(data, "RANGE from %" CURL_FORMAT_CURL_OFF_T
" getting %" CURL_FORMAT_CURL_OFF_T " bytes\n",
@@ -226,7 +231,7 @@ static CURLcode file_connect(struct connectdata *conn, bool *done)
}
/* change path separators from '/' to '\\' for DOS, Windows and OS/2 */
- for(i=0; i < real_path_len; ++i)
+ for(i = 0; i < real_path_len; ++i)
if(actual_path[i] == '/')
actual_path[i] = '\\';
else if(!actual_path[i]) { /* binary zero */
@@ -399,7 +404,7 @@ static CURLcode file_upload(struct connectdata *conn)
if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
else
- result = Curl_speedcheck(data, Curl_tvnow());
+ result = Curl_speedcheck(data, Curl_now());
}
if(!result && Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
@@ -428,9 +433,9 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
struct_stat statbuf; /* struct_stat instead of struct stat just to allow the
Windows version to have a different struct without
having to redefine the simple word 'stat' */
- curl_off_t expected_size=0;
+ curl_off_t expected_size = 0;
bool size_known;
- bool fstated=FALSE;
+ bool fstated = FALSE;
ssize_t nread;
struct Curl_easy *data = conn->data;
char *buf = data->state.buffer;
@@ -584,7 +589,7 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
else
- result = Curl_speedcheck(data, Curl_tvnow());
+ result = Curl_speedcheck(data, Curl_now());
}
if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
diff --git a/lib/formdata.c b/lib/formdata.c
index e48a627..d0579c5 100644
--- a/lib/formdata.c
+++ b/lib/formdata.c
@@ -32,6 +32,8 @@
#include "urldata.h" /* for struct Curl_easy */
#include "formdata.h"
+#include "mime.h"
+#include "non-ascii.h"
#include "vtls/vtls.h"
#include "strcase.h"
#include "sendf.h"
@@ -42,13 +44,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-#ifndef HAVE_BASENAME
-static char *Curl_basename(char *path);
-#define basename(x) Curl_basename((x))
-#endif
-
-static size_t readfromfile(struct Form *form, char *buffer, size_t size);
-static CURLcode formboundary(struct Curl_easy *data, char *buffer, size_t len);
/* What kind of Content-Type to use on un-specified files with unrecognized
extensions. */
@@ -197,7 +192,7 @@ static const char *ContentTypeForFilename(const char *filename,
contenttype = HTTPPOST_CONTENTTYPE_DEFAULT;
if(filename) { /* in case a NULL was passed in */
- for(i=0; i<sizeof(ctts)/sizeof(ctts[0]); i++) {
+ for(i = 0; i<sizeof(ctts)/sizeof(ctts[0]); i++) {
if(strlen(filename) >= strlen(ctts[i].extension)) {
if(strcasecompare(filename +
strlen(filename) - strlen(ctts[i].extension),
@@ -272,7 +267,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
struct curl_httppost *post = NULL;
CURLformoption option;
struct curl_forms *forms = NULL;
- char *array_value=NULL; /* value read from an array */
+ char *array_value = NULL; /* value read from an array */
/* This is a state variable, that if TRUE means that we're parsing an
array that we got passed to us. If FALSE we're parsing the input
@@ -641,15 +636,26 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
}
form->contenttype_alloc = TRUE;
}
+ if(form->name && form->namelength) {
+ /* Name should not contain nul bytes. */
+ size_t i;
+ for(i = 0; i < form->namelength; i++)
+ if(!form->name[i]) {
+ return_value = CURL_FORMADD_NULL;
+ break;
+ }
+ if(return_value != CURL_FORMADD_OK)
+ break;
+ }
if(!(form->flags & HTTPPOST_PTRNAME) &&
(form == first_form) ) {
/* Note that there's small risk that form->name is NULL here if the
app passed in a bad combo, so we better check for that first. */
if(form->name) {
- /* copy name (without strdup; possibly contains null characters) */
+ /* copy name (without strdup; possibly not nul-terminated) */
form->name = Curl_memdup(form->name, form->namelength?
form->namelength:
- strlen(form->name)+1);
+ strlen(form->name) + 1);
}
if(!form->name) {
return_value = CURL_FORMADD_MEMORY;
@@ -663,7 +669,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
/* copy value (without strdup; possibly contains null characters) */
size_t clen = (size_t) form->contentslength;
if(!clen)
- clen = strlen(form->value)+1;
+ clen = strlen(form->value) + 1;
form->value = Curl_memdup(form->value, clen);
@@ -746,211 +752,6 @@ CURLFORMcode curl_formadd(struct curl_httppost **httppost,
return result;
}
-#ifdef __VMS
-#include <fabdef.h>
-/*
- * get_vms_file_size does what it takes to get the real size of the file
- *
- * For fixed files, find out the size of the EOF block and adjust.
- *
- * For all others, have to read the entire file in, discarding the contents.
- * Most posted text files will be small, and binary files like zlib archives
- * and CD/DVD images should be either a STREAM_LF format or a fixed format.
- *
- */
-curl_off_t VmsRealFileSize(const char *name,
- const struct_stat *stat_buf)
-{
- char buffer[8192];
- curl_off_t count;
- int ret_stat;
- FILE * file;
-
- file = fopen(name, FOPEN_READTEXT); /* VMS */
- if(file == NULL)
- return 0;
-
- count = 0;
- ret_stat = 1;
- while(ret_stat > 0) {
- ret_stat = fread(buffer, 1, sizeof(buffer), file);
- if(ret_stat != 0)
- count += ret_stat;
- }
- fclose(file);
-
- return count;
-}
-
-/*
- *
- * VmsSpecialSize checks to see if the stat st_size can be trusted and
- * if not to call a routine to get the correct size.
- *
- */
-static curl_off_t VmsSpecialSize(const char *name,
- const struct_stat *stat_buf)
-{
- switch(stat_buf->st_fab_rfm) {
- case FAB$C_VAR:
- case FAB$C_VFC:
- return VmsRealFileSize(name, stat_buf);
- break;
- default:
- return stat_buf->st_size;
- }
-}
-
-#endif
-
-#ifndef __VMS
-#define filesize(name, stat_data) (stat_data.st_size)
-#else
- /* Getting the expected file size needs help on VMS */
-#define filesize(name, stat_data) VmsSpecialSize(name, &stat_data)
-#endif
-
-/*
- * AddFormData() adds a chunk of data to the FormData linked list.
- *
- * size is incremented by the chunk length, unless it is NULL
- */
-static CURLcode AddFormData(struct FormData **formp,
- enum formtype type,
- const void *line,
- curl_off_t length,
- curl_off_t *size)
-{
- struct FormData *newform;
- char *alloc2 = NULL;
- CURLcode result = CURLE_OK;
- if(length < 0 || (size && *size < 0))
- return CURLE_BAD_FUNCTION_ARGUMENT;
-
- newform = malloc(sizeof(struct FormData));
- if(!newform)
- return CURLE_OUT_OF_MEMORY;
- newform->next = NULL;
-
- if(type <= FORM_CONTENT) {
- /* we make it easier for plain strings: */
- if(!length)
- length = strlen((char *)line);
-#if (SIZEOF_SIZE_T < CURL_SIZEOF_CURL_OFF_T)
- else if(length >= (curl_off_t)(size_t)-1) {
- result = CURLE_BAD_FUNCTION_ARGUMENT;
- goto error;
- }
-#endif
- if(type != FORM_DATAMEM) {
- newform->line = malloc((size_t)length+1);
- if(!newform->line) {
- result = CURLE_OUT_OF_MEMORY;
- goto error;
- }
- alloc2 = newform->line;
- memcpy(newform->line, line, (size_t)length);
-
- /* zero terminate for easier debugging */
- newform->line[(size_t)length]=0;
- }
- else {
- newform->line = (char *)line;
- type = FORM_DATA; /* in all other aspects this is just FORM_DATA */
- }
- newform->length = (size_t)length;
- }
- else
- /* For callbacks and files we don't have any actual data so we just keep a
- pointer to whatever this points to */
- newform->line = (char *)line;
-
- newform->type = type;
-
- if(size) {
- if(type != FORM_FILE)
- /* for static content as well as callback data we add the size given
- as input argument */
- *size += length;
- else {
- /* Since this is a file to be uploaded here, add the size of the actual
- file */
- if(strcmp("-", newform->line)) {
- struct_stat file;
- if(!stat(newform->line, &file) && !S_ISDIR(file.st_mode))
- *size += filesize(newform->line, file);
- else {
- result = CURLE_BAD_FUNCTION_ARGUMENT;
- goto error;
- }
- }
- }
- }
-
- if(*formp) {
- (*formp)->next = newform;
- *formp = newform;
- }
- else
- *formp = newform;
-
- return CURLE_OK;
- error:
- if(newform)
- free(newform);
- if(alloc2)
- free(alloc2);
- return result;
-}
-
-/*
- * AddFormDataf() adds printf()-style formatted data to the formdata chain.
- */
-
-static CURLcode AddFormDataf(struct FormData **formp,
- curl_off_t *size,
- const char *fmt, ...)
-{
- char *s;
- CURLcode result;
- va_list ap;
- va_start(ap, fmt);
- s = curl_mvaprintf(fmt, ap);
- va_end(ap);
-
- if(!s)
- return CURLE_OUT_OF_MEMORY;
-
- result = AddFormData(formp, FORM_DATAMEM, s, 0, size);
- if(result)
- free(s);
-
- return result;
-}
-
-/*
- * Curl_formclean() is used from http.c, this cleans a built FormData linked
- * list
- */
-void Curl_formclean(struct FormData **form_ptr)
-{
- struct FormData *next, *form;
-
- form = *form_ptr;
- if(!form)
- return;
-
- do {
- next=form->next; /* the following form line */
- if(form->type <= FORM_CONTENT)
- free(form->line); /* free the line */
- free(form); /* free the struct */
- form = next;
- } while(form); /* continue */
-
- *form_ptr = NULL;
-}
-
/*
* curl_formget()
* Serialize a curl_httppost struct.
@@ -962,42 +763,34 @@ int curl_formget(struct curl_httppost *form, void *arg,
curl_formget_callback append)
{
CURLcode result;
- curl_off_t size;
- struct FormData *data, *ptr;
+ curl_mimepart toppart;
- result = Curl_getformdata(NULL, &data, form, NULL, &size);
- if(result)
- return (int)result;
-
- for(ptr = data; ptr; ptr = ptr->next) {
- if((ptr->type == FORM_FILE) || (ptr->type == FORM_CALLBACK)) {
- char buffer[8192];
- size_t nread;
- struct Form temp;
-
- Curl_FormInit(&temp, ptr);
-
- do {
- nread = readfromfile(&temp, buffer, sizeof(buffer));
- if((nread == (size_t) -1) ||
- (nread > sizeof(buffer)) ||
- (nread != append(arg, buffer, nread))) {
- if(temp.fp)
- fclose(temp.fp);
- Curl_formclean(&data);
- return -1;
- }
- } while(nread);
- }
- else {
- if(ptr->length != append(arg, ptr->line, ptr->length)) {
- Curl_formclean(&data);
- return -1;
- }
+ Curl_mime_initpart(&toppart, NULL); /* default form is empty */
+ result = Curl_getformdata(NULL, &toppart, form, NULL);
+ if(!result)
+ result = Curl_mime_prepare_headers(&toppart, "multipart/form-data",
+ NULL, MIMESTRATEGY_FORM);
+
+ while(!result) {
+ char buffer[8192];
+ size_t nread = Curl_mime_read(buffer, 1, sizeof buffer, &toppart);
+
+ if(!nread)
+ break;
+
+ switch(nread) {
+ default:
+ if(append(arg, buffer, nread) != nread)
+ result = CURLE_READ_ERROR;
+ break;
+ case CURL_READFUNC_ABORT:
+ case CURL_READFUNC_PAUSE:
+ break;
}
}
- Curl_formclean(&data);
- return 0;
+
+ Curl_mime_cleanpart(&toppart);
+ return (int) result;
}
/*
@@ -1013,7 +806,7 @@ void curl_formfree(struct curl_httppost *form)
return;
do {
- next=form->next; /* the following form line */
+ next = form->next; /* the following form line */
/* recurse to sub-contents */
curl_formfree(form->more);
@@ -1031,118 +824,29 @@ void curl_formfree(struct curl_httppost *form)
} while(form); /* continue */
}
-#ifndef HAVE_BASENAME
-/*
- (Quote from The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004
- Edition)
-
- The basename() function shall take the pathname pointed to by path and
- return a pointer to the final component of the pathname, deleting any
- trailing '/' characters.
-
- If the string pointed to by path consists entirely of the '/' character,
- basename() shall return a pointer to the string "/". If the string pointed
- to by path is exactly "//", it is implementation-defined whether '/' or "//"
- is returned.
- If path is a null pointer or points to an empty string, basename() shall
- return a pointer to the string ".".
-
- The basename() function may modify the string pointed to by path, and may
- return a pointer to static storage that may then be overwritten by a
- subsequent call to basename().
-
- The basename() function need not be reentrant. A function that is not
- required to be reentrant is not required to be thread-safe.
-
-*/
-static char *Curl_basename(char *path)
+/* Set mime part name, taking care of non nul-terminated name string. */
+static CURLcode setname(curl_mimepart *part, const char *name, size_t len)
{
- /* Ignore all the details above for now and make a quick and simple
- implementaion here */
- char *s1;
- char *s2;
-
- s1=strrchr(path, '/');
- s2=strrchr(path, '\\');
+ char *zname;
+ CURLcode res;
- if(s1 && s2) {
- path = (s1 > s2? s1 : s2)+1;
- }
- else if(s1)
- path = s1 + 1;
- else if(s2)
- path = s2 + 1;
-
- return path;
-}
-#endif
-
-static char *strippath(const char *fullfile)
-{
- char *filename;
- char *base;
- filename = strdup(fullfile); /* duplicate since basename() may ruin the
- buffer it works on */
- if(!filename)
- return NULL;
- base = strdup(basename(filename));
-
- free(filename); /* free temporary buffer */
-
- return base; /* returns an allocated string or NULL ! */
-}
-
-static CURLcode formdata_add_filename(const struct curl_httppost *file,
- struct FormData **form,
- curl_off_t *size)
-{
- CURLcode result = CURLE_OK;
- char *filename = file->showfilename;
- char *filebasename = NULL;
- char *filename_escaped = NULL;
-
- if(!filename) {
- filebasename = strippath(file->contents);
- if(!filebasename)
- return CURLE_OUT_OF_MEMORY;
- filename = filebasename;
- }
-
- if(strchr(filename, '\\') || strchr(filename, '"')) {
- char *p0, *p1;
-
- /* filename need be escaped */
- filename_escaped = malloc(strlen(filename)*2+1);
- if(!filename_escaped) {
- free(filebasename);
- return CURLE_OUT_OF_MEMORY;
- }
- p0 = filename_escaped;
- p1 = filename;
- while(*p1) {
- if(*p1 == '\\' || *p1 == '"')
- *p0++ = '\\';
- *p0++ = *p1++;
- }
- *p0 = '\0';
- filename = filename_escaped;
- }
- result = AddFormDataf(form, size,
- "; filename=\"%s\"",
- filename);
- free(filename_escaped);
- free(filebasename);
- return result;
+ if(!name || !len)
+ return curl_mime_name(part, name);
+ zname = malloc(len + 1);
+ if(!zname)
+ return CURLE_OUT_OF_MEMORY;
+ memcpy(zname, name, len);
+ zname[len] = '\0';
+ res = curl_mime_name(part, zname);
+ free(zname);
+ return res;
}
/*
- * Curl_getformdata() converts a linked list of "meta data" into a complete
- * (possibly huge) multipart formdata. The input list is in 'post', while the
- * output resulting linked lists gets stored in '*finalform'. *sizep will get
- * the total size of the whole POST.
- * A multipart/form_data content-type is built, unless a custom content-type
- * is passed in 'custom_content_type'.
+ * Curl_getformdata() converts a linked list of "meta data" into a mime
+ * structure. The input list is in 'post', while the output is stored in
+ * mime part at '*finalform'.
*
* This function will not do a failf() for the potential memory failures but
* should for all other errors it spots. Just note that this function MAY get
@@ -1150,422 +854,123 @@ static CURLcode formdata_add_filename(const struct curl_httppost *file,
*/
CURLcode Curl_getformdata(struct Curl_easy *data,
- struct FormData **finalform,
+ curl_mimepart *finalform,
struct curl_httppost *post,
- const char *custom_content_type,
- curl_off_t *sizep)
+ curl_read_callback fread_func)
{
- struct FormData *form = NULL;
- struct FormData *firstform;
- struct curl_httppost *file;
CURLcode result = CURLE_OK;
- curl_off_t size = 0; /* support potentially ENORMOUS formposts */
- char fileboundary[42];
- struct curl_slist *curList;
- char boundary[42];
+ curl_mime *form = NULL;
+ curl_mime *multipart;
+ curl_mimepart *part;
+ struct curl_httppost *file;
- *finalform = NULL; /* default form is empty */
+ Curl_mime_cleanpart(finalform); /* default form is empty */
if(!post)
return result; /* no input => no output! */
- result = formboundary(data, boundary, sizeof(boundary));
- if(result)
- return result;
-
- /* Make the first line of the output */
- result = AddFormDataf(&form, NULL,
- "%s; boundary=%s\r\n",
- custom_content_type?custom_content_type:
- "Content-Type: multipart/form-data",
- boundary);
-
- if(result) {
- return result;
- }
- /* we DO NOT include that line in the total size of the POST, since it'll be
- part of the header! */
-
- firstform = form;
-
- do {
-
- if(size) {
- result = AddFormDataf(&form, &size, "\r\n");
- if(result)
- break;
- }
-
- /* boundary */
- result = AddFormDataf(&form, &size, "--%s\r\n", boundary);
- if(result)
- break;
-
- /* Maybe later this should be disabled when a custom_content_type is
- passed, since Content-Disposition is not meaningful for all multipart
- types.
- */
- result = AddFormDataf(&form, &size,
- "Content-Disposition: form-data; name=\"");
- if(result)
- break;
-
- result = AddFormData(&form, FORM_DATA, post->name, post->namelength,
- &size);
- if(result)
- break;
+ form = curl_mime_init(data);
+ if(!form)
+ result = CURLE_OUT_OF_MEMORY;
- result = AddFormDataf(&form, &size, "\"");
- if(result)
- break;
+ if(!result)
+ result = curl_mime_subparts(finalform, form);
+ /* Process each top part. */
+ for(; !result && post; post = post->next) {
+ /* If we have more than a file here, create a mime subpart and fill it. */
+ multipart = form;
if(post->more) {
- /* If used, this is a link to more file names, we must then do
- the magic to include several files with the same field name */
-
- result = formboundary(data, fileboundary, sizeof(fileboundary));
- if(result) {
- break;
+ part = curl_mime_addpart(form);
+ if(!part)
+ result = CURLE_OUT_OF_MEMORY;
+ if(!result)
+ result = setname(part, post->name, post->namelength);
+ if(!result) {
+ multipart = curl_mime_init(data);
+ if(!multipart)
+ result = CURLE_OUT_OF_MEMORY;
}
-
- result = AddFormDataf(&form, &size,
- "\r\nContent-Type: multipart/mixed;"
- " boundary=%s\r\n",
- fileboundary);
- if(result)
- break;
+ if(!result)
+ result = curl_mime_subparts(part, multipart);
}
- file = post;
-
- do {
-
- /* If 'showfilename' is set, that is a faked name passed on to us
- to use to in the formpost. If that is not set, the actually used
- local file name should be added. */
-
- if(post->more) {
- /* if multiple-file */
- result = AddFormDataf(&form, &size,
- "\r\n--%s\r\nContent-Disposition: "
- "attachment",
- fileboundary);
- if(result)
- break;
- result = formdata_add_filename(file, &form, &size);
- if(result)
- break;
- }
- else if(post->flags & (HTTPPOST_FILENAME|HTTPPOST_BUFFER|
- HTTPPOST_CALLBACK)) {
- /* it should be noted that for the HTTPPOST_FILENAME and
- HTTPPOST_CALLBACK cases the ->showfilename struct member is always
- assigned at this point */
- if(post->showfilename || (post->flags & HTTPPOST_FILENAME)) {
- result = formdata_add_filename(post, &form, &size);
- }
+ /* Generate all the part contents. */
+ for(file = post; !result && file; file = file->more) {
+ /* Create the part. */
+ part = curl_mime_addpart(multipart);
+ if(!part)
+ result = CURLE_OUT_OF_MEMORY;
- if(result)
- break;
- }
+ /* Set the headers. */
+ if(!result)
+ result = curl_mime_headers(part, file->contentheader, 0);
- if(file->contenttype) {
- /* we have a specified type */
- result = AddFormDataf(&form, &size,
- "\r\nContent-Type: %s",
- file->contenttype);
- if(result)
- break;
- }
+ /* Set the content type. */
+ if(!result && file->contenttype)
+ result = curl_mime_type(part, file->contenttype);
- curList = file->contentheader;
- while(curList) {
- /* Process the additional headers specified for this form */
- result = AddFormDataf(&form, &size, "\r\n%s", curList->data);
- if(result)
- break;
- curList = curList->next;
- }
- if(result)
- break;
+ /* Set field name. */
+ if(!result && !post->more)
+ result = setname(part, post->name, post->namelength);
- result = AddFormDataf(&form, &size, "\r\n\r\n");
- if(result)
- break;
+ /* Process contents. */
+ if(!result) {
+ curl_off_t clen = post->contentslength;
- if((post->flags & HTTPPOST_FILENAME) ||
- (post->flags & HTTPPOST_READFILE)) {
- /* we should include the contents from the specified file */
- FILE *fileread;
-
- fileread = !strcmp("-", file->contents)?
- stdin:fopen(file->contents, "rb"); /* binary read for win32 */
-
- /*
- * VMS: This only allows for stream files on VMS. Stream files are
- * OK, as are FIXED & VAR files WITHOUT implied CC For implied CC,
- * every record needs to have a \n appended & 1 added to SIZE
- */
-
- if(fileread) {
- if(fileread != stdin) {
- /* close the file */
- fclose(fileread);
- /* add the file name only - for later reading from this */
- result = AddFormData(&form, FORM_FILE, file->contents, 0, &size);
- }
- else {
- /* When uploading from stdin, we can't know the size of the file,
- * thus must read the full file as before. We *could* use chunked
- * transfer-encoding, but that only works for HTTP 1.1 and we
- * can't be sure we work with such a server.
- */
- size_t nread;
- char buffer[512];
- while((nread = fread(buffer, 1, sizeof(buffer), fileread)) != 0) {
- result = AddFormData(&form, FORM_CONTENT, buffer, nread, &size);
- if(result || feof(fileread) || ferror(fileread))
- break;
- }
+ if(post->flags & CURL_HTTPPOST_LARGE)
+ clen = post->contentlen;
+ if(!clen)
+ clen = -1;
+
+ if(post->flags & (HTTPPOST_FILENAME | HTTPPOST_READFILE)) {
+ if(!strcmp(file->contents, "-")) {
+ /* There are a few cases where the code below won't work; in
+ particular, freopen(stdin) by the caller is not guaranteed
+ to result as expected. This feature has been kept for backward
+ compatibility: use of "-" pseudo file name should be avoided. */
+ result = curl_mime_data_cb(part, (curl_off_t) -1,
+ (curl_read_callback) fread,
+ (curl_seek_callback) fseek,
+ NULL, (void *) stdin);
}
+ else
+ result = curl_mime_filedata(part, file->contents);
+ if(!result && (post->flags & HTTPPOST_READFILE))
+ result = curl_mime_filename(part, NULL);
}
+ else if(post->flags & HTTPPOST_BUFFER)
+ result = curl_mime_data(part, post->buffer,
+ post->bufferlength? post->bufferlength: -1);
+ else if(post->flags & HTTPPOST_CALLBACK)
+ /* the contents should be read with the callback and the size is set
+ with the contentslength */
+ result = curl_mime_data_cb(part, clen,
+ fread_func, NULL, NULL, post->userp);
else {
- if(data)
- failf(data, "couldn't open file \"%s\"", file->contents);
- *finalform = NULL;
- result = CURLE_READ_ERROR;
+ result = curl_mime_data(part, post->contents, (ssize_t) clen);
+#ifdef CURL_DOES_CONVERSIONS
+ /* Convert textual contents now. */
+ if(!result && data && part->datasize)
+ result = Curl_convert_to_network(data, part->data, part->datasize);
+#endif
}
}
- else if(post->flags & HTTPPOST_BUFFER)
- /* include contents of buffer */
- result = AddFormData(&form, FORM_CONTENT, post->buffer,
- post->bufferlength, &size);
- else if(post->flags & HTTPPOST_CALLBACK)
- /* the contents should be read with the callback and the size is set
- with the contentslength */
- result = AddFormData(&form, FORM_CALLBACK, post->userp,
- post->flags&CURL_HTTPPOST_LARGE?
- post->contentlen:post->contentslength, &size);
- else
- /* include the contents we got */
- result = AddFormData(&form, FORM_CONTENT, post->contents,
- post->flags&CURL_HTTPPOST_LARGE?
- post->contentlen:post->contentslength, &size);
- file = file->more;
- } while(file && !result); /* for each specified file for this field */
-
- if(result)
- break;
- if(post->more) {
- /* this was a multiple-file inclusion, make a termination file
- boundary: */
- result = AddFormDataf(&form, &size,
- "\r\n--%s--",
- fileboundary);
- if(result)
- break;
+ /* Set fake file name. */
+ if(!result && post->showfilename)
+ if(post->more || (post->flags & (HTTPPOST_FILENAME | HTTPPOST_BUFFER |
+ HTTPPOST_CALLBACK)))
+ result = curl_mime_filename(part, post->showfilename);
}
- post = post->next;
- } while(post); /* for each field */
-
- /* end-boundary for everything */
- if(!result)
- result = AddFormDataf(&form, &size, "\r\n--%s--\r\n", boundary);
-
- if(result) {
- Curl_formclean(&firstform);
- return result;
}
- *sizep = size;
- *finalform = firstform;
+ if(result)
+ Curl_mime_cleanpart(finalform);
return result;
}
-/*
- * Curl_FormInit() inits the struct 'form' points to with the 'formdata'
- * and resets the 'sent' counter.
- */
-int Curl_FormInit(struct Form *form, struct FormData *formdata)
-{
- if(!formdata)
- return 1; /* error */
-
- form->data = formdata;
- form->sent = 0;
- form->fp = NULL;
- form->fread_func = ZERO_NULL;
-
- return 0;
-}
-
-#ifndef __VMS
-# define fopen_read fopen
-#else
- /*
- * vmsfopenread
- *
- * For upload to work as expected on VMS, different optional
- * parameters must be added to the fopen command based on
- * record format of the file.
- *
- */
-# define fopen_read vmsfopenread
-static FILE * vmsfopenread(const char *file, const char *mode)
-{
- struct_stat statbuf;
- int result;
-
- result = stat(file, &statbuf);
-
- switch(statbuf.st_fab_rfm) {
- case FAB$C_VAR:
- case FAB$C_VFC:
- case FAB$C_STMCR:
- return fopen(file, FOPEN_READTEXT); /* VMS */
- break;
- default:
- return fopen(file, FOPEN_READTEXT, "rfm=stmlf", "ctx=stm");
- }
-}
-#endif
-
-/*
- * readfromfile()
- *
- * The read callback that this function may use can return a value larger than
- * 'size' (which then this function returns) that indicates a problem and it
- * must be properly dealt with
- */
-static size_t readfromfile(struct Form *form, char *buffer,
- size_t size)
-{
- size_t nread;
- bool callback = (form->data->type == FORM_CALLBACK)?TRUE:FALSE;
-
- if(callback) {
- if(form->fread_func == ZERO_NULL)
- return 0;
- nread = form->fread_func(buffer, 1, size, form->data->line);
- }
- else {
- if(!form->fp) {
- /* this file hasn't yet been opened */
- form->fp = fopen_read(form->data->line, "rb"); /* b is for binary */
- if(!form->fp)
- return (size_t)-1; /* failure */
- }
- nread = fread(buffer, 1, size, form->fp);
- }
- if(!nread) {
- /* this is the last chunk from the file, move on */
- if(form->fp) {
- fclose(form->fp);
- form->fp = NULL;
- }
- form->data = form->data->next;
- }
-
- return nread;
-}
-
-/*
- * Curl_FormReader() is the fread() emulation function that will be used to
- * deliver the formdata to the transfer loop and then sent away to the peer.
- */
-size_t Curl_FormReader(char *buffer,
- size_t size,
- size_t nitems,
- FILE *mydata)
-{
- struct Form *form;
- size_t wantedsize;
- size_t gotsize = 0;
-
- form=(struct Form *)mydata;
-
- wantedsize = size * nitems;
-
- if(!form->data)
- return 0; /* nothing, error, empty */
-
- if((form->data->type == FORM_FILE) ||
- (form->data->type == FORM_CALLBACK)) {
- gotsize = readfromfile(form, buffer, wantedsize);
-
- if(gotsize)
- /* If positive or -1, return. If zero, continue! */
- return gotsize;
- }
- do {
-
- if((form->data->length - form->sent) > wantedsize - gotsize) {
-
- memcpy(buffer + gotsize, form->data->line + form->sent,
- wantedsize - gotsize);
-
- form->sent += wantedsize-gotsize;
-
- return wantedsize;
- }
-
- memcpy(buffer+gotsize,
- form->data->line + form->sent,
- (form->data->length - form->sent) );
- gotsize += form->data->length - form->sent;
-
- form->sent = 0;
-
- form->data = form->data->next; /* advance */
-
- } while(form->data && (form->data->type < FORM_CALLBACK));
- /* If we got an empty line and we have more data, we proceed to the next
- line immediately to avoid returning zero before we've reached the end. */
-
- return gotsize;
-}
-
-/*
- * Curl_formpostheader() returns the first line of the formpost, the
- * request-header part (which is not part of the request-body like the rest of
- * the post).
- */
-char *Curl_formpostheader(void *formp, size_t *len)
-{
- char *header;
- struct Form *form=(struct Form *)formp;
-
- if(!form->data)
- return NULL; /* nothing, ERROR! */
-
- header = form->data->line;
- *len = form->data->length;
-
- form->data = form->data->next; /* advance */
-
- return header;
-}
-
-/*
- * formboundary() creates a suitable boundary string and returns an allocated
- * one.
- */
-static CURLcode formboundary(struct Curl_easy *data,
- char *buffer, size_t buflen)
-{
- /* 24 dashes and 16 hexadecimal digits makes 64 bit (18446744073709551615)
- combinations */
- if(buflen < 41)
- return CURLE_BAD_FUNCTION_ARGUMENT;
-
- memset(buffer, '-', 24);
- Curl_rand_hex(data, (unsigned char *)&buffer[24], 17);
-
- return CURLE_OK;
-}
-
#else /* CURL_DISABLE_HTTP */
CURLFORMcode curl_formadd(struct curl_httppost **httppost,
struct curl_httppost **last_post,
diff --git a/lib/formdata.h b/lib/formdata.h
index 69629f6..1246c2b 100644
--- a/lib/formdata.h
+++ b/lib/formdata.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,32 +22,6 @@
*
***************************************************************************/
-enum formtype {
- FORM_DATAMEM, /* already allocated FORM_DATA memory */
- FORM_DATA, /* form metadata (convert to network encoding if necessary) */
- FORM_CONTENT, /* form content (never convert) */
- FORM_CALLBACK, /* 'line' points to the custom pointer we pass to the callback
- */
- FORM_FILE /* 'line' points to a file name we should read from
- to create the form data (never convert) */
-};
-
-/* plain and simple linked list with lines to send */
-struct FormData {
- struct FormData *next;
- enum formtype type;
- char *line;
- size_t length;
-};
-
-struct Form {
- struct FormData *data; /* current form line to send */
- size_t sent; /* number of bytes of the current line that has
- already been sent in a previous invoke */
- FILE *fp; /* file to read from */
- curl_read_callback fread_func; /* fread callback pointer */
-};
-
/* used by FormAdd for temporary storage */
typedef struct FormInfo {
char *name;
@@ -69,31 +43,9 @@ typedef struct FormInfo {
struct FormInfo *more;
} FormInfo;
-int Curl_FormInit(struct Form *form, struct FormData *formdata);
-
CURLcode Curl_getformdata(struct Curl_easy *data,
- struct FormData **,
+ curl_mimepart *,
struct curl_httppost *post,
- const char *custom_contenttype,
- curl_off_t *size);
-
-/* fread() emulation */
-size_t Curl_FormReader(char *buffer,
- size_t size,
- size_t nitems,
- FILE *mydata);
-
-/*
- * Curl_formpostheader() returns the first line of the formpost, the
- * request-header part (which is not part of the request-body like the rest of
- * the post).
- */
-char *Curl_formpostheader(void *formp, size_t *len);
-
-char *Curl_FormBoundary(void);
-
-void Curl_formclean(struct FormData **);
-
-CURLcode Curl_formconvert(struct Curl_easy *, struct FormData *);
+ curl_read_callback fread_func);
#endif /* HEADER_CURL_FORMDATA_H */
diff --git a/lib/ftp.c b/lib/ftp.c
index 6e86e53..8042edf 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -182,7 +182,8 @@ const struct Curl_handler Curl_handler_ftp = {
PORT_FTP, /* defport */
CURLPROTO_FTP, /* protocol */
PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD |
- PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP /* flags */
+ PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP |
+ PROTOPT_WILDCARD /* flags */
};
@@ -210,7 +211,7 @@ const struct Curl_handler Curl_handler_ftps = {
PORT_FTPS, /* defport */
CURLPROTO_FTPS, /* protocol */
PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION |
- PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY /* flags */
+ PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY | PROTOPT_WILDCARD /* flags */
};
#endif
@@ -239,9 +240,9 @@ static void freedirs(struct ftp_conn *ftpc)
{
int i;
if(ftpc->dirs) {
- for(i=0; i < ftpc->dirdepth; i++) {
+ for(i = 0; i < ftpc->dirdepth; i++) {
free(ftpc->dirs[i]);
- ftpc->dirs[i]=NULL;
+ ftpc->dirs[i] = NULL;
}
free(ftpc->dirs);
ftpc->dirs = NULL;
@@ -288,7 +289,7 @@ static CURLcode AcceptServerConnect(struct connectdata *conn)
if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) {
size = sizeof(add);
- s=accept(sock, (struct sockaddr *) &add, &size);
+ s = accept(sock, (struct sockaddr *) &add, &size);
}
Curl_closesocket(conn, sock); /* close the first socket */
@@ -332,16 +333,16 @@ static CURLcode AcceptServerConnect(struct connectdata *conn)
* Curl_pgrsTime(..., TIMER_STARTACCEPT);
*
*/
-static time_t ftp_timeleft_accept(struct Curl_easy *data)
+static timediff_t ftp_timeleft_accept(struct Curl_easy *data)
{
- time_t timeout_ms = DEFAULT_ACCEPT_TIMEOUT;
- time_t other;
+ timediff_t timeout_ms = DEFAULT_ACCEPT_TIMEOUT;
+ timediff_t other;
struct curltime now;
if(data->set.accepttimeout > 0)
timeout_ms = data->set.accepttimeout;
- now = Curl_tvnow();
+ now = Curl_now();
/* check if the generic timeout possibly is set shorter */
other = Curl_timeleft(data, &now, FALSE);
@@ -351,7 +352,7 @@ static time_t ftp_timeleft_accept(struct Curl_easy *data)
timeout_ms = other;
else {
/* subtract elapsed time */
- timeout_ms -= Curl_tvdiff(now, data->progress.t_acceptdata);
+ timeout_ms -= Curl_timediff(now, data->progress.t_acceptdata);
if(!timeout_ms)
/* avoid returning 0 as that means no timeout! */
return -1;
@@ -457,7 +458,7 @@ static CURLcode InitiateTransfer(struct connectdata *conn)
}
if(conn->proto.ftpc.state_saved == FTP_STOR) {
- *(ftp->bytecountp)=0;
+ *(ftp->bytecountp) = 0;
/* When we know we're uploading a specified file, we can get the file
size prior to the actual upload. */
@@ -592,7 +593,7 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
#endif
/* store the latest code for later retrieval */
- data->info.httpcode=code;
+ data->info.httpcode = code;
if(ftpcode)
*ftpcode = code;
@@ -640,8 +641,8 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
struct ftp_conn *ftpc = &conn->proto.ftpc;
struct pingpong *pp = &ftpc->pp;
size_t nread;
- int cache_skip=0;
- int value_to_be_ignored=0;
+ int cache_skip = 0;
+ int value_to_be_ignored = 0;
if(ftpcode)
*ftpcode = 0; /* 0 for errors */
@@ -649,13 +650,13 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
/* make the pointer point to something for the rest of this function */
ftpcode = &value_to_be_ignored;
- *nreadp=0;
+ *nreadp = 0;
while(!*ftpcode && !result) {
/* check and reset timeout value every lap */
timeout = Curl_pp_state_timeout(pp);
- if(timeout <=0) {
+ if(timeout <= 0) {
failf(data, "FTP response timeout");
return CURLE_OPERATION_TIMEDOUT; /* already too little time */
}
@@ -713,7 +714,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
else
/* when we got data or there is no cache left, we reset the cache skip
counter */
- cache_skip=0;
+ cache_skip = 0;
*nreadp += nread;
@@ -848,7 +849,7 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
int i;
/* PORT is used to tell the server to connect to us, and during that we
don't do happy eyeballs, but we do if we connect to the server */
- for(s=1, i=0; i<2; i++) {
+ for(s = 1, i = 0; i<2; i++) {
if(conn->tempsock[i] != CURL_SOCKET_BAD) {
socks[s] = conn->tempsock[i];
bits |= GETSOCK_WRITESOCK(s++);
@@ -885,7 +886,7 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
/* count3 is set to allow a MKD to fail once. In the case when first CWD
fails and then MKD fails (due to another session raced it to create the
dir) this then allows for a second try to CWD to it */
- ftpc->count3 = (conn->data->set.ftp_create_missing_dirs==2)?1:0;
+ ftpc->count3 = (conn->data->set.ftp_create_missing_dirs == 2)?1:0;
if((conn->data->set.ftp_filemethod == FTPFILE_NOCWD) && !ftpc->cwdcount)
/* No CWD necessary */
@@ -928,15 +929,15 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
{
CURLcode result = CURLE_OK;
struct ftp_conn *ftpc = &conn->proto.ftpc;
- struct Curl_easy *data=conn->data;
- curl_socket_t portsock= CURL_SOCKET_BAD;
+ struct Curl_easy *data = conn->data;
+ curl_socket_t portsock = CURL_SOCKET_BAD;
char myhost[256] = "";
struct Curl_sockaddr_storage ss;
Curl_addrinfo *res, *ai;
curl_socklen_t sslen;
char hbuf[NI_MAXHOST];
- struct sockaddr *sa=(struct sockaddr *)&ss;
+ struct sockaddr *sa = (struct sockaddr *)&ss;
struct sockaddr_in * const sa4 = (void *)sa;
#ifdef ENABLE_IPV6
struct sockaddr_in6 * const sa6 = (void *)sa;
@@ -947,7 +948,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
int error;
char *host = NULL;
char *string_ftpport = data->set.str[STRING_FTPPORT];
- struct Curl_dns_entry *h=NULL;
+ struct Curl_dns_entry *h = NULL;
unsigned short port_min = 0;
unsigned short port_max = 0;
unsigned short port;
@@ -975,7 +976,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
char *port_start = NULL;
char *port_sep = NULL;
- addr = calloc(addrlen+1, 1);
+ addr = calloc(addrlen + 1, 1);
if(!addr)
return CURLE_OUT_OF_MEMORY;
@@ -1018,7 +1019,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
if(ip_end != NULL) {
port_start = strchr(ip_end, ':');
if(port_start) {
- port_min = curlx_ultous(strtoul(port_start+1, NULL, 10));
+ port_min = curlx_ultous(strtoul(port_start + 1, NULL, 10));
port_sep = strchr(port_start, '-');
if(port_sep) {
port_max = curlx_ultous(strtoul(port_sep + 1, NULL, 10));
@@ -1262,7 +1263,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
/* translate x.x.x.x to x,x,x,x */
while(source && *source) {
if(*source == '.')
- *dest=',';
+ *dest = ',';
else
*dest = *source;
dest++;
@@ -1457,25 +1458,22 @@ static CURLcode ftp_state_list(struct connectdata *conn)
then just do LIST (in that case: nothing to do here)
*/
char *cmd, *lstArg, *slashPos;
+ const char *inpath = data->state.path;
lstArg = NULL;
if((data->set.ftp_filemethod == FTPFILE_NOCWD) &&
- data->state.path &&
- data->state.path[0] &&
- strchr(data->state.path, '/')) {
-
- lstArg = strdup(data->state.path);
- if(!lstArg)
- return CURLE_OUT_OF_MEMORY;
+ inpath && inpath[0] && strchr(inpath, '/')) {
+ size_t n = strlen(inpath);
/* Check if path does not end with /, as then we cut off the file part */
- if(lstArg[strlen(lstArg) - 1] != '/') {
-
+ if(inpath[n - 1] != '/') {
/* chop off the file part if format is dir/dir/file */
- slashPos = strrchr(lstArg, '/');
- if(slashPos)
- *(slashPos+1) = '\0';
+ slashPos = strrchr(inpath, '/');
+ n = slashPos - inpath;
}
+ result = Curl_urldecode(data, inpath, n, &lstArg, NULL, FALSE);
+ if(result)
+ return result;
}
cmd = aprintf("%s%s%s",
@@ -1622,7 +1620,7 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
}
if(seekerr != CURL_SEEKFUNC_OK) {
- curl_off_t passed=0;
+ curl_off_t passed = 0;
if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
failf(data, "Could not seek stream");
return CURLE_FTP_COULDNT_USE_REST;
@@ -1684,7 +1682,7 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct FTP *ftp = data->req.protop;
struct ftp_conn *ftpc = &conn->proto.ftpc;
- bool quote=FALSE;
+ bool quote = FALSE;
struct curl_slist *item;
switch(instate) {
@@ -1821,11 +1819,11 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
{
struct ftp_conn *ftpc = &conn->proto.ftpc;
CURLcode result;
- struct Curl_easy *data=conn->data;
- struct Curl_dns_entry *addr=NULL;
+ struct Curl_easy *data = conn->data;
+ struct Curl_dns_entry *addr = NULL;
int rc;
unsigned short connectport; /* the local port connect() should use! */
- char *str=&data->state.buffer[4]; /* start on the first letter */
+ char *str = &data->state.buffer[4]; /* start on the first letter */
/* if we come here again, make sure the former name is cleared */
Curl_safefree(ftpc->newhost);
@@ -1849,9 +1847,9 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
/* The four separators should be identical, or else this is an oddly
formatted reply and we bail out immediately. */
- for(i=1; i<4; i++) {
+ for(i = 1; i<4; i++) {
if(separator[i] != sep1) {
- ptr=NULL; /* set to NULL to signal error */
+ ptr = NULL; /* set to NULL to signal error */
break;
}
}
@@ -1867,7 +1865,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
}
}
else
- ptr=NULL;
+ ptr = NULL;
}
if(!ptr) {
failf(data, "Weirdly formatted EPSV reply");
@@ -1877,8 +1875,8 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
else if((ftpc->count1 == 1) &&
(ftpcode == 227)) {
/* positive PASV response */
- int ip[4];
- int port[2];
+ unsigned int ip[4];
+ unsigned int port[2];
/*
* Scan for a sequence of six comma-separated numbers and use them as
@@ -1890,14 +1888,15 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
* "227 Entering passive mode. 127,0,0,1,4,51"
*/
while(*str) {
- if(6 == sscanf(str, "%d,%d,%d,%d,%d,%d",
+ if(6 == sscanf(str, "%u,%u,%u,%u,%u,%u",
&ip[0], &ip[1], &ip[2], &ip[3],
&port[0], &port[1]))
break;
str++;
}
- if(!*str) {
+ if(!*str || (ip[0] > 255) || (ip[1] > 255) || (ip[2] > 255) ||
+ (ip[3] > 255) || (port[0] > 255) || (port[1] > 255) ) {
failf(data, "Couldn't interpret the 227-response");
return CURLE_FTP_WEIRD_227_FORMAT;
}
@@ -2041,7 +2040,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
int ftpcode)
{
CURLcode result = CURLE_OK;
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
struct FTP *ftp = data->req.protop;
struct ftp_conn *ftpc = &conn->proto.ftpc;
@@ -2055,7 +2054,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
&year, &month, &day, &hour, &minute, &second)) {
/* we have a time, reformat it */
char timebuf[24];
- time_t secs=time(NULL);
+ time_t secs = time(NULL);
snprintf(timebuf, sizeof(timebuf),
"%04d%02d%02d %02d:%02d:%02d GMT",
@@ -2071,7 +2070,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
if(data->set.opt_no_body &&
ftpc->file &&
data->set.get_filetime &&
- (data->info.filetime>=0) ) {
+ (data->info.filetime >= 0) ) {
char headerbuf[128];
time_t filetime = (time_t)data->info.filetime;
struct tm buffer;
@@ -2147,7 +2146,7 @@ static CURLcode ftp_state_type_resp(struct connectdata *conn,
ftpstate instate)
{
CURLcode result = CURLE_OK;
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
if(ftpcode/100 != 2) {
/* "sasserftpd" and "(u)r(x)bot ftpd" both responds with 226 after a
@@ -2176,7 +2175,7 @@ static CURLcode ftp_state_retr(struct connectdata *conn,
curl_off_t filesize)
{
CURLcode result = CURLE_OK;
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
struct FTP *ftp = data->req.protop;
struct ftp_conn *ftpc = &conn->proto.ftpc;
@@ -2259,12 +2258,14 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
ftpstate instate)
{
CURLcode result = CURLE_OK;
- struct Curl_easy *data=conn->data;
- curl_off_t filesize;
+ struct Curl_easy *data = conn->data;
+ curl_off_t filesize = -1;
char *buf = data->state.buffer;
/* get the size from the ascii string: */
- filesize = (ftpcode == 213)?curlx_strtoofft(buf+4, NULL, 0):-1;
+ if(ftpcode == 213)
+ /* ignores parsing errors, which will make the size remain unknown */
+ (void)curlx_strtoofft(buf + 4, NULL, 0, &filesize);
if(instate == FTP_SIZE) {
#ifdef CURL_FTP_HTTPSTYLE_HEAD
@@ -2334,7 +2335,7 @@ static CURLcode ftp_state_stor_resp(struct connectdata *conn,
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
- if(ftpcode>=400) {
+ if(ftpcode >= 400) {
failf(data, "Failed FTP upload: %0d", ftpcode);
state(conn, FTP_STOP);
/* oops, we never close the sockets! */
@@ -2392,7 +2393,7 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn,
E:
125 Data connection already open; Transfer starting. */
- curl_off_t size=-1; /* default unknown size */
+ curl_off_t size = -1; /* default unknown size */
/*
@@ -2416,9 +2417,9 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn,
* Example D above makes this parsing a little tricky */
char *bytes;
char *buf = data->state.buffer;
- bytes=strstr(buf, " bytes");
- if(bytes--) {
- long in=(long)(bytes-buf);
+ bytes = strstr(buf, " bytes");
+ if(bytes) {
+ long in = (long)(--bytes-buf);
/* this is a hint there is size information in there! ;-) */
while(--in) {
/* scan for the left parenthesis and break there */
@@ -2426,7 +2427,7 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn,
break;
/* skip only digits */
if(!ISDIGIT(*bytes)) {
- bytes=NULL;
+ bytes = NULL;
break;
}
/* one more estep backwards */
@@ -2435,7 +2436,7 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn,
/* if we have nothing but digits: */
if(bytes++) {
/* get the number! */
- size = curlx_strtoofft(bytes, NULL, 0);
+ (void)curlx_strtoofft(bytes, NULL, 0, &size);
}
}
}
@@ -2598,7 +2599,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
{
CURLcode result;
curl_socket_t sock = conn->sock[FIRSTSOCKET];
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
int ftpcode;
struct ftp_conn *ftpc = &conn->proto.ftpc;
struct pingpong *pp = &ftpc->pp;
@@ -2650,7 +2651,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
/* We don't have a SSL/TLS connection yet, but FTPS is
requested. Try a FTPS connection now */
- ftpc->count3=0;
+ ftpc->count3 = 0;
switch(data->set.ftpsslauth) {
case CURLFTPAUTH_DEFAULT:
case CURLFTPAUTH_SSL:
@@ -2773,10 +2774,11 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
case FTP_PWD:
if(ftpcode == 257) {
- char *ptr=&data->state.buffer[4]; /* start on the first letter */
+ char *ptr = &data->state.buffer[4]; /* start on the first letter */
const size_t buf_size = data->set.buffer_size;
char *dir;
char *store;
+ bool entry_extracted = FALSE;
dir = malloc(nread + 1);
if(!dir)
@@ -2808,7 +2810,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
}
else {
/* end of path */
- *store = '\0'; /* zero terminate */
+ entry_extracted = TRUE;
break; /* get out of this loop */
}
}
@@ -2817,7 +2819,9 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
store++;
ptr++;
}
-
+ *store = '\0'; /* zero terminate */
+ }
+ if(entry_extracted) {
/* If the path name does not look like an absolute path (i.e.: it
does not start with a '/'), we probably need some server-dependent
adjustments. For example, this is the case when connecting to
@@ -2864,7 +2868,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
case FTP_SYST:
if(ftpcode == 215) {
- char *ptr=&data->state.buffer[4]; /* start on the first letter */
+ char *ptr = &data->state.buffer[4]; /* start on the first letter */
char *os;
char *store;
@@ -2955,7 +2959,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
}
else {
/* success */
- ftpc->count2=0;
+ ftpc->count2 = 0;
if(++ftpc->cwdcount <= ftpc->dirdepth) {
/* send next CWD */
PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->cwdcount - 1]);
@@ -3174,7 +3178,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
/* now store a copy of the directory we are in */
free(ftpc->prevpath);
- if(data->set.wildcardmatch) {
+ if(data->state.wildcardmatch) {
if(data->set.chunk_end && ftpc->file) {
data->set.chunk_end(data->wildcard.customptr);
}
@@ -3195,15 +3199,16 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
size_t flen = ftpc->file?strlen(ftpc->file):0; /* file is "raw" already */
size_t dlen = strlen(path)-flen;
if(!ftpc->cwdfail) {
+ ftpc->prevmethod = data->set.ftp_filemethod;
if(dlen && (data->set.ftp_filemethod != FTPFILE_NOCWD)) {
ftpc->prevpath = path;
if(flen)
/* if 'path' is not the whole string */
- ftpc->prevpath[dlen]=0; /* terminate */
+ ftpc->prevpath[dlen] = 0; /* terminate */
}
else {
/* we never changed dir */
- ftpc->prevpath=strdup("");
+ ftpc->prevpath = strdup("");
free(path);
}
if(ftpc->prevpath)
@@ -3257,7 +3262,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
long old_time = pp->response_time;
pp->response_time = 60*1000; /* give it only a minute for now */
- pp->response = Curl_tvnow(); /* timeout relative now */
+ pp->response = Curl_now(); /* timeout relative now */
result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
@@ -3377,7 +3382,7 @@ CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
PPSENDF(&conn->proto.ftpc.pp, "%s", cmd);
- pp->response = Curl_tvnow(); /* timeout relative now */
+ pp->response = Curl_now(); /* timeout relative now */
result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(result)
@@ -3466,35 +3471,36 @@ static CURLcode ftp_range(struct connectdata *conn)
{
curl_off_t from, to;
char *ptr;
- char *ptr2;
struct Curl_easy *data = conn->data;
struct ftp_conn *ftpc = &conn->proto.ftpc;
if(data->state.use_range && data->state.range) {
- from=curlx_strtoofft(data->state.range, &ptr, 0);
- while(*ptr && (ISSPACE(*ptr) || (*ptr=='-')))
+ CURLofft from_t;
+ CURLofft to_t;
+ from_t = curlx_strtoofft(data->state.range, &ptr, 0, &from);
+ if(from_t == CURL_OFFT_FLOW)
+ return CURLE_RANGE_ERROR;
+ while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
ptr++;
- to=curlx_strtoofft(ptr, &ptr2, 0);
- if(ptr == ptr2) {
- /* we didn't get any digit */
- to=-1;
- }
- if((-1 == to) && (from>=0)) {
+ to_t = curlx_strtoofft(ptr, NULL, 0, &to);
+ if(to_t == CURL_OFFT_FLOW)
+ return CURLE_RANGE_ERROR;
+ if((to_t == CURL_OFFT_INVAL) && !from_t) {
/* X - */
data->state.resume_from = from;
DEBUGF(infof(conn->data, "FTP RANGE %" CURL_FORMAT_CURL_OFF_T
" to end of file\n", from));
}
- else if(from < 0) {
+ else if(!to_t && (from_t == CURL_OFFT_INVAL)) {
/* -Y */
- data->req.maxdownload = -from;
- data->state.resume_from = from;
+ data->req.maxdownload = to;
+ data->state.resume_from = -to;
DEBUGF(infof(conn->data, "FTP RANGE the last %" CURL_FORMAT_CURL_OFF_T
- " bytes\n", -from));
+ " bytes\n", to));
}
else {
/* X-Y */
- data->req.maxdownload = (to-from)+1; /* include last byte */
+ data->req.maxdownload = (to - from) + 1; /* include last byte */
data->state.resume_from = from;
DEBUGF(infof(conn->data, "FTP RANGE from %" CURL_FORMAT_CURL_OFF_T
" getting %" CURL_FORMAT_CURL_OFF_T " bytes\n",
@@ -3525,7 +3531,7 @@ static CURLcode ftp_range(struct connectdata *conn)
static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
{
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
struct ftp_conn *ftpc = &conn->proto.ftpc;
CURLcode result = CURLE_OK;
bool connected = FALSE;
@@ -3692,7 +3698,7 @@ CURLcode ftp_perform(struct connectdata *conn,
bool *dophase_done)
{
/* this is FTP and no proxy */
- CURLcode result=CURLE_OK;
+ CURLcode result = CURLE_OK;
DEBUGF(infof(conn->data, "DO phase starts\n"));
@@ -3957,7 +3963,7 @@ static CURLcode ftp_do(struct connectdata *conn, bool *done)
*done = FALSE; /* default to false */
ftpc->wait_data_conn = FALSE; /* default to no such wait */
- if(conn->data->set.wildcardmatch) {
+ if(conn->data->state.wildcardmatch) {
result = wc_statemach(conn);
if(conn->data->wildcard.state == CURLWC_SKIP ||
conn->data->wildcard.state == CURLWC_DONE) {
@@ -3985,7 +3991,7 @@ CURLcode Curl_ftpsend(struct connectdata *conn, const char *cmd)
#define SBUF_SIZE 1024
char s[SBUF_SIZE];
size_t write_len;
- char *sptr=s;
+ char *sptr = s;
CURLcode result = CURLE_OK;
#ifdef HAVE_GSSAPI
enum protection_level data_sec = conn->data_prot;
@@ -3996,9 +4002,8 @@ CURLcode Curl_ftpsend(struct connectdata *conn, const char *cmd)
return CURLE_BAD_FUNCTION_ARGUMENT;
strcpy(&s[write_len], "\r\n"); /* append a trailing CRLF */
- write_len +=2;
-
- bytes_written=0;
+ write_len += 2;
+ bytes_written = 0;
result = Curl_convert_to_network(conn->data, s, write_len);
/* Curl_convert_to_network calls failf if unsuccessful */
@@ -4076,7 +4081,7 @@ static CURLcode ftp_quit(struct connectdata *conn)
*/
static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection)
{
- struct ftp_conn *ftpc= &conn->proto.ftpc;
+ struct ftp_conn *ftpc = &conn->proto.ftpc;
struct pingpong *pp = &ftpc->pp;
/* We cannot send quit unconditionally. If this connection is stale or
@@ -4172,7 +4177,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
ftpc->dirdepth = 0;
break;
}
- slash_pos=strrchr(cur_pos, '/');
+ slash_pos = strrchr(cur_pos, '/');
if(slash_pos || !*cur_pos) {
size_t dirlen = slash_pos-cur_pos;
CURLcode result;
@@ -4193,7 +4198,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
return result;
}
ftpc->dirdepth = 1; /* we consider it to be a single dir */
- filename = slash_pos ? slash_pos+1 : cur_pos; /* rest is file name */
+ filename = slash_pos ? slash_pos + 1 : cur_pos; /* rest is file name */
}
else
filename = cur_pos; /* this is a file name only */
@@ -4277,8 +4282,8 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
}
}
else
- ftpc->file=NULL; /* instead of point to a zero byte, we make it a NULL
- pointer */
+ ftpc->file = NULL; /* instead of point to a zero byte, we make it a NULL
+ pointer */
if(data->set.upload && !ftpc->file && (ftp->transfer == FTPTRANSFER_BODY)) {
/* We need a file name when uploading. Return error! */
@@ -4302,7 +4307,8 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
dlen -= ftpc->file?strlen(ftpc->file):0;
if((dlen == strlen(ftpc->prevpath)) &&
- !strncmp(path, ftpc->prevpath, dlen)) {
+ !strncmp(path, ftpc->prevpath, dlen) &&
+ (ftpc->prevmethod == data->set.ftp_filemethod)) {
infof(data, "Request has same path as previous transfer\n");
ftpc->cwddone = TRUE;
}
@@ -4373,8 +4379,8 @@ static
CURLcode ftp_regular_transfer(struct connectdata *conn,
bool *dophase_done)
{
- CURLcode result=CURLE_OK;
- bool connected=FALSE;
+ CURLcode result = CURLE_OK;
+ bool connected = FALSE;
struct Curl_easy *data = conn->data;
struct ftp_conn *ftpc = &conn->proto.ftpc;
data->req.size = -1; /* make sure this is unknown at this point */
diff --git a/lib/ftp.h b/lib/ftp.h
index 9c6c2c8..e4aa63f 100644
--- a/lib/ftp.h
+++ b/lib/ftp.h
@@ -135,6 +135,7 @@ struct ftp_conn {
caching the current directory */
bool wait_data_conn; /* this is set TRUE if data connection is waited */
char *prevpath; /* conn->path from the previous transfer */
+ curl_ftpfile prevmethod; /* ftp method in previous transfer */
char transfertype; /* set by ftp_transfertype for use by Curl_client_write()a
and others (A/I or zero) */
int count1; /* general purpose counter for the state machine */
diff --git a/lib/ftplistparser.c b/lib/ftplistparser.c
index 2acce31..262ac03 100644
--- a/lib/ftplistparser.c
+++ b/lib/ftplistparser.c
@@ -264,16 +264,6 @@ static int ftp_pl_get_permission(const char *str)
return permissions;
}
-static void PL_ERROR(struct connectdata *conn, CURLcode err)
-{
- struct ftp_wc_tmpdata *tmpdata = conn->data->wildcard.tmp;
- struct ftp_parselist_data *parser = tmpdata->parser;
- if(parser->file_data)
- Curl_fileinfo_dtor(NULL, parser->file_data);
- parser->file_data = NULL;
- parser->error = err;
-}
-
static CURLcode ftp_pl_insert_finfo(struct connectdata *conn,
struct fileinfo *infop)
{
@@ -338,6 +328,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
struct curl_fileinfo *finfo;
unsigned long i = 0;
CURLcode result;
+ size_t retsize = bufflen;
if(parser->error) { /* error in previous call */
/* scenario:
@@ -346,7 +337,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
* 3. (last) call => is skipped RIGHT HERE and the error is hadled later
* in wc_statemach()
*/
- return bufflen;
+ goto fail;
}
if(parser->os_type == OS_TYPE_UNKNOWN && bufflen > 0) {
@@ -362,12 +353,12 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->file_data = Curl_fileinfo_alloc();
if(!parser->file_data) {
parser->error = CURLE_OUT_OF_MEMORY;
- return bufflen;
+ goto fail;
}
parser->file_data->info.b_data = malloc(FTP_BUFFER_ALLOCSIZE);
if(!parser->file_data->info.b_data) {
- PL_ERROR(conn, CURLE_OUT_OF_MEMORY);
- return bufflen;
+ parser->error = CURLE_OUT_OF_MEMORY;
+ goto fail;
}
parser->file_data->info.b_size = FTP_BUFFER_ALLOCSIZE;
parser->item_offset = 0;
@@ -390,8 +381,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
Curl_fileinfo_dtor(NULL, parser->file_data);
parser->file_data = NULL;
parser->error = CURLE_OUT_OF_MEMORY;
- PL_ERROR(conn, CURLE_OUT_OF_MEMORY);
- return bufflen;
+ goto fail;
}
}
@@ -421,7 +411,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
else if(c == '\n') {
finfo->b_data[parser->item_length - 1] = 0;
if(strncmp("total ", finfo->b_data, 6) == 0) {
- char *endptr = finfo->b_data+6;
+ char *endptr = finfo->b_data + 6;
/* here we can deal with directory size, pass the leading white
spaces and then the digits */
while(ISSPACE(*endptr))
@@ -429,15 +419,15 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
while(ISDIGIT(*endptr))
endptr++;
if(*endptr != 0) {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
parser->state.UNIX.main = PL_UNIX_FILETYPE;
finfo->b_used = 0;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
}
break;
@@ -470,8 +460,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
finfo->filetype = CURLFILETYPE_DOOR;
break;
default:
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
parser->state.UNIX.main = PL_UNIX_PERMISSION;
parser->item_length = 0;
@@ -481,21 +471,21 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->item_length++;
if(parser->item_length <= 9) {
if(!strchr("rwx-tTsS", c)) {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
}
else if(parser->item_length == 10) {
unsigned int perm;
if(c != ' ') {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
finfo->b_data[10] = 0; /* terminate permissions */
perm = ftp_pl_get_permission(finfo->b_data + parser->item_offset);
if(perm & FTP_LP_MALFORMATED_PERM) {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
parser->file_data->info.flags |= CURLFINFOFLAG_KNOWN_PERM;
parser->file_data->info.perm = perm;
@@ -516,8 +506,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.hlinks = PL_UNIX_HLINKS_NUMBER;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
}
break;
@@ -538,8 +528,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.user = PL_UNIX_USER_PRESPACE;
}
else if(c < '0' || c > '9') {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
}
@@ -598,8 +588,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.size = PL_UNIX_SIZE_NUMBER;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
}
break;
@@ -609,20 +599,22 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
char *p;
curl_off_t fsize;
finfo->b_data[parser->item_offset + parser->item_length - 1] = 0;
- fsize = curlx_strtoofft(finfo->b_data+parser->item_offset, &p, 10);
- if(p[0] == '\0' && fsize != CURL_OFF_T_MAX &&
- fsize != CURL_OFF_T_MIN) {
- parser->file_data->info.flags |= CURLFINFOFLAG_KNOWN_SIZE;
- parser->file_data->info.size = fsize;
+ if(!curlx_strtoofft(finfo->b_data + parser->item_offset,
+ &p, 10, &fsize)) {
+ if(p[0] == '\0' && fsize != CURL_OFF_T_MAX &&
+ fsize != CURL_OFF_T_MIN) {
+ parser->file_data->info.flags |= CURLFINFOFLAG_KNOWN_SIZE;
+ parser->file_data->info.size = fsize;
+ }
+ parser->item_length = 0;
+ parser->item_offset = 0;
+ parser->state.UNIX.main = PL_UNIX_TIME;
+ parser->state.UNIX.sub.time = PL_UNIX_TIME_PREPART1;
}
- parser->item_length = 0;
- parser->item_offset = 0;
- parser->state.UNIX.main = PL_UNIX_TIME;
- parser->state.UNIX.sub.time = PL_UNIX_TIME_PREPART1;
}
else if(!ISDIGIT(c)) {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
}
@@ -637,8 +629,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.time = PL_UNIX_TIME_PART1;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
}
break;
@@ -648,8 +640,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.time = PL_UNIX_TIME_PREPART2;
}
else if(!ISALNUM(c) && c != '.') {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
case PL_UNIX_TIME_PREPART2:
@@ -659,8 +651,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.time = PL_UNIX_TIME_PART2;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
}
break;
@@ -670,8 +662,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.time = PL_UNIX_TIME_PREPART3;
}
else if(!ISALNUM(c) && c != '.') {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
case PL_UNIX_TIME_PREPART3:
@@ -681,8 +673,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.time = PL_UNIX_TIME_PART3;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
}
break;
@@ -706,8 +698,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
}
}
else if(!ISALNUM(c) && c != '.' && c != ':') {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
}
@@ -732,8 +724,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.main = PL_UNIX_FILETYPE;
result = ftp_pl_insert_finfo(conn, infop);
if(result) {
- PL_ERROR(conn, result);
- return bufflen;
+ parser->error = result;
+ goto fail;
}
}
break;
@@ -744,13 +736,13 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.main = PL_UNIX_FILETYPE;
result = ftp_pl_insert_finfo(conn, infop);
if(result) {
- PL_ERROR(conn, result);
- return bufflen;
+ parser->error = result;
+ goto fail;
}
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
}
@@ -770,8 +762,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.symlink = PL_UNIX_SYMLINK_PRETARGET1;
}
else if(c == '\r' || c == '\n') {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
case PL_UNIX_SYMLINK_PRETARGET1:
@@ -780,8 +772,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.symlink = PL_UNIX_SYMLINK_PRETARGET2;
}
else if(c == '\r' || c == '\n') {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
else {
parser->state.UNIX.sub.symlink = PL_UNIX_SYMLINK_NAME;
@@ -793,8 +785,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.UNIX.sub.symlink = PL_UNIX_SYMLINK_PRETARGET3;
}
else if(c == '\r' || c == '\n') {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
else {
parser->state.UNIX.sub.symlink = PL_UNIX_SYMLINK_NAME;
@@ -811,8 +803,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->item_offset = 0;
}
else if(c == '\r' || c == '\n') {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
else {
parser->state.UNIX.sub.symlink = PL_UNIX_SYMLINK_NAME;
@@ -825,8 +817,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->item_length = 1;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
case PL_UNIX_SYMLINK_TARGET:
@@ -839,8 +831,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->offsets.symlink_target = parser->item_offset;
result = ftp_pl_insert_finfo(conn, infop);
if(result) {
- PL_ERROR(conn, result);
- return bufflen;
+ parser->error = result;
+ goto fail;
}
parser->state.UNIX.main = PL_UNIX_FILETYPE;
}
@@ -851,14 +843,14 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->offsets.symlink_target = parser->item_offset;
result = ftp_pl_insert_finfo(conn, infop);
if(result) {
- PL_ERROR(conn, result);
- return bufflen;
+ parser->error = result;
+ goto fail;
}
parser->state.UNIX.main = PL_UNIX_FILETYPE;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
}
@@ -871,8 +863,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->item_length++;
if(parser->item_length < 9) {
if(!strchr("0123456789-", c)) { /* only simple control */
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
}
else if(parser->item_length == 9) {
@@ -881,13 +873,13 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->state.NT.sub.time = PL_WINNT_TIME_PRESPACE;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
case PL_WINNT_TIME:
@@ -907,8 +899,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->item_length = 0;
}
else if(!strchr("APM0123456789:", c)) {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
}
@@ -935,21 +927,11 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
}
else {
char *endptr;
- finfo->size = curlx_strtoofft(finfo->b_data +
- parser->item_offset,
- &endptr, 10);
- if(!*endptr) {
- if(finfo->size == CURL_OFF_T_MAX ||
- finfo->size == CURL_OFF_T_MIN) {
- if(errno == ERANGE) {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
- }
- }
- }
- else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ if(curlx_strtoofft(finfo->b_data +
+ parser->item_offset,
+ &endptr, 10, &finfo->size)) {
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
/* correct file type */
parser->file_data->info.filetype = CURLFILETYPE_FILE;
@@ -984,8 +966,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->offsets.filename = parser->item_offset;
result = ftp_pl_insert_finfo(conn, infop);
if(result) {
- PL_ERROR(conn, result);
- return bufflen;
+ parser->error = result;
+ goto fail;
}
parser->state.NT.main = PL_WINNT_DATE;
parser->state.NT.sub.filename = PL_WINNT_FILENAME_PRESPACE;
@@ -996,15 +978,15 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->offsets.filename = parser->item_offset;
result = ftp_pl_insert_finfo(conn, infop);
if(result) {
- PL_ERROR(conn, result);
- return bufflen;
+ parser->error = result;
+ goto fail;
}
parser->state.NT.main = PL_WINNT_DATE;
parser->state.NT.sub.filename = PL_WINNT_FILENAME_PRESPACE;
}
else {
- PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
- return bufflen;
+ parser->error = CURLE_FTP_BAD_FILE_LIST;
+ goto fail;
}
break;
}
@@ -1012,13 +994,22 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
}
break;
default:
- return bufflen + 1;
+ retsize = bufflen + 1;
+ goto fail;
}
i++;
}
- return bufflen;
+fail:
+
+ /* Clean up any allocated memory. */
+ if(parser->file_data) {
+ Curl_fileinfo_dtor(NULL, parser->file_data);
+ parser->file_data = NULL;
+ }
+
+ return retsize;
}
#endif /* CURL_DISABLE_FTP */
diff --git a/lib/getinfo.c b/lib/getinfo.c
index dc3a107..862ced0 100644
--- a/lib/getinfo.c
+++ b/lib/getinfo.c
@@ -54,6 +54,7 @@ CURLcode Curl_initinfo(struct Curl_easy *data)
pro->t_starttransfer = 0;
pro->timespent = 0;
pro->t_redirect = 0;
+ pro->is_t_startransfer_set = false;
info->httpcode = 0;
info->httpproxycode = 0;
@@ -359,46 +360,25 @@ static CURLcode getinfo_slist(struct Curl_easy *data, CURLINFO info,
struct curl_tlssessioninfo **tsip = (struct curl_tlssessioninfo **)
param_slistp;
struct curl_tlssessioninfo *tsi = &data->tsi;
+#ifdef USE_SSL
struct connectdata *conn = data->easy_conn;
+#endif
*tsip = tsi;
tsi->backend = Curl_ssl_backend();
tsi->internals = NULL;
+#ifdef USE_SSL
if(conn && tsi->backend != CURLSSLBACKEND_NONE) {
unsigned int i;
for(i = 0; i < (sizeof(conn->ssl) / sizeof(conn->ssl[0])); ++i) {
if(conn->ssl[i].use) {
-#if defined(USE_AXTLS)
- tsi->internals = (void *)conn->ssl[i].ssl;
-#elif defined(USE_CYASSL)
- tsi->internals = (void *)conn->ssl[i].handle;
-#elif defined(USE_DARWINSSL)
- tsi->internals = (void *)conn->ssl[i].ssl_ctx;
-#elif defined(USE_GNUTLS)
- tsi->internals = (void *)conn->ssl[i].session;
-#elif defined(USE_GSKIT)
- tsi->internals = (void *)conn->ssl[i].handle;
-#elif defined(USE_MBEDTLS)
- tsi->internals = (void *)&conn->ssl[i].ssl;
-#elif defined(USE_NSS)
- tsi->internals = (void *)conn->ssl[i].handle;
-#elif defined(USE_OPENSSL)
- /* Legacy: CURLINFO_TLS_SESSION must return an SSL_CTX pointer. */
- tsi->internals = ((info == CURLINFO_TLS_SESSION) ?
- (void *)conn->ssl[i].ctx :
- (void *)conn->ssl[i].handle);
-#elif defined(USE_POLARSSL)
- tsi->internals = (void *)&conn->ssl[i].ssl;
-#elif defined(USE_SCHANNEL)
- tsi->internals = (void *)&conn->ssl[i].ctxt->ctxt_handle;
-#elif defined(USE_SSL)
-#error "SSL backend specific information missing for CURLINFO_TLS_SSL_PTR"
-#endif
+ tsi->internals = Curl_ssl->get_internals(&conn->ssl[i], info);
break;
}
}
}
+#endif
}
break;
default:
diff --git a/lib/gopher.c b/lib/gopher.c
index 836f725..b7c31b6 100644
--- a/lib/gopher.c
+++ b/lib/gopher.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -73,8 +73,8 @@ const struct Curl_handler Curl_handler_gopher = {
static CURLcode gopher_do(struct connectdata *conn, bool *done)
{
- CURLcode result=CURLE_OK;
- struct Curl_easy *data=conn->data;
+ CURLcode result = CURLE_OK;
+ struct Curl_easy *data = conn->data;
curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
curl_off_t *bytecount = &data->req.bytecount;
@@ -97,11 +97,11 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
/* Otherwise, drop / and the first character (i.e., item type) ... */
newp = path;
- newp+=2;
+ newp += 2;
/* ... then turn ? into TAB for search servers, Veronica, etc. ... */
j = strlen(newp);
- for(i=0; i<j; i++)
+ for(i = 0; i<j; i++)
if(newp[i] == '?')
newp[i] = '\x09';
diff --git a/lib/hash.c b/lib/hash.c
index 6afeaa1..c99b1b6 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -300,10 +300,10 @@ Curl_hash_next_element(struct curl_hash_iterator *iter)
/* If we have reached the end of the list, find the next one */
if(!iter->current_element) {
- for(i = iter->slot_index;i < h->slots;i++) {
+ for(i = iter->slot_index; i < h->slots; i++) {
if(h->table[i].head) {
iter->current_element = h->table[i].head;
- iter->slot_index = i+1;
+ iter->slot_index = i + 1;
break;
}
}
diff --git a/lib/hostasyn.c b/lib/hostasyn.c
index 28bdf7a..7b6e856 100644
--- a/lib/hostasyn.c
+++ b/lib/hostasyn.c
@@ -22,6 +22,11 @@
#include "curl_setup.h"
+/***********************************************************************
+ * Only for builds using asynchronous name resolves
+ **********************************************************************/
+#ifdef CURLRES_ASYNCH
+
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
@@ -51,11 +56,6 @@
/* The last #include file should be: */
#include "memdebug.h"
-/***********************************************************************
- * Only for builds using asynchronous name resolves
- **********************************************************************/
-#ifdef CURLRES_ASYNCH
-
/*
* Curl_addrinfo_callback() gets called by ares, gethostbyname_thread()
* or getaddrinfo_thread() when we got the name resolved (or not!).
diff --git a/lib/hostcheck.c b/lib/hostcheck.c
index 156091c..23dc3d2 100644
--- a/lib/hostcheck.c
+++ b/lib/hostcheck.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -73,10 +73,10 @@ static int hostmatch(char *hostname, char *pattern)
/* normalize pattern and hostname by stripping off trailing dots */
size_t len = strlen(hostname);
if(hostname[len-1]=='.')
- hostname[len-1]=0;
+ hostname[len-1] = 0;
len = strlen(pattern);
if(pattern[len-1]=='.')
- pattern[len-1]=0;
+ pattern[len-1] = 0;
pattern_wildcard = strchr(pattern, '*');
if(pattern_wildcard == NULL)
@@ -95,7 +95,7 @@ static int hostmatch(char *hostname, char *pattern)
match. */
wildcard_enabled = 1;
pattern_label_end = strchr(pattern, '.');
- if(pattern_label_end == NULL || strchr(pattern_label_end+1, '.') == NULL ||
+ if(pattern_label_end == NULL || strchr(pattern_label_end + 1, '.') == NULL ||
pattern_wildcard > pattern_label_end ||
strncasecompare(pattern, "xn--", 4)) {
wildcard_enabled = 0;
@@ -116,9 +116,9 @@ static int hostmatch(char *hostname, char *pattern)
return CURL_HOST_NOMATCH;
prefixlen = pattern_wildcard - pattern;
- suffixlen = pattern_label_end - (pattern_wildcard+1);
+ suffixlen = pattern_label_end - (pattern_wildcard + 1);
return strncasecompare(pattern, hostname, prefixlen) &&
- strncasecompare(pattern_wildcard+1, hostname_label_end - suffixlen,
+ strncasecompare(pattern_wildcard + 1, hostname_label_end - suffixlen,
suffixlen) ?
CURL_HOST_MATCH : CURL_HOST_NOMATCH;
}
@@ -137,7 +137,7 @@ int Curl_cert_hostcheck(const char *match_pattern, const char *hostname)
hostp = strdup(hostname);
if(hostp) {
if(hostmatch(hostp, matchp) == CURL_HOST_MATCH)
- res= 1;
+ res = 1;
free(hostp);
}
free(matchp);
diff --git a/lib/hostip.c b/lib/hostip.c
index 619ec84..7f010a0 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -304,9 +304,9 @@ fetch_addr(struct connectdata *conn,
entry_len = strlen(entry_id);
/* See if its already in our dns cache */
- dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len+1);
+ dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len + 1);
- if(dns && (data->set.dns_cache_timeout != -1)) {
+ if(dns && (data->set.dns_cache_timeout != -1)) {
/* See whether the returned entry is stale. Done before we release lock */
struct hostcache_prune_data user;
@@ -316,7 +316,7 @@ fetch_addr(struct connectdata *conn,
if(hostcache_timestamp_remove(&user, dns)) {
infof(data, "Hostname in DNS cache was stale, zapped\n");
dns = NULL; /* the memory deallocation is being handled by the hash */
- Curl_hash_delete(data->dns.hostcache, entry_id, entry_len+1);
+ Curl_hash_delete(data->dns.hostcache, entry_id, entry_len + 1);
}
}
@@ -403,7 +403,7 @@ Curl_cache_addr(struct Curl_easy *data,
dns->timestamp = 1; /* zero indicates CURLOPT_RESOLVE entry */
/* Store the resolved data in our DNS cache. */
- dns2 = Curl_hash_add(data->dns.hostcache, entry_id, entry_len+1,
+ dns2 = Curl_hash_add(data->dns.hostcache, entry_id, entry_len + 1,
(void *)dns);
if(!dns2) {
free(dns);
@@ -688,8 +688,8 @@ clean_up:
the time we spent until now! */
if(prev_alarm) {
/* there was an alarm() set before us, now put it back */
- unsigned long elapsed_secs = (unsigned long) (Curl_tvdiff(Curl_tvnow(),
- conn->created) / 1000);
+ timediff_t elapsed_secs = Curl_timediff(Curl_now(),
+ conn->created) / 1000;
/* the alarm period is counted in even number of seconds */
unsigned long alarm_set = prev_alarm - elapsed_secs;
@@ -778,7 +778,6 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
{
struct curl_slist *hostp;
char hostname[256];
- char address[256];
int port;
for(hostp = data->change.resolve; hostp; hostp = hostp->next) {
@@ -807,7 +806,7 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
/* delete entry, ignore if it didn't exist */
- Curl_hash_delete(data->dns.hostcache, entry_id, entry_len+1);
+ Curl_hash_delete(data->dns.hostcache, entry_id, entry_len + 1);
if(data->share)
Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
@@ -820,6 +819,8 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
Curl_addrinfo *addr;
char *entry_id;
size_t entry_len;
+ char buffer[256];
+ char *address = &buffer[0];
if(3 != sscanf(hostp->data, "%255[^:]:%d:%255s", hostname, &port,
address)) {
@@ -828,6 +829,16 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
continue;
}
+ /* allow IP(v6) address within [brackets] */
+ if(address[0] == '[') {
+ size_t alen = strlen(address);
+ if(address[alen-1] != ']')
+ /* it needs to also end with ] to be valid */
+ continue;
+ address[alen-1] = 0; /* zero terminate there */
+ address++; /* pass the open bracket */
+ }
+
addr = Curl_str2addr(address, port);
if(!addr) {
infof(data, "Address in '%s' found illegal!\n", hostp->data);
@@ -848,7 +859,7 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
/* See if its already in our dns cache */
- dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len+1);
+ dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len + 1);
/* free the allocated entry_id again */
free(entry_id);
diff --git a/lib/hostip4.c b/lib/hostip4.c
index e459328..9d6f115 100644
--- a/lib/hostip4.c
+++ b/lib/hostip4.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,6 +22,11 @@
#include "curl_setup.h"
+/***********************************************************************
+ * Only for plain IPv4 builds
+ **********************************************************************/
+#ifdef CURLRES_IPV4 /* plain IPv4 code coming up */
+
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
@@ -53,10 +58,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-/***********************************************************************
- * Only for plain IPv4 builds
- **********************************************************************/
-#ifdef CURLRES_IPV4 /* plain IPv4 code coming up */
/*
* Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've
* been set and returns TRUE if they are OK.
@@ -249,7 +250,7 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
*/
if(CURL_HOSTENT_SIZE >=
- (sizeof(struct hostent)+sizeof(struct hostent_data))) {
+ (sizeof(struct hostent) + sizeof(struct hostent_data))) {
/* August 22nd, 2000: Albert Chin-A-Young brought an updated version
* that should work! September 20: Richard Prescott worked on the buffer
diff --git a/lib/hostip6.c b/lib/hostip6.c
index 4ebfc2d..7c9988f 100644
--- a/lib/hostip6.c
+++ b/lib/hostip6.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,6 +22,11 @@
#include "curl_setup.h"
+/***********************************************************************
+ * Only for IPv6-enabled builds
+ **********************************************************************/
+#ifdef CURLRES_IPV6
+
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
@@ -54,11 +59,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-/***********************************************************************
- * Only for IPv6-enabled builds
- **********************************************************************/
-#ifdef CURLRES_IPV6
-
#if defined(CURLDEBUG) && defined(HAVE_GETNAMEINFO)
/* These are strictly for memory tracing and are using the same style as the
* family otherwise present in memdebug.c. I put these ones here since they
@@ -212,7 +212,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
if(port) {
snprintf(sbuf, sizeof(sbuf), "%d", port);
- sbufptr=sbuf;
+ sbufptr = sbuf;
}
error = Curl_getaddrinfo_ex(hostname, sbufptr, &hints, &res);
diff --git a/lib/hostsyn.c b/lib/hostsyn.c
index 1a95263..3de6746 100644
--- a/lib/hostsyn.c
+++ b/lib/hostsyn.c
@@ -22,6 +22,11 @@
#include "curl_setup.h"
+/***********************************************************************
+ * Only for builds using synchronous name resolves
+ **********************************************************************/
+#ifdef CURLRES_SYNCH
+
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
@@ -51,11 +56,6 @@
/* The last #include file should be: */
#include "memdebug.h"
-/***********************************************************************
- * Only for builds using synchronous name resolves
- **********************************************************************/
-#ifdef CURLRES_SYNCH
-
/*
* Function provided by the resolver backend to set DNS servers to use.
*/
diff --git a/lib/http.c b/lib/http.c
index d66b848..def51ab 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -50,6 +50,7 @@
#include "transfer.h"
#include "sendf.h"
#include "formdata.h"
+#include "mime.h"
#include "progress.h"
#include "curl_base64.h"
#include "cookie.h"
@@ -72,7 +73,6 @@
#include "http_proxy.h"
#include "warnless.h"
#include "non-ascii.h"
-#include "conncache.h"
#include "pipeline.h"
#include "http2.h"
#include "connect.h"
@@ -162,6 +162,7 @@ CURLcode Curl_http_setup_conn(struct connectdata *conn)
if(!http)
return CURLE_OUT_OF_MEMORY;
+ Curl_mime_initpart(&http->form, conn->data);
conn->data->req.protop = http;
Curl_http2_setup_conn(conn);
@@ -170,26 +171,6 @@ CURLcode Curl_http_setup_conn(struct connectdata *conn)
return CURLE_OK;
}
-/*
- * checkheaders() checks the linked list of custom HTTP headers for a
- * particular header (prefix).
- *
- * Returns a pointer to the first matching header or NULL if none matched.
- */
-char *Curl_checkheaders(const struct connectdata *conn,
- const char *thisheader)
-{
- struct curl_slist *head;
- size_t thislen = strlen(thisheader);
- struct Curl_easy *data = conn->data;
-
- for(head = data->set.headers;head; head=head->next) {
- if(strncasecompare(head->data, thisheader, thislen))
- return head->data;
- }
-
- return NULL;
-}
/*
* checkProxyHeaders() checks the linked list of custom proxy headers
@@ -209,7 +190,7 @@ char *Curl_checkProxyheaders(const struct connectdata *conn,
for(head = (conn->bits.proxy && data->set.sep_headers) ?
data->set.proxyheaders : data->set.headers;
- head; head=head->next) {
+ head; head = head->next) {
if(strncasecompare(head->data, thisheader, thislen))
return head->data;
}
@@ -427,6 +408,7 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
expectsend = data->state.infilesize;
break;
case HTTPREQ_POST_FORM:
+ case HTTPREQ_POST_MIME:
expectsend = http->postsize;
break;
default:
@@ -610,7 +592,7 @@ output_auth_headers(struct connectdata *conn,
#endif
#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED)
if(authstatus->picked == CURLAUTH_NTLM_WB) {
- auth="NTLM_WB";
+ auth = "NTLM_WB";
result = Curl_output_ntlm_wb(conn, proxy);
if(result)
return result;
@@ -1022,7 +1004,7 @@ static size_t readmoredata(char *buffer,
http->sending++; /* move one step up */
- http->backup.postsize=0;
+ http->backup.postsize = 0;
}
else
http->postsize = 0;
@@ -1150,7 +1132,7 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in,
/* there was body data sent beyond the initial header part, pass that
on to the debug callback too */
Curl_debug(conn->data, CURLINFO_DATA_OUT,
- ptr+headlen, bodylen, conn);
+ ptr + headlen, bodylen, conn);
}
}
@@ -1262,7 +1244,7 @@ CURLcode Curl_add_buffer(Curl_send_buffer *in, const void *inptr, size_t size)
(~(size * 2) < (in->size_used * 2)))
new_size = (size_t)-1;
else
- new_size = (in->size_used+size) * 2;
+ new_size = (in->size_used + size) * 2;
if(in->buffer)
/* we have a buffer, enlarge the existing one */
@@ -1339,7 +1321,7 @@ Curl_compareheader(const char *headerline, /* line to check */
clen = strlen(content); /* length of the word to find */
/* find the content string in the rest of the line */
- for(;len>=clen;len--, start++) {
+ for(; len >= clen; len--, start++) {
if(strncasecompare(start, content, clen))
return TRUE; /* match! */
}
@@ -1371,7 +1353,7 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
if(CONNECT_FIRSTSOCKET_PROXY_SSL())
return CURLE_OK; /* wait for HTTPS proxy SSL initialization to complete */
- if(!Curl_connect_complete(conn))
+ if(Curl_connect_ongoing(conn))
/* nothing else to do except wait right now - we're not done here. */
return CURLE_OK;
@@ -1470,18 +1452,17 @@ CURLcode Curl_http_done(struct connectdata *conn,
Curl_http2_done(conn, premature);
- if(HTTPREQ_POST_FORM == data->set.httpreq) {
- data->req.bytecount = http->readbytecount + http->writebytecount;
+ Curl_mime_cleanpart(&http->form);
- Curl_formclean(&http->sendit); /* Now free that whole lot */
- if(http->form.fp) {
- /* a file being uploaded was left opened, close it! */
- fclose(http->form.fp);
- http->form.fp = NULL;
- }
- }
- else if(HTTPREQ_PUT == data->set.httpreq)
+ switch(data->set.httpreq) {
+ case HTTPREQ_PUT:
+ case HTTPREQ_POST_FORM:
+ case HTTPREQ_POST_MIME:
data->req.bytecount = http->readbytecount + http->writebytecount;
+ break;
+ default:
+ break;
+ }
if(status)
return status;
@@ -1581,7 +1562,7 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
char *ptr;
struct curl_slist *h[2];
struct curl_slist *headers;
- int numlists=1; /* by default */
+ int numlists = 1; /* by default */
struct Curl_easy *data = conn->data;
int i;
@@ -1613,7 +1594,7 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
}
/* loop through one or two lists */
- for(i=0; i < numlists; i++) {
+ for(i = 0; i < numlists; i++) {
headers = h[i];
while(headers) {
@@ -1637,15 +1618,19 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
/* this header (extended by formdata.c) is sent later */
checkprefix("Content-Type:", headers->data))
;
+ else if(data->set.httpreq == HTTPREQ_POST_MIME &&
+ /* this header is sent later */
+ checkprefix("Content-Type:", headers->data))
+ ;
else if(conn->bits.authneg &&
/* while doing auth neg, don't allow the custom length since
we will force length zero then */
- checkprefix("Content-Length", headers->data))
+ checkprefix("Content-Length:", headers->data))
;
else if(conn->allocptr.te &&
/* when asking for Transfer-Encoding, don't pass on a custom
Connection: */
- checkprefix("Connection", headers->data))
+ checkprefix("Connection:", headers->data))
;
else if((conn->httpversion == 20) &&
checkprefix("Transfer-Encoding:", headers->data))
@@ -1678,6 +1663,10 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
*ptr = ':';
result = Curl_add_bufferf(req_buffer, "%s\r\n",
headers->data);
+
+ /* restore the previous value */
+ *ptr = ';';
+
if(result)
return result;
}
@@ -1775,7 +1764,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
const char *httpstring;
Curl_send_buffer *req_buffer;
curl_off_t postsize = 0; /* curl_off_t to handle large file sizes */
- int seekerr = CURL_SEEKFUNC_OK;
+ int seekerr = CURL_SEEKFUNC_CANTSEEK;
/* Always consider the DO phase done after this function call, even if there
may be parts of the request that is not yet sent, since we can deal with
@@ -1848,6 +1837,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
switch(httpreq) {
case HTTPREQ_POST:
case HTTPREQ_POST_FORM:
+ case HTTPREQ_POST_MIME:
request = "POST";
break;
case HTTPREQ_PUT:
@@ -1873,7 +1863,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
here. */
if(Curl_checkheaders(conn, "User-Agent:")) {
free(conn->allocptr.uagent);
- conn->allocptr.uagent=NULL;
+ conn->allocptr.uagent = NULL;
}
/* setup the authentication headers */
@@ -1942,6 +1932,48 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
#endif
+ switch(httpreq) {
+ case HTTPREQ_POST_MIME:
+ http->sendit = &data->set.mimepost;
+ break;
+ case HTTPREQ_POST_FORM:
+ /* Convert the form structure into a mime structure. */
+ Curl_mime_cleanpart(&http->form);
+ result = Curl_getformdata(data, &http->form, data->set.httppost,
+ data->state.fread_func);
+ if(result)
+ return result;
+ http->sendit = &http->form;
+ break;
+ default:
+ http->sendit = NULL;
+ }
+
+ if(http->sendit) {
+ const char *cthdr = Curl_checkheaders(conn, "Content-Type:");
+
+ /* Read and seek body only. */
+ http->sendit->flags |= MIME_BODY_ONLY;
+
+ /* Prepare the mime structure headers & set content type. */
+
+ if(cthdr)
+ for(cthdr += 13; *cthdr == ' '; cthdr++)
+ ;
+ else if(http->sendit->kind == MIMEKIND_MULTIPART)
+ cthdr = "multipart/form-data";
+
+ curl_mime_headers(http->sendit, data->set.headers, 0);
+ result = Curl_mime_prepare_headers(http->sendit, cthdr,
+ NULL, MIMESTRATEGY_FORM);
+ curl_mime_headers(http->sendit, NULL, 0);
+ if(!result)
+ result = Curl_mime_rewind(http->sendit);
+ if(result)
+ return result;
+ http->postsize = Curl_mime_size(http->sendit);
+ }
+
ptr = Curl_checkheaders(conn, "Transfer-Encoding:");
if(ptr) {
/* Some kind of TE is requested, check if 'chunked' is chosen */
@@ -1949,9 +1981,10 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
Curl_compareheader(ptr, "Transfer-Encoding:", "chunked");
}
else {
- if((conn->handler->protocol&PROTO_FAMILY_HTTP) &&
- data->set.upload &&
- (data->state.infilesize == -1)) {
+ if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
+ (((httpreq == HTTPREQ_POST_MIME || httpreq == HTTPREQ_POST_FORM) &&
+ http->postsize < 0) ||
+ (data->set.upload && data->state.infilesize == -1))) {
if(conn->bits.authneg)
/* don't enable chunked during auth neg */
;
@@ -2049,7 +2082,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
#ifndef CURL_DISABLE_PROXY
- if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
+ if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
/* Using a proxy but does not tunnel through it */
/* The path sent to the proxy is in fact the entire URL. But if the remote
@@ -2123,21 +2156,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
#endif /* CURL_DISABLE_PROXY */
- if(HTTPREQ_POST_FORM == httpreq) {
- /* we must build the whole post sequence first, so that we have a size of
- the whole transfer before we start to send it */
- result = Curl_getformdata(data, &http->sendit, data->set.httppost,
- Curl_checkheaders(conn, "Content-Type:"),
- &http->postsize);
- if(result)
- return result;
- }
-
http->p_accept = Curl_checkheaders(conn, "Accept:")?NULL:"Accept: */*\r\n";
- if(( (HTTPREQ_POST == httpreq) ||
- (HTTPREQ_POST_FORM == httpreq) ||
- (HTTPREQ_PUT == httpreq) ) &&
+ if((HTTPREQ_POST == httpreq || HTTPREQ_PUT == httpreq) &&
data->state.resume_from) {
/**********************************************************************
* Resuming upload in HTTP means that we PUT or POST and that we have
@@ -2145,6 +2166,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
* a Range: header that will be passed along. We need to "fast forward"
* the file the given number of bytes and decrease the assume upload
* file size before we continue this venture in the dark lands of HTTP.
+ * Resuming mime/form posting at an offset > 0 has no sense and is ignored.
*********************************************************************/
if(data->state.resume_from < 0) {
@@ -2166,7 +2188,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
if(seekerr != CURL_SEEKFUNC_OK) {
- curl_off_t passed=0;
+ curl_off_t passed = 0;
if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
failf(data, "Could not seek stream");
@@ -2219,7 +2241,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
conn->allocptr.rangeline = aprintf("Range: bytes=%s\r\n",
data->state.range);
}
- else if((httpreq != HTTPREQ_GET) &&
+ else if((httpreq == HTTPREQ_POST || httpreq == HTTPREQ_PUT) &&
!Curl_checkheaders(conn, "Content-Range:")) {
/* if a line like this was already allocated, free the previous one */
@@ -2237,7 +2259,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
else if(data->state.resume_from) {
/* This is because "resume" was selected */
- curl_off_t total_expected_size=
+ curl_off_t total_expected_size =
data->state.resume_from + data->state.infilesize;
conn->allocptr.rangeline =
aprintf("Content-Range: bytes %s%" CURL_FORMAT_CURL_OFF_T
@@ -2347,8 +2369,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
#if !defined(CURL_DISABLE_COOKIES)
if(data->cookies || addcookies) {
- struct Cookie *co=NULL; /* no cookies from start */
- int count=0;
+ struct Cookie *co = NULL; /* no cookies from start */
+ int count = 0;
if(data->cookies) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
@@ -2361,7 +2383,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
}
if(co) {
- struct Cookie *store=co;
+ struct Cookie *store = co;
/* now loop through all cookies that matched */
while(co) {
if(co->value) {
@@ -2415,117 +2437,79 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
switch(httpreq) {
- case HTTPREQ_POST_FORM:
- if(!http->sendit || conn->bits.authneg) {
- /* nothing to post! */
- result = Curl_add_bufferf(req_buffer, "Content-Length: 0\r\n\r\n");
- if(result)
- return result;
-
- result = Curl_add_buffer_send(req_buffer, conn,
- &data->info.request_size, 0, FIRSTSOCKET);
- if(result)
- failf(data, "Failed sending POST request");
- else
- /* setup variables for the upcoming transfer */
- Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, &http->readbytecount,
- -1, NULL);
- break;
- }
-
- if(Curl_FormInit(&http->form, http->sendit)) {
- failf(data, "Internal HTTP POST error!");
- return CURLE_HTTP_POST_ERROR;
- }
-
- /* Get the currently set callback function pointer and store that in the
- form struct since we might want the actual user-provided callback later
- on. The data->set.fread_func pointer itself will be changed for the
- multipart case to the function that returns a multipart formatted
- stream. */
- http->form.fread_func = data->state.fread_func;
-
- /* Set the read function to read from the generated form data */
- data->state.fread_func = (curl_read_callback)Curl_FormReader;
- data->state.in = &http->form;
+ case HTTPREQ_PUT: /* Let's PUT the data to the server! */
- http->sending = HTTPSEND_BODY;
+ if(conn->bits.authneg)
+ postsize = 0;
+ else
+ postsize = data->state.infilesize;
- if(!data->req.upload_chunky &&
- !Curl_checkheaders(conn, "Content-Length:")) {
+ if((postsize != -1) && !data->req.upload_chunky &&
+ (conn->bits.authneg || !Curl_checkheaders(conn, "Content-Length:"))) {
/* only add Content-Length if not uploading chunked */
result = Curl_add_bufferf(req_buffer,
"Content-Length: %" CURL_FORMAT_CURL_OFF_T
- "\r\n", http->postsize);
+ "\r\n", postsize);
if(result)
return result;
}
- result = expect100(data, conn, req_buffer);
- if(result)
- return result;
-
- {
-
- /* Get Content-Type: line from Curl_formpostheader.
- */
- char *contentType;
- size_t linelength=0;
- contentType = Curl_formpostheader((void *)&http->form,
- &linelength);
- if(!contentType) {
- failf(data, "Could not get Content-Type header line!");
- return CURLE_HTTP_POST_ERROR;
- }
-
- result = Curl_add_buffer(req_buffer, contentType, linelength);
+ if(postsize != 0) {
+ result = expect100(data, conn, req_buffer);
if(result)
return result;
}
- /* make the request end in a true CRLF */
- result = Curl_add_buffer(req_buffer, "\r\n", 2);
+ result = Curl_add_buffer(req_buffer, "\r\n", 2); /* end of headers */
if(result)
return result;
- /* set upload size to the progress meter */
- Curl_pgrsSetUploadSize(data, http->postsize);
+ /* set the upload size to the progress meter */
+ Curl_pgrsSetUploadSize(data, postsize);
- /* fire away the whole request to the server */
+ /* this sends the buffer and frees all the buffer resources */
result = Curl_add_buffer_send(req_buffer, conn,
&data->info.request_size, 0, FIRSTSOCKET);
if(result)
- failf(data, "Failed sending POST request");
+ failf(data, "Failed sending PUT request");
else
- /* setup variables for the upcoming transfer */
+ /* prepare for transfer */
Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE,
- &http->readbytecount, FIRSTSOCKET,
- &http->writebytecount);
-
- if(result) {
- Curl_formclean(&http->sendit); /* free that whole lot */
- return result;
- }
-
- /* convert the form data */
- result = Curl_convert_form(data, http->sendit);
- if(result) {
- Curl_formclean(&http->sendit); /* free that whole lot */
+ &http->readbytecount, postsize?FIRSTSOCKET:-1,
+ postsize?&http->writebytecount:NULL);
+ if(result)
return result;
- }
-
break;
- case HTTPREQ_PUT: /* Let's PUT the data to the server! */
+ case HTTPREQ_POST_FORM:
+ case HTTPREQ_POST_MIME:
+ /* This is form posting using mime data. */
+ if(conn->bits.authneg) {
+ /* nothing to post! */
+ result = Curl_add_bufferf(req_buffer, "Content-Length: 0\r\n\r\n");
+ if(result)
+ return result;
- if(conn->bits.authneg)
- postsize = 0;
- else
- postsize = data->state.infilesize;
+ result = Curl_add_buffer_send(req_buffer, conn,
+ &data->info.request_size, 0, FIRSTSOCKET);
+ if(result)
+ failf(data, "Failed sending POST request");
+ else
+ /* setup variables for the upcoming transfer */
+ Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, &http->readbytecount,
+ -1, NULL);
+ break;
+ }
- if((postsize != -1) && !data->req.upload_chunky &&
+ postsize = http->postsize;
+
+ /* We only set Content-Length and allow a custom Content-Length if
+ we don't upload data chunked, as RFC2616 forbids us to set both
+ kinds of headers (Transfer-Encoding: chunked and Content-Length) */
+ if(postsize != -1 && !data->req.upload_chunky &&
(conn->bits.authneg || !Curl_checkheaders(conn, "Content-Length:"))) {
- /* only add Content-Length if not uploading chunked */
+ /* we allow replacing this header if not during auth negotiation,
+ although it isn't very wise to actually set your own */
result = Curl_add_bufferf(req_buffer,
"Content-Length: %" CURL_FORMAT_CURL_OFF_T
"\r\n", postsize);
@@ -2533,24 +2517,52 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
return result;
}
- if(postsize != 0) {
+ /* Output mime-generated headers. */
+ {
+ struct curl_slist *hdr;
+
+ for(hdr = http->sendit->curlheaders; hdr; hdr = hdr->next) {
+ result = Curl_add_bufferf(req_buffer, "%s\r\n", hdr->data);
+ if(result)
+ return result;
+ }
+ }
+
+ /* For really small posts we don't use Expect: headers at all, and for
+ the somewhat bigger ones we allow the app to disable it. Just make
+ sure that the expect100header is always set to the preferred value
+ here. */
+ ptr = Curl_checkheaders(conn, "Expect:");
+ if(ptr) {
+ data->state.expect100header =
+ Curl_compareheader(ptr, "Expect:", "100-continue");
+ }
+ else if(postsize > EXPECT_100_THRESHOLD || postsize < 0) {
result = expect100(data, conn, req_buffer);
if(result)
return result;
}
+ else
+ data->state.expect100header = FALSE;
- result = Curl_add_buffer(req_buffer, "\r\n", 2); /* end of headers */
+ /* make the request end in a true CRLF */
+ result = Curl_add_buffer(req_buffer, "\r\n", 2);
if(result)
return result;
/* set the upload size to the progress meter */
Curl_pgrsSetUploadSize(data, postsize);
+ /* Read from mime structure. */
+ data->state.fread_func = (curl_read_callback) Curl_mime_read;
+ data->state.in = (void *) http->sendit;
+ http->sending = HTTPSEND_BODY;
+
/* this sends the buffer and frees all the buffer resources */
result = Curl_add_buffer_send(req_buffer, conn,
&data->info.request_size, 0, FIRSTSOCKET);
if(result)
- failf(data, "Failed sending PUT request");
+ failf(data, "Failed sending POST request");
else
/* prepare for transfer */
Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE,
@@ -2558,6 +2570,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
postsize?&http->writebytecount:NULL);
if(result)
return result;
+
break;
case HTTPREQ_POST:
@@ -2614,7 +2627,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
its size. */
if(conn->httpversion != 20 &&
!data->state.expect100header &&
- (postsize < MAX_INITIAL_POST_SIZE)) {
+ (postsize < MAX_INITIAL_POST_SIZE)) {
/* if we don't use expect: 100 AND
postsize is less than MAX_INITIAL_POST_SIZE
@@ -2779,7 +2792,7 @@ checkhttpprefix(struct Curl_easy *data,
failf(data, "Failed to allocate memory for conversion!");
return FALSE; /* can't return CURLE_OUT_OF_MEMORY so return FALSE */
}
- if(CURLE_OK != Curl_convert_from_network(data, scratch, strlen(s)+1)) {
+ if(CURLE_OK != Curl_convert_from_network(data, scratch, strlen(s) + 1)) {
/* Curl_convert_from_network calls failf if unsuccessful */
free(scratch);
return FALSE; /* can't return CURLE_foobar so return FALSE */
@@ -2809,6 +2822,7 @@ static bool
checkrtspprefix(struct Curl_easy *data,
const char *s)
{
+ bool result = FALSE;
#ifdef CURL_DOES_CONVERSIONS
/* convert from the network encoding using a scratch area */
@@ -2817,18 +2831,19 @@ checkrtspprefix(struct Curl_easy *data,
failf(data, "Failed to allocate memory for conversion!");
return FALSE; /* can't return CURLE_OUT_OF_MEMORY so return FALSE */
}
- if(CURLE_OK != Curl_convert_from_network(data, scratch, strlen(s)+1)) {
+ if(CURLE_OK != Curl_convert_from_network(data, scratch, strlen(s) + 1)) {
/* Curl_convert_from_network calls failf if unsuccessful */
- free(scratch);
- return FALSE; /* can't return CURLE_foobar so return FALSE */
+ result = FALSE; /* can't return CURLE_foobar so return FALSE */
}
- s = scratch;
+ else
+ result = checkprefix("RTSP/", scratch)? TRUE: FALSE;
+ free(scratch);
#else
(void)data; /* unused */
+ result = checkprefix("RTSP/", s)? TRUE: FALSE;
#endif /* CURL_DOES_CONVERSIONS */
- if(checkprefix("RTSP/", s))
- return TRUE;
- return FALSE;
+
+ return result;
}
#endif /* CURL_DISABLE_RTSP */
@@ -2870,14 +2885,14 @@ static CURLcode header_append(struct Curl_easy *data,
return CURLE_OUT_OF_MEMORY;
}
- newsize=CURLMAX((k->hbuflen+ length)*3/2, data->state.headersize*2);
+ newsize = CURLMAX((k->hbuflen + length) * 3 / 2, data->state.headersize*2);
hbufp_index = k->hbufp - data->state.headerbuff;
newbuff = realloc(data->state.headerbuff, newsize);
if(!newbuff) {
failf(data, "Failed to alloc memory for big header!");
return CURLE_OUT_OF_MEMORY;
}
- data->state.headersize=newsize;
+ data->state.headersize = newsize;
data->state.headerbuff = newbuff;
k->hbufp = data->state.headerbuff + hbufp_index;
}
@@ -2970,7 +2985,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
/* decrease the size of the remaining (supposed) header line */
- rest_length = (k->end_ptr - k->str)+1;
+ rest_length = (k->end_ptr - k->str) + 1;
*nread -= (ssize_t)rest_length;
k->str = k->end_ptr + 1; /* move past new line */
@@ -3088,7 +3103,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
!(conn->handler->protocol & CURLPROTO_RTSP) &&
data->set.httpreq != HTTPREQ_HEAD) {
/* On HTTP 1.1, when connection is not to get closed, but no
- Content-Length nor Content-Encoding chunked have been
+ Content-Length nor Transfer-Encoding chunked have been
received, according to RFC2616 section 4.4 point 5, we
assume that the server will close the connection to
signal the end of the document. */
@@ -3169,6 +3184,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
case HTTPREQ_PUT:
case HTTPREQ_POST:
case HTTPREQ_POST_FORM:
+ case HTTPREQ_POST_MIME:
/* We got an error response. If this happened before the whole
* request body has been sent we stop sending and mark the
* connection for closure after we've read the entire response.
@@ -3296,7 +3312,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
#define HEADER1 scratch
#define SCRATCHSIZE 21
CURLcode res;
- char scratch[SCRATCHSIZE+1]; /* "HTTP/major.minor 123" */
+ char scratch[SCRATCHSIZE + 1]; /* "HTTP/major.minor 123" */
/* We can't really convert this yet because we
don't know if it's the 1st header line or the body.
So we do a partial conversion into a scratch area,
@@ -3337,7 +3353,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
separator = ' ';
}
- if((nc==4) && (' ' == separator)) {
+ if((nc == 4) && (' ' == separator)) {
conn->httpversion += 10 * httpversion_major;
if(k->upgr101 == UPGR101_RECEIVED) {
@@ -3350,7 +3366,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
/* this is the real world, not a Nirvana
NCSA 1.5.x returns this crap when asked for HTTP/1.1
*/
- nc=sscanf(HEADER1, " HTTP %3d", &k->httpcode);
+ nc = sscanf(HEADER1, " HTTP %3d", &k->httpcode);
conn->httpversion = 10;
/* If user has set option HTTP200ALIASES,
@@ -3370,12 +3386,14 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
}
else if(conn->handler->protocol & CURLPROTO_RTSP) {
+ char separator;
nc = sscanf(HEADER1,
- " RTSP/%d.%d %3d",
+ " RTSP/%1d.%1d%c%3d",
&rtspversion_major,
&conn->rtspversion,
+ &separator,
&k->httpcode);
- if(nc==3) {
+ if((nc == 4) && (' ' == separator)) {
conn->rtspversion += 10 * rtspversion_major;
conn->httpversion = 11; /* For us, RTSP acts like HTTP 1.1 */
}
@@ -3407,7 +3425,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
((k->httpcode != 407) || !conn->bits.proxy_user_passwd) ) {
if(data->state.resume_from &&
- (data->set.httpreq==HTTPREQ_GET) &&
+ (data->set.httpreq == HTTPREQ_GET) &&
(k->httpcode == 416)) {
/* "Requested Range Not Satisfiable", just proceed and
pretend this is no error */
@@ -3463,8 +3481,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* fields. */
if(data->set.timecondition)
data->info.timecond = TRUE;
- k->size=0;
- k->maxdownload=0;
+ k->size = 0;
+ k->maxdownload = 0;
k->ignorecl = TRUE; /* ignore Content-Length headers */
break;
default:
@@ -3486,28 +3504,32 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
/* Check for Content-Length: header lines to get size */
if(!k->ignorecl && !data->set.ignorecl &&
checkprefix("Content-Length:", k->p)) {
- curl_off_t contentlength = curlx_strtoofft(k->p+15, NULL, 10);
- if(data->set.max_filesize &&
- contentlength > data->set.max_filesize) {
- failf(data, "Maximum file size exceeded");
- return CURLE_FILESIZE_EXCEEDED;
- }
- if(contentlength >= 0) {
- k->size = contentlength;
- k->maxdownload = k->size;
- /* we set the progress download size already at this point
- just to make it easier for apps/callbacks to extract this
- info as soon as possible */
- Curl_pgrsSetDownloadSize(data, k->size);
- }
- else {
- /* Negative Content-Length is really odd, and we know it
- happens for example when older Apache servers send large
- files */
- streamclose(conn, "negative content-length");
- infof(data, "Negative content-length: %" CURL_FORMAT_CURL_OFF_T
- ", closing after transfer\n", contentlength);
+ curl_off_t contentlength;
+ if(!curlx_strtoofft(k->p + 15, NULL, 10, &contentlength)) {
+ if(data->set.max_filesize &&
+ contentlength > data->set.max_filesize) {
+ failf(data, "Maximum file size exceeded");
+ return CURLE_FILESIZE_EXCEEDED;
+ }
+ if(contentlength >= 0) {
+ k->size = contentlength;
+ k->maxdownload = k->size;
+ /* we set the progress download size already at this point
+ just to make it easier for apps/callbacks to extract this
+ info as soon as possible */
+ Curl_pgrsSetDownloadSize(data, k->size);
+ }
+ else {
+ /* Negative Content-Length is really odd, and we know it
+ happens for example when older Apache servers send large
+ files */
+ streamclose(conn, "negative content-length");
+ infof(data, "Negative content-length: %" CURL_FORMAT_CURL_OFF_T
+ ", closing after transfer\n", contentlength);
+ }
}
+ else
+ infof(data, "Illegal Content-Length: header\n");
}
/* check for Content-Type: header lines to get the MIME-type */
else if(checkprefix("Content-Type:", k->p)) {
@@ -3591,51 +3613,9 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* of chunks, and a chunk-data set to zero signals the
* end-of-chunks. */
- char *start;
-
- /* Find the first non-space letter */
- start = k->p + 18;
-
- for(;;) {
- /* skip whitespaces and commas */
- while(*start && (ISSPACE(*start) || (*start == ',')))
- start++;
-
- if(checkprefix("chunked", start)) {
- k->chunk = TRUE; /* chunks coming our way */
-
- /* init our chunky engine */
- Curl_httpchunk_init(conn);
-
- start += 7;
- }
-
- if(k->auto_decoding)
- /* TODO: we only support the first mentioned compression for now */
- break;
-
- if(checkprefix("identity", start)) {
- k->auto_decoding = IDENTITY;
- start += 8;
- }
- else if(checkprefix("deflate", start)) {
- k->auto_decoding = DEFLATE;
- start += 7;
- }
- else if(checkprefix("gzip", start)) {
- k->auto_decoding = GZIP;
- start += 4;
- }
- else if(checkprefix("x-gzip", start)) {
- k->auto_decoding = GZIP;
- start += 6;
- }
- else
- /* unknown! */
- break;
-
- }
-
+ result = Curl_build_unencoding_stack(conn, k->p + 18, TRUE);
+ if(result)
+ return result;
}
else if(checkprefix("Content-Encoding:", k->p) &&
data->set.str[STRING_ENCODING]) {
@@ -3646,21 +3626,9 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* 2616). zlib cannot handle compress. However, errors are
* handled further down when the response body is processed
*/
- char *start;
-
- /* Find the first non-space letter */
- start = k->p + 17;
- while(*start && ISSPACE(*start))
- start++;
-
- /* Record the content-encoding for later use */
- if(checkprefix("identity", start))
- k->auto_decoding = IDENTITY;
- else if(checkprefix("deflate", start))
- k->auto_decoding = DEFLATE;
- else if(checkprefix("gzip", start)
- || checkprefix("x-gzip", start))
- k->auto_decoding = GZIP;
+ result = Curl_build_unencoding_stack(conn, k->p + 17, FALSE);
+ if(result)
+ return result;
}
else if(checkprefix("Content-Range:", k->p)) {
/* Content-Range: bytes [num]-
@@ -3682,11 +3650,11 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
/* if it truly stopped on a digit */
if(ISDIGIT(*ptr)) {
- k->offset = curlx_strtoofft(ptr, NULL, 10);
-
- if(data->state.resume_from == k->offset)
- /* we asked for a resume and we got it */
- k->content_range = TRUE;
+ if(!curlx_strtoofft(ptr, NULL, 10, &k->offset)) {
+ if(data->state.resume_from == k->offset)
+ /* we asked for a resume and we got it */
+ k->content_range = TRUE;
+ }
}
else
data->state.resume_from = 0; /* get everything */
@@ -3697,7 +3665,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE,
CURL_LOCK_ACCESS_SINGLE);
Curl_cookie_add(data,
- data->cookies, TRUE, k->p+11,
+ data->cookies, TRUE, k->p + 11,
/* If there is a custom-set Host: name, use it
here, or else use real peer host name. */
conn->allocptr.cookiehost?
@@ -3708,8 +3676,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
#endif
else if(checkprefix("Last-Modified:", k->p) &&
(data->set.timecondition || data->set.get_filetime) ) {
- time_t secs=time(NULL);
- k->timeofdoc = curl_getdate(k->p+strlen("Last-Modified:"),
+ time_t secs = time(NULL);
+ k->timeofdoc = curl_getdate(k->p + strlen("Last-Modified:"),
&secs);
if(data->set.get_filetime)
data->info.filetime = (long)k->timeofdoc;
diff --git a/lib/http.h b/lib/http.h
index a845f56..d2781bc 100644
--- a/lib/http.h
+++ b/lib/http.h
@@ -40,8 +40,6 @@ bool Curl_compareheader(const char *headerline, /* line to check */
const char *header, /* header keyword _with_ colon */
const char *content); /* content string to find */
-char *Curl_checkheaders(const struct connectdata *conn,
- const char *thisheader);
char *Curl_copy_header_value(const char *header);
char *Curl_checkProxyheaders(const struct connectdata *conn,
@@ -130,7 +128,7 @@ CURLcode Curl_http_perhapsrewind(struct connectdata *conn);
* HTTP unique setup
***************************************************************************/
struct HTTP {
- struct FormData *sendit;
+ curl_mimepart *sendit;
curl_off_t postsize; /* off_t to handle large file sizes */
const char *postdata;
@@ -140,7 +138,7 @@ struct HTTP {
curl_off_t writebytecount;
/* For FORM posting */
- struct Form form;
+ curl_mimepart form;
struct back {
curl_read_callback fread_func; /* backup storage for fread pointer */
diff --git a/lib/http2.c b/lib/http2.c
index 0e55801..8e2fc71 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -32,7 +32,6 @@
#include "curl_base64.h"
#include "strcase.h"
#include "multiif.h"
-#include "conncache.h"
#include "url.h"
#include "connect.h"
#include "strtoofft.h"
@@ -384,12 +383,12 @@ char *curl_pushheader_byname(struct curl_pushheaders *h, const char *header)
struct HTTP *stream = h->data->req.protop;
size_t len = strlen(header);
size_t i;
- for(i=0; i<stream->push_headers_used; i++) {
+ for(i = 0; i<stream->push_headers_used; i++) {
if(!strncmp(header, stream->push_headers[i], len)) {
/* sub-match, make sure that it is followed by a colon */
if(stream->push_headers[i][len] != ':')
continue;
- return &stream->push_headers[i][len+1];
+ return &stream->push_headers[i][len + 1];
}
}
}
@@ -464,7 +463,7 @@ static int push_promise(struct Curl_easy *data,
data->multi->push_userp);
/* free the headers again */
- for(i=0; i<stream->push_headers_used; i++)
+ for(i = 0; i<stream->push_headers_used; i++)
free(stream->push_headers[i]);
free(stream->push_headers);
stream->push_headers = NULL;
@@ -1184,14 +1183,17 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
httpc->local_settings_num);
if(!binlen) {
failf(conn->data, "nghttp2 unexpectedly failed on pack_settings_payload");
+ Curl_add_buffer_free(req);
return CURLE_FAILED_INIT;
}
conn->proto.httpc.binlen = binlen;
result = Curl_base64url_encode(conn->data, (const char *)binsettings, binlen,
&base64, &blen);
- if(result)
+ if(result) {
+ Curl_add_buffer_free(req);
return result;
+ }
result = Curl_add_bufferf(req,
"Connection: Upgrade, HTTP2-Settings\r\n"
@@ -1582,7 +1584,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
failf(data, "nghttp2_session_mem_recv() returned %d:%s\n",
rv, nghttp2_strerror((int)rv));
*err = CURLE_RECV_ERROR;
- return 0;
+ return -1;
}
DEBUGF(infof(data, "nghttp2_session_mem_recv() returns %zd\n", rv));
if(nread == rv) {
@@ -1600,7 +1602,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
rv = h2_session_send(data, httpc->h2);
if(rv != 0) {
*err = CURLE_SEND_ERROR;
- return 0;
+ return -1;
}
if(should_close_session(httpc)) {
@@ -1846,9 +1848,6 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
goto fail;
}
- hdbuf = end + 1;
-
- end = line_end;
nva[2].name = (unsigned char *)":scheme";
nva[2].namelen = strlen((char *)nva[2].name);
if(conn->handler->flags & PROTOPT_SSL)
@@ -1955,6 +1954,7 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
switch(conn->data->set.httpreq) {
case HTTPREQ_POST:
case HTTPREQ_POST_FORM:
+ case HTTPREQ_POST_MIME:
case HTTPREQ_PUT:
if(conn->data->state.infilesize != -1)
stream->upload_left = conn->data->state.infilesize;
diff --git a/lib/http_chunks.c b/lib/http_chunks.c
index 1bdf697..1616429 100644
--- a/lib/http_chunks.c
+++ b/lib/http_chunks.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -86,8 +86,8 @@ static bool Curl_isxdigit(char digit)
void Curl_httpchunk_init(struct connectdata *conn)
{
struct Curl_chunker *chunk = &conn->chunk;
- chunk->hexindex=0; /* start at 0 */
- chunk->dataleft=0; /* no data left yet! */
+ chunk->hexindex = 0; /* start at 0 */
+ chunk->dataleft = 0; /* no data left yet! */
chunk->state = CHUNK_HEX; /* we get hex first! */
}
@@ -107,7 +107,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
ssize_t datalen,
ssize_t *wrotep)
{
- CURLcode result=CURLE_OK;
+ CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
struct Curl_chunker *ch = &conn->chunk;
struct SingleRequest *k = &data->req;
@@ -147,7 +147,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
return CHUNKE_ILLEGAL_HEX;
/* length and datap are unmodified */
- ch->hexbuffer[ch->hexindex]=0;
+ ch->hexbuffer[ch->hexindex] = 0;
/* convert to host encoding before calling strtoul */
result = Curl_convert_from_network(conn->data, ch->hexbuffer,
@@ -158,9 +158,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
return CHUNKE_ILLEGAL_HEX;
}
- ch->datasize=curlx_strtoofft(ch->hexbuffer, &endptr, 16);
- if((ch->datasize == CURL_OFF_T_MAX) && (errno == ERANGE))
- /* overflow is an error */
+ if(curlx_strtoofft(ch->hexbuffer, &endptr, 16, &ch->datasize))
return CHUNKE_ILLEGAL_HEX;
ch->state = CHUNK_LF; /* now wait for the CRLF */
}
@@ -172,7 +170,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
/* we're now expecting data to come, unless size was zero! */
if(0 == ch->datasize) {
ch->state = CHUNK_TRAILER; /* now check for trailers */
- conn->trlPos=0;
+ conn->trlPos = 0;
}
else
ch->state = CHUNK_DATA;
@@ -189,49 +187,17 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
piece = curlx_sotouz((ch->datasize >= length)?length:ch->datasize);
/* Write the data portion available */
-#ifdef HAVE_LIBZ
- switch(conn->data->set.http_ce_skip?
- IDENTITY : data->req.auto_decoding) {
- case IDENTITY:
-#endif
- if(!k->ignorebody) {
- if(!data->set.http_te_skip)
- result = Curl_client_write(conn, CLIENTWRITE_BODY, datap,
- piece);
- else
- result = CURLE_OK;
- }
-#ifdef HAVE_LIBZ
- break;
-
- case DEFLATE:
- /* update data->req.keep.str to point to the chunk data. */
- data->req.str = datap;
- result = Curl_unencode_deflate_write(conn, &data->req,
- (ssize_t)piece);
- break;
-
- case GZIP:
- /* update data->req.keep.str to point to the chunk data. */
- data->req.str = datap;
- result = Curl_unencode_gzip_write(conn, &data->req,
- (ssize_t)piece);
- break;
-
- default:
- failf(conn->data,
- "Unrecognized content encoding type. "
- "libcurl understands `identity', `deflate' and `gzip' "
- "content encodings.");
- return CHUNKE_BAD_ENCODING;
+ if(conn->data->set.http_ce_skip || !k->writer_stack) {
+ if(!k->ignorebody)
+ result = Curl_client_write(conn, CLIENTWRITE_BODY, datap, piece);
}
-#endif
+ else
+ result = Curl_unencode_write(conn, k->writer_stack, datap, piece);
if(result)
return CHUNKE_WRITE_ERROR;
*wrote += piece;
-
ch->datasize -= piece; /* decrease amount left to expect */
datap += piece; /* move read pointer forward */
length -= piece; /* decrease space left in this round */
@@ -259,9 +225,9 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
if(conn->trlPos) {
/* we allocate trailer with 3 bytes extra room to fit this */
- conn->trailer[conn->trlPos++]=0x0d;
- conn->trailer[conn->trlPos++]=0x0a;
- conn->trailer[conn->trlPos]=0;
+ conn->trailer[conn->trlPos++] = 0x0d;
+ conn->trailer[conn->trlPos++] = 0x0a;
+ conn->trailer[conn->trlPos] = 0;
/* Convert to host encoding before calling Curl_client_write */
result = Curl_convert_from_network(conn->data, conn->trailer,
@@ -277,7 +243,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
if(result)
return CHUNKE_WRITE_ERROR;
}
- conn->trlPos=0;
+ conn->trlPos = 0;
ch->state = CHUNK_TRAILER_CR;
if(*datap == 0x0a)
/* already on the LF */
@@ -301,7 +267,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
ptr = realloc(conn->trailer, conn->trlMax + 3);
}
else {
- conn->trlMax=128;
+ conn->trlMax = 128;
ptr = malloc(conn->trlMax + 3);
}
if(!ptr)
diff --git a/lib/http_ntlm.c b/lib/http_ntlm.c
index 8a78bd2..0f1edcf 100644
--- a/lib/http_ntlm.c
+++ b/lib/http_ntlm.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,11 +37,14 @@
#include "sendf.h"
#include "strcase.h"
#include "http_ntlm.h"
+#include "curl_ntlm_core.h"
#include "curl_ntlm_wb.h"
#include "vauth/vauth.h"
#include "url.h"
-#if defined(USE_NSS)
+/* SSL backend-specific #if branches in this file must be kept in the order
+ documented in curl_ntlm_core. */
+#if defined(NTLM_NEEDS_NSS_INIT)
#include "vtls/nssg.h"
#elif defined(USE_WINDOWS_SSPI)
#include "curl_sspi.h"
@@ -129,7 +132,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
DEBUGASSERT(conn);
DEBUGASSERT(conn->data);
-#ifdef USE_NSS
+#if defined(NTLM_NEEDS_NSS_INIT)
if(CURLE_OK != Curl_nss_force_init(conn->data))
return CURLE_OUT_OF_MEMORY;
#endif
@@ -170,8 +173,8 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
case NTLMSTATE_TYPE1:
default: /* for the weird cases we (re)start here */
/* Create a type-1 message */
- result = Curl_auth_create_ntlm_type1_message(userp, passwdp, ntlm, &base64,
- &len);
+ result = Curl_auth_create_ntlm_type1_message(conn->data, userp, passwdp,
+ ntlm, &base64, &len);
if(result)
return result;
diff --git a/lib/http_proxy.c b/lib/http_proxy.c
index 36567d3..0283c1f 100644
--- a/lib/http_proxy.c
+++ b/lib/http_proxy.c
@@ -137,7 +137,7 @@ CURLcode Curl_proxy_connect(struct connectdata *conn, int sockindex)
bool Curl_connect_complete(struct connectdata *conn)
{
- return conn->connect_state &&
+ return !conn->connect_state ||
(conn->connect_state->tunnel_state == TUNNEL_COMPLETE);
}
@@ -163,10 +163,10 @@ static CURLcode connect_init(struct connectdata *conn, bool reinit)
s = conn->connect_state;
}
s->tunnel_state = TUNNEL_INIT;
- s->keepon=TRUE;
+ s->keepon = TRUE;
s->line_start = s->connect_buffer;
s->ptr = s->line_start;
- s->cl=0;
+ s->cl = 0;
return CURLE_OK;
}
@@ -182,13 +182,13 @@ static CURLcode CONNECT(struct connectdata *conn,
const char *hostname,
int remote_port)
{
- int subversion=0;
- struct Curl_easy *data=conn->data;
+ int subversion = 0;
+ struct Curl_easy *data = conn->data;
struct SingleRequest *k = &data->req;
CURLcode result;
curl_socket_t tunnelsocket = conn->sock[sockindex];
bool closeConnection = FALSE;
- time_t check;
+ timediff_t check;
struct http_connect_state *s = conn->connect_state;
#define SELECT_OK 0
@@ -234,8 +234,8 @@ static CURLcode CONNECT(struct connectdata *conn,
if(!result) {
char *host = NULL;
- const char *proxyconn="";
- const char *useragent="";
+ const char *proxyconn = "";
+ const char *useragent = "";
const char *http = (conn->http_proxy.proxytype == CURLPROXY_HTTP_1_0) ?
"1.0" : "1.1";
bool ipv6_ip = conn->bits.ipv6_ip;
@@ -244,7 +244,7 @@ static CURLcode CONNECT(struct connectdata *conn,
/* the hostname may be different */
if(hostname != conn->host.name)
ipv6_ip = (strchr(hostname, ':') != NULL);
- hostheader= /* host:port with IPv6 support */
+ hostheader = /* host:port with IPv6 support */
aprintf("%s%s%s:%hu", ipv6_ip?"[":"", hostname, ipv6_ip?"]":"",
remote_port);
if(!hostheader) {
@@ -410,7 +410,8 @@ static CURLcode CONNECT(struct connectdata *conn,
}
/* convert from the network encoding */
- result = Curl_convert_from_network(data, line_start, perline);
+ result = Curl_convert_from_network(data, s->line_start,
+ (size_t)s->perline);
/* Curl_convert_from_network calls failf if unsuccessful */
if(result)
return result;
@@ -523,8 +524,8 @@ static CURLcode CONNECT(struct connectdata *conn,
k->httpcode);
}
else {
- s->cl = curlx_strtoofft(s->line_start +
- strlen("Content-Length:"), NULL, 10);
+ (void)curlx_strtoofft(s->line_start +
+ strlen("Content-Length:"), NULL, 10, &s->cl);
}
}
else if(Curl_compareheader(s->line_start, "Connection:", "close"))
@@ -566,7 +567,7 @@ static CURLcode CONNECT(struct connectdata *conn,
if(error)
return CURLE_RECV_ERROR;
- if(data->info.httpproxycode != 200) {
+ if(data->info.httpproxycode/100 != 2) {
/* Deal with the possibly already received authenticate
headers. 'newurl' is set to a new URL if we must loop. */
result = Curl_http_auth_act(conn);
@@ -597,7 +598,7 @@ static CURLcode CONNECT(struct connectdata *conn,
} while(data->req.newurl);
- if(200 != data->req.httpcode) {
+ if(data->info.httpproxycode/100 != 2) {
if(closeConnection && data->req.newurl) {
conn->bits.proxy_connect_closed = TRUE;
infof(data, "Connect me again please\n");
@@ -633,7 +634,8 @@ static CURLcode CONNECT(struct connectdata *conn,
data->state.authproxy.done = TRUE;
- infof(data, "Proxy replied OK to CONNECT request\n");
+ infof(data, "Proxy replied %d to CONNECT request\n",
+ data->info.httpproxycode);
data->req.ignorebody = FALSE; /* put it (back) to non-ignore state */
conn->bits.rewindaftersend = FALSE; /* make sure this isn't set for the
document request */
diff --git a/lib/if2ip.c b/lib/if2ip.c
index a91b6d2..ce38ea1 100644
--- a/lib/if2ip.c
+++ b/lib/if2ip.c
@@ -103,7 +103,7 @@ bool Curl_if_is_interface_name(const char *interf)
struct ifaddrs *iface, *head;
if(getifaddrs(&head) >= 0) {
- for(iface=head; iface != NULL; iface=iface->ifa_next) {
+ for(iface = head; iface != NULL; iface = iface->ifa_next) {
if(strcasecompare(iface->ifa_name, interf)) {
result = TRUE;
break;
@@ -131,7 +131,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
#endif
if(getifaddrs(&head) >= 0) {
- for(iface = head; iface != NULL; iface=iface->ifa_next) {
+ for(iface = head; iface != NULL; iface = iface->ifa_next) {
if(iface->ifa_addr != NULL) {
if(iface->ifa_addr->sa_family == af) {
if(strcasecompare(iface->ifa_name, interf)) {
@@ -230,7 +230,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
return IF2IP_NOT_FOUND;
memset(&req, 0, sizeof(req));
- memcpy(req.ifr_name, interf, len+1);
+ memcpy(req.ifr_name, interf, len + 1);
req.ifr_addr.sa_family = AF_INET;
if(ioctl(dummy, SIOCGIFADDR, &req) < 0) {
diff --git a/lib/imap.c b/lib/imap.c
index 48af290..1b52f73 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -68,6 +68,7 @@
#include "http.h" /* for HTTP proxy tunnel stuff */
#include "socks.h"
#include "imap.h"
+#include "mime.h"
#include "strtoofft.h"
#include "strcase.h"
#include "vtls/vtls.h"
@@ -162,11 +163,15 @@ const struct Curl_handler Curl_handler_imaps = {
};
#endif
+#define IMAP_RESP_OK 1
+#define IMAP_RESP_NOT_OK 2
+#define IMAP_RESP_PREAUTH 3
+
/* SASL parameters for the imap protocol */
static const struct SASLproto saslimap = {
"imap", /* The service name */
'+', /* Code received when continuation is expected */
- 'O', /* Code to receive upon authentication success */
+ IMAP_RESP_OK, /* Code to receive upon authentication success */
0, /* Maximum initial response length (no max) */
imap_perform_authenticate, /* Send authentication command */
imap_continue_authenticate, /* Send authentication continuation */
@@ -249,15 +254,11 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
len -= id_len + 1;
if(len >= 2 && !memcmp(line, "OK", 2))
- *resp = 'O';
- else if(len >= 2 && !memcmp(line, "NO", 2))
- *resp = 'N';
- else if(len >= 3 && !memcmp(line, "BAD", 3))
- *resp = 'B';
- else {
- failf(conn->data, "Bad tagged response");
- *resp = -1;
- }
+ *resp = IMAP_RESP_OK;
+ else if(len >= 7 && !memcmp(line, "PREAUTH", 7))
+ *resp = IMAP_RESP_PREAUTH;
+ else
+ *resp = IMAP_RESP_NOT_OK;
return TRUE;
}
@@ -274,15 +275,15 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
case IMAP_LIST:
if((!imap->custom && !imap_matchresp(line, len, "LIST")) ||
(imap->custom && !imap_matchresp(line, len, imap->custom) &&
- (strcmp(imap->custom, "STORE") ||
+ (!strcasecompare(imap->custom, "STORE") ||
!imap_matchresp(line, len, "FETCH")) &&
- strcmp(imap->custom, "SELECT") &&
- strcmp(imap->custom, "EXAMINE") &&
- strcmp(imap->custom, "SEARCH") &&
- strcmp(imap->custom, "EXPUNGE") &&
- strcmp(imap->custom, "LSUB") &&
- strcmp(imap->custom, "UID") &&
- strcmp(imap->custom, "NOOP")))
+ !strcasecompare(imap->custom, "SELECT") &&
+ !strcasecompare(imap->custom, "EXAMINE") &&
+ !strcasecompare(imap->custom, "SEARCH") &&
+ !strcasecompare(imap->custom, "EXPUNGE") &&
+ !strcasecompare(imap->custom, "LSUB") &&
+ !strcasecompare(imap->custom, "UID") &&
+ !strcasecompare(imap->custom, "NOOP")))
return FALSE;
break;
@@ -563,9 +564,10 @@ static CURLcode imap_perform_authentication(struct connectdata *conn)
struct imap_conn *imapc = &conn->proto.imapc;
saslprogress progress;
- /* Check we have enough data to authenticate with and end the
- connect phase if we don't */
- if(!Curl_sasl_can_authenticate(&imapc->sasl, conn)) {
+ /* Check if already authenticated OR if there is enough data to authenticate
+ with and end the connect phase if we don't */
+ if(imapc->preauth ||
+ !Curl_sasl_can_authenticate(&imapc->sasl, conn)) {
state(conn, IMAP_STOP);
return result;
}
@@ -707,18 +709,48 @@ static CURLcode imap_perform_fetch(struct connectdata *conn)
static CURLcode imap_perform_append(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
- struct IMAP *imap = conn->data->req.protop;
+ struct Curl_easy *data = conn->data;
+ struct IMAP *imap = data->req.protop;
char *mailbox;
/* Check we have a mailbox */
if(!imap->mailbox) {
- failf(conn->data, "Cannot APPEND without a mailbox.");
+ failf(data, "Cannot APPEND without a mailbox.");
return CURLE_URL_MALFORMAT;
}
+ /* Prepare the mime data if some. */
+ if(data->set.mimepost.kind != MIMEKIND_NONE) {
+ /* Use the whole structure as data. */
+ data->set.mimepost.flags &= ~MIME_BODY_ONLY;
+
+ /* Add external headers and mime version. */
+ curl_mime_headers(&data->set.mimepost, data->set.headers, 0);
+ result = Curl_mime_prepare_headers(&data->set.mimepost, NULL,
+ NULL, MIMESTRATEGY_MAIL);
+
+ if(!result)
+ if(!Curl_checkheaders(conn, "Mime-Version"))
+ result = Curl_mime_add_header(&data->set.mimepost.curlheaders,
+ "Mime-Version: 1.0");
+
+ /* Make sure we will read the entire mime structure. */
+ if(!result)
+ result = Curl_mime_rewind(&data->set.mimepost);
+
+ if(result)
+ return result;
+
+ data->state.infilesize = Curl_mime_size(&data->set.mimepost);
+
+ /* Read from mime structure. */
+ data->state.fread_func = (curl_read_callback) Curl_mime_read;
+ data->state.in = (void *) &data->set.mimepost;
+ }
+
/* Check we know the size of the upload */
- if(conn->data->state.infilesize < 0) {
- failf(conn->data, "Cannot APPEND with unknown input file size\n");
+ if(data->state.infilesize < 0) {
+ failf(data, "Cannot APPEND with unknown input file size\n");
return CURLE_UPLOAD_FAILED;
}
@@ -729,7 +761,7 @@ static CURLcode imap_perform_append(struct connectdata *conn)
/* Send the APPEND command */
result = imap_sendf(conn, "APPEND %s (\\Seen) {%" CURL_FORMAT_CURL_OFF_T "}",
- mailbox, conn->data->state.infilesize);
+ mailbox, data->state.infilesize);
free(mailbox);
@@ -789,19 +821,21 @@ static CURLcode imap_state_servergreet_resp(struct connectdata *conn,
int imapcode,
imapstate instate)
{
- CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
-
(void)instate; /* no use for this yet */
- if(imapcode != 'O') {
+ if(imapcode == IMAP_RESP_PREAUTH) {
+ /* PREAUTH */
+ struct imap_conn *imapc = &conn->proto.imapc;
+ imapc->preauth = TRUE;
+ infof(data, "PREAUTH connection, already authenticated!\n");
+ }
+ else if(imapcode != IMAP_RESP_OK) {
failf(data, "Got unexpected imap-server response");
- result = CURLE_WEIRD_SERVER_REPLY;
+ return CURLE_WEIRD_SERVER_REPLY;
}
- else
- result = imap_perform_capability(conn);
- return result;
+ return imap_perform_capability(conn);
}
/* For CAPABILITY responses */
@@ -868,7 +902,7 @@ static CURLcode imap_state_capability_resp(struct connectdata *conn,
line += wordlen;
}
}
- else if(imapcode == 'O') {
+ else if(imapcode == IMAP_RESP_OK) {
if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) {
/* We don't have a SSL/TLS connection yet, but SSL is requested */
if(imapc->tls_supported)
@@ -901,7 +935,7 @@ static CURLcode imap_state_starttls_resp(struct connectdata *conn,
(void)instate; /* no use for this yet */
- if(imapcode != 'O') {
+ if(imapcode != IMAP_RESP_OK) {
if(data->set.use_ssl != CURLUSESSL_TRY) {
failf(data, "STARTTLS denied");
result = CURLE_USE_SSL_FAILED;
@@ -959,7 +993,7 @@ static CURLcode imap_state_login_resp(struct connectdata *conn,
(void)instate; /* no use for this yet */
- if(imapcode != 'O') {
+ if(imapcode != IMAP_RESP_OK) {
failf(data, "Access denied. %c", imapcode);
result = CURLE_LOGIN_DENIED;
}
@@ -987,7 +1021,7 @@ static CURLcode imap_state_listsearch_resp(struct connectdata *conn,
result = Curl_client_write(conn, CLIENTWRITE_BODY, line, len + 1);
line[len] = '\0';
}
- else if(imapcode != 'O')
+ else if(imapcode != IMAP_RESP_OK)
result = CURLE_QUOTE_ERROR; /* TODO: Fix error code */
else
/* End of DO phase */
@@ -1016,10 +1050,10 @@ static CURLcode imap_state_select_resp(struct connectdata *conn, int imapcode,
imapc->mailbox_uidvalidity = strdup(tmp);
}
}
- else if(imapcode == 'O') {
+ else if(imapcode == IMAP_RESP_OK) {
/* Check if the UIDVALIDITY has been specified and matches */
if(imap->uidvalidity && imapc->mailbox_uidvalidity &&
- strcmp(imap->uidvalidity, imapc->mailbox_uidvalidity)) {
+ !strcasecompare(imap->uidvalidity, imapc->mailbox_uidvalidity)) {
failf(conn->data, "Mailbox UIDVALIDITY has changed");
result = CURLE_REMOTE_FILE_NOT_FOUND;
}
@@ -1070,10 +1104,11 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
if(*ptr == '{') {
char *endptr;
- size = curlx_strtoofft(ptr + 1, &endptr, 10);
- if(endptr - ptr > 1 && endptr[0] == '}' &&
- endptr[1] == '\r' && endptr[2] == '\0')
- parsed = TRUE;
+ if(!curlx_strtoofft(ptr + 1, &endptr, 10, &size)) {
+ if(endptr - ptr > 1 && endptr[0] == '}' &&
+ endptr[1] == '\r' && endptr[2] == '\0')
+ parsed = TRUE;
+ }
}
if(parsed) {
@@ -1091,6 +1126,11 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
/* The conversion from curl_off_t to size_t is always fine here */
chunk = (size_t)size;
+ if(!chunk) {
+ /* no size, we're done with the data */
+ state(conn, IMAP_STOP);
+ return CURLE_OK;
+ }
result = Curl_client_write(conn, CLIENTWRITE_BODY, pp->cache, chunk);
if(result)
return result;
@@ -1147,7 +1187,7 @@ static CURLcode imap_state_fetch_final_resp(struct connectdata *conn,
(void)instate; /* No use for this yet */
- if(imapcode != 'O')
+ if(imapcode != IMAP_RESP_OK)
result = CURLE_WEIRD_SERVER_REPLY;
else
/* End of DONE phase */
@@ -1191,7 +1231,7 @@ static CURLcode imap_state_append_final_resp(struct connectdata *conn,
(void)instate; /* No use for this yet */
- if(imapcode != 'O')
+ if(imapcode != IMAP_RESP_OK)
result = CURLE_UPLOAD_FAILED;
else
/* End of DONE phase */
@@ -1419,9 +1459,10 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
result = status; /* use the already set error code */
}
else if(!data->set.connect_only && !imap->custom &&
- (imap->uid || data->set.upload)) {
+ (imap->uid || data->set.upload ||
+ data->set.mimepost.kind != MIMEKIND_NONE)) {
/* Handle responses after FETCH or APPEND transfer has finished */
- if(!data->set.upload)
+ if(!data->set.upload && data->set.mimepost.kind == MIMEKIND_NONE)
state(conn, IMAP_FETCH_FINAL);
else {
/* End the APPEND command first by sending an empty line */
@@ -1485,13 +1526,13 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected,
/* Determine if the requested mailbox (with the same UIDVALIDITY if set)
has already been selected on this connection */
if(imap->mailbox && imapc->mailbox &&
- !strcmp(imap->mailbox, imapc->mailbox) &&
+ strcasecompare(imap->mailbox, imapc->mailbox) &&
(!imap->uidvalidity || !imapc->mailbox_uidvalidity ||
- !strcmp(imap->uidvalidity, imapc->mailbox_uidvalidity)))
+ strcasecompare(imap->uidvalidity, imapc->mailbox_uidvalidity)))
selected = TRUE;
/* Start the first command in the DO phase */
- if(conn->data->set.upload)
+ if(conn->data->set.upload || data->set.mimepost.kind != MIMEKIND_NONE)
/* APPEND can be executed directly */
result = imap_perform_append(conn);
else if(imap->custom && (selected || !imap->mailbox))
@@ -1761,7 +1802,7 @@ static char *imap_atom(const char *str, bool escape_only)
return strdup(str);
/* Calculate the new string length */
- newlen = strlen(str) + backsp_count + quote_count + (others_exists ? 2 : 0);
+ newlen = strlen(str) + backsp_count + quote_count + (escape_only ? 0 : 2);
/* Allocate the new string */
newstr = (char *) malloc((newlen + 1) * sizeof(char));
@@ -1770,7 +1811,7 @@ static char *imap_atom(const char *str, bool escape_only)
/* Surround the string in quotes if necessary */
p2 = newstr;
- if(others_exists) {
+ if(!escape_only) {
newstr[0] = '"';
newstr[newlen - 1] = '"';
p2++;
diff --git a/lib/imap.h b/lib/imap.h
index 5e0e228..9fc4ff5 100644
--- a/lib/imap.h
+++ b/lib/imap.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -71,6 +71,7 @@ struct imap_conn {
struct pingpong pp;
imapstate state; /* Always use imap.c:state() to change state! */
bool ssldone; /* Is connect() over SSL done? */
+ bool preauth; /* Is this connection PREAUTH? */
struct SASL sasl; /* SASL-related parameters */
unsigned int preftype; /* Preferred authentication type */
int cmdid; /* Last used command ID */
diff --git a/lib/inet_ntop.c b/lib/inet_ntop.c
index 22f08e8..fb91a50 100644
--- a/lib/inet_ntop.c
+++ b/lib/inet_ntop.c
@@ -141,7 +141,7 @@ static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)
*/
if(i == 6 && best.base == 0 &&
(best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {
- if(!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp))) {
+ if(!inet_ntop4(src + 12, tp, sizeof(tmp) - (tp - tmp))) {
errno = ENOSPC;
return (NULL);
}
diff --git a/lib/ldap.c b/lib/ldap.c
index 435b990..89047bc 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -190,9 +190,11 @@ static int ldap_win_bind_auth(LDAP *server, const char *user,
const char *passwd, unsigned long authflags)
{
ULONG method = 0;
- SEC_WINNT_AUTH_IDENTITY cred = { 0, };
+ SEC_WINNT_AUTH_IDENTITY cred;
int rc = LDAP_AUTH_METHOD_NOT_SUPPORTED;
+ memset(&cred, 0, sizeof(cred));
+
#if defined(USE_SPNEGO)
if(authflags & CURLAUTH_NEGOTIATE) {
method = LDAP_AUTH_NEGOTIATE;
@@ -267,7 +269,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
LDAPMessage *ldapmsg = NULL;
LDAPMessage *entryIterator;
int num = 0;
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
int ldap_proto = LDAP_VERSION3;
int ldap_ssl = 0;
char *val_b64 = NULL;
diff --git a/lib/libcurl.plist b/lib/libcurl.plist
index f53c58e..2e37786 100644
--- a/lib/libcurl.plist
+++ b/lib/libcurl.plist
@@ -15,7 +15,7 @@
<string>se.haxx.curl.libcurl</string>
<key>CFBundleVersion</key>
- <string>7.55.1</string>
+ <string>7.57.0</string>
<key>CFBundleName</key>
<string>libcurl</string>
@@ -27,9 +27,9 @@
<string>????</string>
<key>CFBundleShortVersionString</key>
- <string>libcurl 7.55.1</string>
+ <string>libcurl 7.57.0</string>
<key>CFBundleGetInfoString</key>
- <string>libcurl.plist 7.55.1</string>
+ <string>libcurl.plist 7.57.0</string>
</dict>
</plist>
diff --git a/lib/llist.c b/lib/llist.c
index 4bb0a51..f8769c2 100644
--- a/lib/llist.c
+++ b/lib/llist.c
@@ -106,7 +106,11 @@ Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,
e->next->prev = NULL;
}
else {
- e->prev->next = e->next;
+ if(!e->prev)
+ list->head = e->next;
+ else
+ e->prev->next = e->next;
+
if(!e->next)
list->tail = e->prev;
else
diff --git a/lib/memdebug.c b/lib/memdebug.c
index 8c9fe95..2b81c26 100644
--- a/lib/memdebug.c
+++ b/lib/memdebug.c
@@ -170,7 +170,7 @@ void *curl_domalloc(size_t wantedsize, int line, const char *source)
return NULL;
/* alloc at least 64 bytes */
- size = sizeof(struct memdebug)+wantedsize;
+ size = sizeof(struct memdebug) + wantedsize;
mem = (Curl_cmalloc)(size);
if(mem) {
@@ -225,9 +225,9 @@ char *curl_dostrdup(const char *str, int line, const char *source)
if(countcheck("strdup", line, source))
return NULL;
- len=strlen(str)+1;
+ len = strlen(str) + 1;
- mem=curl_domalloc(len, 0, NULL); /* NULL prevents logging */
+ mem = curl_domalloc(len, 0, NULL); /* NULL prevents logging */
if(mem)
memcpy(mem, str, len);
@@ -269,9 +269,9 @@ wchar_t *curl_dowcsdup(const wchar_t *str, int line, const char *source)
void *curl_dorealloc(void *ptr, size_t wantedsize,
int line, const char *source)
{
- struct memdebug *mem=NULL;
+ struct memdebug *mem = NULL;
- size_t size = sizeof(struct memdebug)+wantedsize;
+ size_t size = sizeof(struct memdebug) + wantedsize;
DEBUGASSERT(wantedsize != 0);
@@ -343,7 +343,12 @@ curl_socket_t curl_socket(int domain, int type, int protocol,
"FD %s:%d socket() = %ld\n" :
"FD %s:%d socket() = %zd\n";
- curl_socket_t sockfd = socket(domain, type, protocol);
+ curl_socket_t sockfd;
+
+ if(countcheck("socket", line, source))
+ return CURL_SOCKET_BAD;
+
+ sockfd = socket(domain, type, protocol);
if(source && (sockfd != CURL_SOCKET_BAD))
curl_memlog(fmt, source, line, sockfd);
@@ -351,6 +356,35 @@ curl_socket_t curl_socket(int domain, int type, int protocol,
return sockfd;
}
+SEND_TYPE_RETV curl_dosend(SEND_TYPE_ARG1 sockfd,
+ SEND_QUAL_ARG2 SEND_TYPE_ARG2 buf,
+ SEND_TYPE_ARG3 len, SEND_TYPE_ARG4 flags, int line,
+ const char *source)
+{
+ SEND_TYPE_RETV rc;
+ if(countcheck("send", line, source))
+ return -1;
+ rc = send(sockfd, buf, len, flags);
+ if(source)
+ curl_memlog("SEND %s:%d send(%lu) = %ld\n",
+ source, line, (unsigned long)len, (long)rc);
+ return rc;
+}
+
+RECV_TYPE_RETV curl_dorecv(RECV_TYPE_ARG1 sockfd, RECV_TYPE_ARG2 buf,
+ RECV_TYPE_ARG3 len, RECV_TYPE_ARG4 flags, int line,
+ const char *source)
+{
+ RECV_TYPE_RETV rc;
+ if(countcheck("recv", line, source))
+ return -1;
+ rc = recv(sockfd, buf, len, flags);
+ if(source)
+ curl_memlog("RECV %s:%d recv(%lu) = %ld\n",
+ source, line, (unsigned long)len, (long)rc);
+ return rc;
+}
+
#ifdef HAVE_SOCKETPAIR
int curl_socketpair(int domain, int type, int protocol,
curl_socket_t socket_vector[2],
@@ -407,7 +441,7 @@ void curl_mark_sclose(curl_socket_t sockfd, int line, const char *source)
/* this is our own defined way to close sockets on *ALL* platforms */
int curl_sclose(curl_socket_t sockfd, int line, const char *source)
{
- int res=sclose(sockfd);
+ int res = sclose(sockfd);
curl_mark_sclose(sockfd, line, source);
return res;
}
@@ -415,7 +449,7 @@ int curl_sclose(curl_socket_t sockfd, int line, const char *source)
FILE *curl_fopen(const char *file, const char *mode,
int line, const char *source)
{
- FILE *res=fopen(file, mode);
+ FILE *res = fopen(file, mode);
if(source)
curl_memlog("FILE %s:%d fopen(\"%s\",\"%s\") = %p\n",
@@ -428,7 +462,7 @@ FILE *curl_fopen(const char *file, const char *mode,
FILE *curl_fdopen(int filedes, const char *mode,
int line, const char *source)
{
- FILE *res=fdopen(filedes, mode);
+ FILE *res = fdopen(filedes, mode);
if(source)
curl_memlog("FILE %s:%d fdopen(\"%d\",\"%s\") = %p\n",
@@ -444,7 +478,7 @@ int curl_fclose(FILE *file, int line, const char *source)
DEBUGASSERT(file != NULL);
- res=fclose(file);
+ res = fclose(file);
if(source)
curl_memlog("FILE %s:%d fclose(%p)\n",
diff --git a/lib/memdebug.h b/lib/memdebug.h
index 835dab3..6fb8b68 100644
--- a/lib/memdebug.h
+++ b/lib/memdebug.h
@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -66,6 +66,17 @@ CURL_EXTERN int curl_socketpair(int domain, int type, int protocol,
int line, const char *source);
#endif
+/* send/receive sockets */
+CURL_EXTERN SEND_TYPE_RETV curl_dosend(SEND_TYPE_ARG1 sockfd,
+ SEND_QUAL_ARG2 SEND_TYPE_ARG2 buf,
+ SEND_TYPE_ARG3 len,
+ SEND_TYPE_ARG4 flags, int line,
+ const char *source);
+CURL_EXTERN RECV_TYPE_RETV curl_dorecv(RECV_TYPE_ARG1 sockfd,
+ RECV_TYPE_ARG2 buf, RECV_TYPE_ARG3 len,
+ RECV_TYPE_ARG4 flags, int line,
+ const char *source);
+
/* FILE functions */
CURL_EXTERN FILE *curl_fopen(const char *file, const char *mode, int line,
const char *source);
@@ -84,6 +95,8 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source);
#define calloc(nbelem,size) curl_docalloc(nbelem, size, __LINE__, __FILE__)
#define realloc(ptr,size) curl_dorealloc(ptr, size, __LINE__, __FILE__)
#define free(ptr) curl_dofree(ptr, __LINE__, __FILE__)
+#define send(a,b,c,d) curl_dosend(a,b,c,d, __LINE__, __FILE__)
+#define recv(a,b,c,d) curl_dorecv(a,b,c,d, __LINE__, __FILE__)
#ifdef WIN32
# ifdef UNICODE
diff --git a/lib/mime.c b/lib/mime.c
new file mode 100644
index 0000000..457000a
--- /dev/null
+++ b/lib/mime.c
@@ -0,0 +1,1908 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#include <curl/curl.h>
+
+#include "mime.h"
+#include "non-ascii.h"
+#include "urldata.h"
+#include "sendf.h"
+
+#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_SMTP) || \
+ !defined(CURL_DISABLE_IMAP)
+
+#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
+#include <libgen.h>
+#endif
+
+#include "rand.h"
+#include "slist.h"
+#include "strcase.h"
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+#ifdef WIN32
+# ifndef R_OK
+# define R_OK 4
+# endif
+#endif
+
+
+#define FILE_CONTENTTYPE_DEFAULT "application/octet-stream"
+#define MULTIPART_CONTENTTYPE_DEFAULT "multipart/mixed"
+#define DISPOSITION_DEFAULT "attachment"
+
+#define READ_ERROR ((size_t) -1)
+
+/* Encoders. */
+static size_t encoder_nop_read(char *buffer, size_t size, bool ateof,
+ curl_mimepart *part);
+static curl_off_t encoder_nop_size(curl_mimepart *part);
+static size_t encoder_7bit_read(char *buffer, size_t size, bool ateof,
+ curl_mimepart *part);
+static size_t encoder_base64_read(char *buffer, size_t size, bool ateof,
+ curl_mimepart *part);
+static curl_off_t encoder_base64_size(curl_mimepart *part);
+static size_t encoder_qp_read(char *buffer, size_t size, bool ateof,
+ curl_mimepart *part);
+static curl_off_t encoder_qp_size(curl_mimepart *part);
+
+static const mime_encoder encoders[] = {
+ {"binary", encoder_nop_read, encoder_nop_size},
+ {"8bit", encoder_nop_read, encoder_nop_size},
+ {"7bit", encoder_7bit_read, encoder_nop_size},
+ {"base64", encoder_base64_read, encoder_base64_size},
+ {"quoted-printable", encoder_qp_read, encoder_qp_size},
+ {ZERO_NULL, ZERO_NULL, ZERO_NULL}
+};
+
+/* Base64 encoding table */
+static const char base64[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+/* Quoted-printable character class table.
+ *
+ * We cannot rely on ctype functions since quoted-printable input data
+ * is assumed to be ascii-compatible, even on non-ascii platforms. */
+#define QP_OK 1 /* Can be represented by itself. */
+#define QP_SP 2 /* Space or tab. */
+#define QP_CR 3 /* Carriage return. */
+#define QP_LF 4 /* Line-feed. */
+static const unsigned char qp_class[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 00 - 07 */
+ 0, QP_SP, QP_LF, 0, 0, QP_CR, 0, 0, /* 08 - 0F */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 10 - 17 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 18 - 1F */
+ QP_SP, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 20 - 27 */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 28 - 2F */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 30 - 37 */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, 0 , QP_OK, QP_OK, /* 38 - 3F */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 40 - 47 */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 48 - 4F */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 50 - 57 */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 58 - 5F */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 60 - 67 */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 68 - 6F */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, /* 70 - 77 */
+ QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, QP_OK, 0, /* 78 - 7F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 - 8F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 - 9F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A0 - AF */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* B0 - BF */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* C0 - CF */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* D0 - DF */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* E0 - EF */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* F0 - FF */
+};
+
+
+/* Binary --> hexadecimal ASCII table. */
+static const char aschex[] =
+ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x41\x42\x43\x44\x45\x46";
+
+
+
+#ifndef __VMS
+#define filesize(name, stat_data) (stat_data.st_size)
+#define fopen_read fopen
+
+#else
+
+#include <fabdef.h>
+/*
+ * get_vms_file_size does what it takes to get the real size of the file
+ *
+ * For fixed files, find out the size of the EOF block and adjust.
+ *
+ * For all others, have to read the entire file in, discarding the contents.
+ * Most posted text files will be small, and binary files like zlib archives
+ * and CD/DVD images should be either a STREAM_LF format or a fixed format.
+ *
+ */
+curl_off_t VmsRealFileSize(const char *name,
+ const struct_stat *stat_buf)
+{
+ char buffer[8192];
+ curl_off_t count;
+ int ret_stat;
+ FILE * file;
+
+ file = fopen(name, FOPEN_READTEXT); /* VMS */
+ if(file == NULL)
+ return 0;
+
+ count = 0;
+ ret_stat = 1;
+ while(ret_stat > 0) {
+ ret_stat = fread(buffer, 1, sizeof(buffer), file);
+ if(ret_stat != 0)
+ count += ret_stat;
+ }
+ fclose(file);
+
+ return count;
+}
+
+/*
+ *
+ * VmsSpecialSize checks to see if the stat st_size can be trusted and
+ * if not to call a routine to get the correct size.
+ *
+ */
+static curl_off_t VmsSpecialSize(const char *name,
+ const struct_stat *stat_buf)
+{
+ switch(stat_buf->st_fab_rfm) {
+ case FAB$C_VAR:
+ case FAB$C_VFC:
+ return VmsRealFileSize(name, stat_buf);
+ break;
+ default:
+ return stat_buf->st_size;
+ }
+}
+
+#define filesize(name, stat_data) VmsSpecialSize(name, &stat_data)
+
+/*
+ * vmsfopenread
+ *
+ * For upload to work as expected on VMS, different optional
+ * parameters must be added to the fopen command based on
+ * record format of the file.
+ *
+ */
+static FILE * vmsfopenread(const char *file, const char *mode)
+{
+ struct_stat statbuf;
+ int result;
+
+ result = stat(file, &statbuf);
+
+ switch(statbuf.st_fab_rfm) {
+ case FAB$C_VAR:
+ case FAB$C_VFC:
+ case FAB$C_STMCR:
+ return fopen(file, FOPEN_READTEXT); /* VMS */
+ break;
+ default:
+ return fopen(file, FOPEN_READTEXT, "rfm=stmlf", "ctx=stm");
+ }
+}
+
+#define fopen_read vmsfopenread
+#endif
+
+
+#ifndef HAVE_BASENAME
+/*
+ (Quote from The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004
+ Edition)
+
+ The basename() function shall take the pathname pointed to by path and
+ return a pointer to the final component of the pathname, deleting any
+ trailing '/' characters.
+
+ If the string pointed to by path consists entirely of the '/' character,
+ basename() shall return a pointer to the string "/". If the string pointed
+ to by path is exactly "//", it is implementation-defined whether '/' or "//"
+ is returned.
+
+ If path is a null pointer or points to an empty string, basename() shall
+ return a pointer to the string ".".
+
+ The basename() function may modify the string pointed to by path, and may
+ return a pointer to static storage that may then be overwritten by a
+ subsequent call to basename().
+
+ The basename() function need not be reentrant. A function that is not
+ required to be reentrant is not required to be thread-safe.
+
+*/
+static char *Curl_basename(char *path)
+{
+ /* Ignore all the details above for now and make a quick and simple
+ implementaion here */
+ char *s1;
+ char *s2;
+
+ s1 = strrchr(path, '/');
+ s2 = strrchr(path, '\\');
+
+ if(s1 && s2) {
+ path = (s1 > s2? s1 : s2) + 1;
+ }
+ else if(s1)
+ path = s1 + 1;
+ else if(s2)
+ path = s2 + 1;
+
+ return path;
+}
+
+#define basename(x) Curl_basename((x))
+#endif
+
+
+/* Set readback state. */
+static void mimesetstate(mime_state *state, enum mimestate tok, void *ptr)
+{
+ state->state = tok;
+ state->ptr = ptr;
+ state->offset = 0;
+}
+
+
+/* Escape header string into allocated memory. */
+static char *escape_string(const char *src)
+{
+ size_t bytecount = 0;
+ size_t i;
+ char *dst;
+
+ for(i = 0; src[i]; i++)
+ if(src[i] == '"' || src[i] == '\\')
+ bytecount++;
+
+ bytecount += i;
+ dst = malloc(bytecount + 1);
+ if(!dst)
+ return NULL;
+
+ for(i = 0; *src; src++) {
+ if(*src == '"' || *src == '\\')
+ dst[i++] = '\\';
+ dst[i++] = *src;
+ }
+
+ dst[i] = '\0';
+ return dst;
+}
+
+/* Check if header matches. */
+static char *match_header(struct curl_slist *hdr, const char *lbl, size_t len)
+{
+ char *value = NULL;
+
+ if(strncasecompare(hdr->data, lbl, len) && hdr->data[len] == ':')
+ for(value = hdr->data + len + 1; *value == ' '; value++)
+ ;
+ return value;
+}
+
+/* Get a header from an slist. */
+static char *search_header(struct curl_slist *hdrlist, const char *hdr)
+{
+ size_t len = strlen(hdr);
+ char *value = NULL;
+
+ for(; !value && hdrlist; hdrlist = hdrlist->next)
+ value = match_header(hdrlist, hdr, len);
+
+ return value;
+}
+
+static char *strippath(const char *fullfile)
+{
+ char *filename;
+ char *base;
+ filename = strdup(fullfile); /* duplicate since basename() may ruin the
+ buffer it works on */
+ if(!filename)
+ return NULL;
+ base = strdup(basename(filename));
+
+ free(filename); /* free temporary buffer */
+
+ return base; /* returns an allocated string or NULL ! */
+}
+
+/* Initialize data encoder state. */
+static void cleanup_encoder_state(mime_encoder_state *p)
+{
+ p->pos = 0;
+ p->bufbeg = 0;
+ p->bufend = 0;
+}
+
+
+/* Dummy encoder. This is used for 8bit and binary content encodings. */
+static size_t encoder_nop_read(char *buffer, size_t size, bool ateof,
+ curl_mimepart *part)
+{
+ mime_encoder_state *st = &part->encstate;
+ size_t insize = st->bufend - st->bufbeg;
+
+ (void) ateof;
+
+ if(size > insize)
+ size = insize;
+ if(size)
+ memcpy(buffer, st->buf, size);
+ st->bufbeg += size;
+ return size;
+}
+
+static curl_off_t encoder_nop_size(curl_mimepart *part)
+{
+ return part->datasize;
+}
+
+
+/* 7bit encoder: the encoder is just a data validity check. */
+static size_t encoder_7bit_read(char *buffer, size_t size, bool ateof,
+ curl_mimepart *part)
+{
+ mime_encoder_state *st = &part->encstate;
+ size_t cursize = st->bufend - st->bufbeg;
+
+ (void) ateof;
+
+ if(size > cursize)
+ size = cursize;
+
+ for(cursize = 0; cursize < size; cursize++) {
+ *buffer = st->buf[st->bufbeg];
+ if(*buffer++ & 0x80)
+ return cursize? cursize: READ_ERROR;
+ st->bufbeg++;
+ }
+
+ return cursize;
+}
+
+
+/* Base64 content encoder. */
+static size_t encoder_base64_read(char *buffer, size_t size, bool ateof,
+ curl_mimepart *part)
+{
+ mime_encoder_state *st = &part->encstate;
+ size_t cursize = 0;
+ int i;
+ char *ptr = buffer;
+
+ while(st->bufbeg < st->bufend) {
+ /* Line full ? */
+ if(st->pos > MAX_ENCODED_LINE_LENGTH - 4) {
+ /* Yes, we need 2 characters for CRLF. */
+ if(size < 2)
+ break;
+ *ptr++ = '\r';
+ *ptr++ = '\n';
+ st->pos = 0;
+ cursize += 2;
+ size -= 2;
+ }
+
+ /* Be sure there is enough space and input data for a base64 group. */
+ if(size < 4 || st->bufend - st->bufbeg < 3)
+ break;
+
+ /* Encode three bytes as four characters. */
+ i = st->buf[st->bufbeg++] & 0xFF;
+ i = (i << 8) | (st->buf[st->bufbeg++] & 0xFF);
+ i = (i << 8) | (st->buf[st->bufbeg++] & 0xFF);
+ *ptr++ = base64[(i >> 18) & 0x3F];
+ *ptr++ = base64[(i >> 12) & 0x3F];
+ *ptr++ = base64[(i >> 6) & 0x3F];
+ *ptr++ = base64[i & 0x3F];
+ cursize += 4;
+ st->pos += 4;
+ size -= 4;
+ }
+
+ /* If at eof, we have to flush the buffered data. */
+ if(ateof && size >= 4) {
+ /* Buffered data size can only be 0, 1 or 2. */
+ ptr[2] = ptr[3] = '=';
+ i = 0;
+ switch(st->bufend - st->bufbeg) {
+ case 2:
+ i = (st->buf[st->bufbeg + 1] & 0xFF) << 8;
+ /* FALLTHROUGH */
+ case 1:
+ i |= (st->buf[st->bufbeg] & 0xFF) << 16;
+ ptr[0] = base64[(i >> 18) & 0x3F];
+ ptr[1] = base64[(i >> 12) & 0x3F];
+ if(++st->bufbeg != st->bufend) {
+ ptr[2] = base64[(i >> 6) & 0x3F];
+ st->bufbeg++;
+ }
+ cursize += 4;
+ st->pos += 4;
+ break;
+ }
+ }
+
+#ifdef CURL_DOES_CONVERSIONS
+ /* This is now textual data, Convert character codes. */
+ if(part->easy && cursize) {
+ CURLcode result = Curl_convert_to_network(part->easy, buffer, cursize);
+ if(result)
+ return READ_ERROR;
+ }
+#endif
+
+ return cursize;
+}
+
+static curl_off_t encoder_base64_size(curl_mimepart *part)
+{
+ curl_off_t size = part->datasize;
+
+ if(size <= 0)
+ return size; /* Unknown size or no data. */
+
+ /* Compute base64 character count. */
+ size = 4 * (1 + (size - 1) / 3);
+
+ /* Effective character count must include CRLFs. */
+ return size + 2 * ((size - 1) / MAX_ENCODED_LINE_LENGTH);
+}
+
+
+/* Quoted-printable lookahead.
+ *
+ * Check if a CRLF or end of data is in input buffer at current position + n.
+ * Return -1 if more data needed, 1 if CRLF or end of data, else 0.
+ */
+static int qp_lookahead_eol(mime_encoder_state *st, int ateof, size_t n)
+{
+ n += st->bufbeg;
+ if(n >= st->bufend && ateof)
+ return 1;
+ if(n + 2 > st->bufend)
+ return ateof? 0: -1;
+ if(qp_class[st->buf[n] & 0xFF] == QP_CR &&
+ qp_class[st->buf[n + 1] & 0xFF] == QP_LF)
+ return 1;
+ return 0;
+}
+
+/* Quoted-printable encoder. */
+static size_t encoder_qp_read(char *buffer, size_t size, bool ateof,
+ curl_mimepart *part)
+{
+ mime_encoder_state *st = &part->encstate;
+ char *ptr = buffer;
+ size_t cursize = 0;
+ int i;
+ size_t len;
+ size_t consumed;
+ int softlinebreak;
+ char buf[4];
+
+ /* On all platforms, input is supposed to be ASCII compatible: for this
+ reason, we use hexadecimal ASCII codes in this function rather than
+ character constants that can be interpreted as non-ascii on some
+ platforms. Preserve ASCII encoding on output too. */
+ while(st->bufbeg < st->bufend) {
+ len = 1;
+ consumed = 1;
+ i = st->buf[st->bufbeg];
+ buf[0] = (char) i;
+ buf[1] = aschex[(i >> 4) & 0xF];
+ buf[2] = aschex[i & 0xF];
+
+ switch(qp_class[st->buf[st->bufbeg] & 0xFF]) {
+ case QP_OK: /* Not a special character. */
+ break;
+ case QP_SP: /* Space or tab. */
+ /* Spacing must be escaped if followed by CRLF. */
+ switch(qp_lookahead_eol(st, ateof, 1)) {
+ case -1: /* More input data needed. */
+ return cursize;
+ case 0: /* No encoding needed. */
+ break;
+ default: /* CRLF after space or tab. */
+ buf[0] = '\x3D'; /* '=' */
+ len = 3;
+ break;
+ }
+ break;
+ case QP_CR: /* Carriage return. */
+ /* If followed by a line-feed, output the CRLF pair.
+ Else escape it. */
+ switch(qp_lookahead_eol(st, ateof, 0)) {
+ case -1: /* Need more data. */
+ return cursize;
+ case 1: /* CRLF found. */
+ buf[len++] = '\x0A'; /* Append '\n'. */
+ consumed = 2;
+ break;
+ default: /* Not followed by LF: escape. */
+ buf[0] = '\x3D'; /* '=' */
+ len = 3;
+ break;
+ }
+ break;
+ default: /* Character must be escaped. */
+ buf[0] = '\x3D'; /* '=' */
+ len = 3;
+ break;
+ }
+
+ /* Be sure the encoded character fits within maximum line length. */
+ if(buf[len - 1] != '\x0A') { /* '\n' */
+ softlinebreak = st->pos + len > MAX_ENCODED_LINE_LENGTH;
+ if(!softlinebreak && st->pos + len == MAX_ENCODED_LINE_LENGTH) {
+ /* We may use the current line only if end of data or followed by
+ a CRLF. */
+ switch(qp_lookahead_eol(st, ateof, consumed)) {
+ case -1: /* Need more data. */
+ return cursize;
+ break;
+ case 0: /* Not followed by a CRLF. */
+ softlinebreak = 1;
+ break;
+ }
+ }
+ if(softlinebreak) {
+ strcpy(buf, "\x3D\x0D\x0A"); /* "=\r\n" */
+ len = 3;
+ consumed = 0;
+ }
+ }
+
+ /* If the output buffer would overflow, do not store. */
+ if(len > size)
+ break;
+
+ /* Append to output buffer. */
+ memcpy(ptr, buf, len);
+ cursize += len;
+ ptr += len;
+ size -= len;
+ st->pos += len;
+ if(buf[len - 1] == '\x0A') /* '\n' */
+ st->pos = 0;
+ st->bufbeg += consumed;
+ }
+
+ return cursize;
+}
+
+static curl_off_t encoder_qp_size(curl_mimepart *part)
+{
+ /* Determining the size can only be done by reading the data: unless the
+ data size is 0, we return it as unknown (-1). */
+ return part->datasize? -1: 0;
+}
+
+
+/* In-memory data callbacks. */
+/* Argument is a pointer to the mime part. */
+static size_t mime_mem_read(char *buffer, size_t size, size_t nitems,
+ void *instream)
+{
+ curl_mimepart *part = (curl_mimepart *) instream;
+ size_t sz = (size_t) part->datasize - part->state.offset;
+ (void) size; /* Always 1.*/
+
+ if(sz > nitems)
+ sz = nitems;
+
+ if(sz)
+ memcpy(buffer, (char *) &part->data[part->state.offset], sz);
+
+ part->state.offset += sz;
+ return sz;
+}
+
+static int mime_mem_seek(void *instream, curl_off_t offset, int whence)
+{
+ curl_mimepart *part = (curl_mimepart *) instream;
+
+ switch(whence) {
+ case SEEK_CUR:
+ offset += part->state.offset;
+ break;
+ case SEEK_END:
+ offset += part->datasize;
+ break;
+ }
+
+ if(offset < 0 || offset > part->datasize)
+ return CURL_SEEKFUNC_FAIL;
+
+ part->state.offset = (size_t) offset;
+ return CURL_SEEKFUNC_OK;
+}
+
+static void mime_mem_free(void *ptr)
+{
+ Curl_safefree(((curl_mimepart *) ptr)->data);
+}
+
+
+/* Named file callbacks. */
+/* Argument is a pointer to the mime part. */
+static int mime_open_file(curl_mimepart * part)
+{
+ /* Open a MIMEKIND_FILE part. */
+
+ if(part->fp)
+ return 0;
+ part->fp = fopen_read(part->data, "rb");
+ return part->fp? 0: -1;
+}
+
+static size_t mime_file_read(char *buffer, size_t size, size_t nitems,
+ void *instream)
+{
+ curl_mimepart *part = (curl_mimepart *) instream;
+
+ if(mime_open_file(part))
+ return READ_ERROR;
+
+ return fread(buffer, size, nitems, part->fp);
+}
+
+static int mime_file_seek(void *instream, curl_off_t offset, int whence)
+{
+ curl_mimepart *part = (curl_mimepart *) instream;
+
+ if(whence == SEEK_SET && !offset && !part->fp)
+ return CURL_SEEKFUNC_OK; /* Not open: implicitly already at BOF. */
+
+ if(mime_open_file(part))
+ return CURL_SEEKFUNC_FAIL;
+
+ return fseek(part->fp, (long) offset, whence)?
+ CURL_SEEKFUNC_CANTSEEK: CURL_SEEKFUNC_OK;
+}
+
+static void mime_file_free(void *ptr)
+{
+ curl_mimepart *part = (curl_mimepart *) ptr;
+
+ if(part->fp) {
+ fclose(part->fp);
+ part->fp = NULL;
+ }
+ Curl_safefree(part->data);
+ part->data = NULL;
+}
+
+
+/* Subparts callbacks. */
+/* Argument is a pointer to the mime structure. */
+
+/* Readback a byte string segment. */
+static size_t readback_bytes(mime_state *state,
+ char *buffer, size_t bufsize,
+ const char *bytes, size_t numbytes,
+ const char *trail)
+{
+ size_t sz;
+
+ if(numbytes > state->offset) {
+ sz = numbytes - state->offset;
+ bytes += state->offset;
+ }
+ else {
+ size_t tsz = strlen(trail);
+
+ sz = state->offset - numbytes;
+ if(sz >= tsz)
+ return 0;
+ bytes = trail + sz;
+ sz = tsz - sz;
+ }
+
+ if(sz > bufsize)
+ sz = bufsize;
+
+ memcpy(buffer, bytes, sz);
+ state->offset += sz;
+ return sz;
+}
+
+/* Read a non-encoded part content. */
+static size_t read_part_content(curl_mimepart *part,
+ char *buffer, size_t bufsize)
+{
+ size_t sz = 0;
+
+ if(part->readfunc)
+ sz = part->readfunc(buffer, 1, bufsize, part->arg);
+ return sz;
+}
+
+/* Read and encode part content. */
+static size_t read_encoded_part_content(curl_mimepart *part,
+ char *buffer, size_t bufsize)
+{
+ mime_encoder_state *st = &part->encstate;
+ size_t cursize = 0;
+ size_t sz;
+ bool ateof = FALSE;
+
+ while(bufsize) {
+ if(st->bufbeg < st->bufend || ateof) {
+ /* Encode buffered data. */
+ sz = part->encoder->encodefunc(buffer, bufsize, ateof, part);
+ switch(sz) {
+ case 0:
+ if(ateof)
+ return cursize;
+ break;
+ case CURL_READFUNC_ABORT:
+ case CURL_READFUNC_PAUSE:
+ case READ_ERROR:
+ return cursize? cursize: sz;
+ default:
+ cursize += sz;
+ buffer += sz;
+ bufsize -= sz;
+ continue;
+ }
+ }
+
+ /* We need more data in input buffer. */
+ if(st->bufbeg) {
+ size_t len = st->bufend - st->bufbeg;
+
+ if(len)
+ memmove(st->buf, st->buf + st->bufbeg, len);
+ st->bufbeg = 0;
+ st->bufend = len;
+ }
+ if(st->bufend >= sizeof st->buf)
+ return cursize? cursize: READ_ERROR; /* Buffer full. */
+ sz = read_part_content(part, st->buf + st->bufend,
+ sizeof st->buf - st->bufend);
+ switch(sz) {
+ case 0:
+ ateof = TRUE;
+ break;
+ case CURL_READFUNC_ABORT:
+ case CURL_READFUNC_PAUSE:
+ case READ_ERROR:
+ return cursize? cursize: sz;
+ default:
+ st->bufend += sz;
+ break;
+ }
+ }
+
+ return cursize;
+}
+
+/* Readback a mime part. */
+static size_t readback_part(curl_mimepart *part,
+ char *buffer, size_t bufsize)
+{
+ size_t cursize = 0;
+ size_t sz;
+ struct curl_slist *hdr;
+#ifdef CURL_DOES_CONVERSIONS
+ char *convbuf = buffer;
+#endif
+
+ /* Readback from part. */
+
+ while(bufsize) {
+ sz = 0;
+ hdr = (struct curl_slist *) part->state.ptr;
+ switch(part->state.state) {
+ case MIMESTATE_BEGIN:
+ mimesetstate(&part->state, part->flags & MIME_BODY_ONLY? MIMESTATE_BODY:
+ MIMESTATE_CURLHEADERS, part->curlheaders);
+ break;
+ case MIMESTATE_USERHEADERS:
+ if(!hdr) {
+ mimesetstate(&part->state, MIMESTATE_EOH, NULL);
+ break;
+ }
+ if(match_header(hdr, "Content-Type", 12)) {
+ mimesetstate(&part->state, MIMESTATE_USERHEADERS, hdr->next);
+ break;
+ }
+ /* FALLTHROUGH */
+ case MIMESTATE_CURLHEADERS:
+ if(!hdr)
+ mimesetstate(&part->state, MIMESTATE_USERHEADERS, part->userheaders);
+ else {
+ sz = readback_bytes(&part->state, buffer, bufsize,
+ hdr->data, strlen(hdr->data), "\r\n");
+ if(!sz)
+ mimesetstate(&part->state, part->state.state, hdr->next);
+ }
+ break;
+ case MIMESTATE_EOH:
+ sz = readback_bytes(&part->state, buffer, bufsize, "\r\n", 2, "");
+ if(!sz)
+ mimesetstate(&part->state, MIMESTATE_BODY, NULL);
+ break;
+ case MIMESTATE_BODY:
+#ifdef CURL_DOES_CONVERSIONS
+ if(part->easy && convbuf < buffer) {
+ CURLcode result = Curl_convert_to_network(part->easy, convbuf,
+ buffer - convbuf);
+ if(result)
+ return READ_ERROR;
+ convbuf = buffer;
+ }
+#endif
+ cleanup_encoder_state(&part->encstate);
+ mimesetstate(&part->state, MIMESTATE_CONTENT, NULL);
+ break;
+ case MIMESTATE_CONTENT:
+ if(part->encoder)
+ sz = read_encoded_part_content(part, buffer, bufsize);
+ else
+ sz = read_part_content(part, buffer, bufsize);
+ switch(sz) {
+ case 0:
+ mimesetstate(&part->state, MIMESTATE_END, NULL);
+ /* Try sparing open file descriptors. */
+ if(part->kind == MIMEKIND_FILE && part->fp) {
+ fclose(part->fp);
+ part->fp = NULL;
+ }
+ /* FALLTHROUGH */
+ case CURL_READFUNC_ABORT:
+ case CURL_READFUNC_PAUSE:
+ case READ_ERROR:
+ return cursize? cursize: sz;
+ }
+ break;
+ case MIMESTATE_END:
+ return cursize;
+ default:
+ break; /* Other values not in part state. */
+ }
+
+ /* Bump buffer and counters according to read size. */
+ cursize += sz;
+ buffer += sz;
+ bufsize -= sz;
+ }
+
+#ifdef CURL_DOES_CONVERSIONS
+ if(part->easy && convbuf < buffer &&
+ part->state.state < MIMESTATE_BODY) {
+ CURLcode result = Curl_convert_to_network(part->easy, convbuf,
+ buffer - convbuf);
+ if(result)
+ return READ_ERROR;
+ }
+#endif
+
+ return cursize;
+}
+
+/* Readback from mime. */
+static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
+ void *instream)
+{
+ curl_mime *mime = (curl_mime *) instream;
+ size_t cursize = 0;
+ size_t sz;
+ curl_mimepart *part;
+#ifdef CURL_DOES_CONVERSIONS
+ char *convbuf = buffer;
+#endif
+
+ (void) size; /* Always 1. */
+
+ while(nitems) {
+ sz = 0;
+ part = mime->state.ptr;
+ switch(mime->state.state) {
+ case MIMESTATE_BEGIN:
+ case MIMESTATE_BODY:
+#ifdef CURL_DOES_CONVERSIONS
+ convbuf = buffer;
+#endif
+ mimesetstate(&mime->state, MIMESTATE_BOUNDARY1, mime->firstpart);
+ /* The first boundary always follows the header termination empty line,
+ so is always preceded by a CRLK. We can then spare 2 characters
+ by skipping the leading CRLF in boundary. */
+ mime->state.offset += 2;
+ break;
+ case MIMESTATE_BOUNDARY1:
+ sz = readback_bytes(&mime->state, buffer, nitems, "\r\n--", 4, "");
+ if(!sz)
+ mimesetstate(&mime->state, MIMESTATE_BOUNDARY2, part);
+ break;
+ case MIMESTATE_BOUNDARY2:
+ sz = readback_bytes(&mime->state, buffer, nitems, mime->boundary,
+ strlen(mime->boundary), part? "\r\n": "--\r\n");
+ if(!sz) {
+#ifdef CURL_DOES_CONVERSIONS
+ if(mime->easy && convbuf < buffer) {
+ CURLcode result = Curl_convert_to_network(mime->easy, convbuf,
+ buffer - convbuf);
+ if(result)
+ return READ_ERROR;
+ convbuf = buffer;
+ }
+#endif
+ mimesetstate(&mime->state, MIMESTATE_CONTENT, part);
+ }
+ break;
+ case MIMESTATE_CONTENT:
+ if(!part) {
+ mimesetstate(&mime->state, MIMESTATE_END, NULL);
+ break;
+ }
+ sz = readback_part(part, buffer, nitems);
+ switch(sz) {
+ case CURL_READFUNC_ABORT:
+ case CURL_READFUNC_PAUSE:
+ case READ_ERROR:
+ return cursize? cursize: sz;
+ case 0:
+#ifdef CURL_DOES_CONVERSIONS
+ convbuf = buffer;
+#endif
+ mimesetstate(&mime->state, MIMESTATE_BOUNDARY1, part->nextpart);
+ break;
+ }
+ break;
+ case MIMESTATE_END:
+ return cursize;
+ default:
+ break; /* other values not used in mime state. */
+ }
+
+ /* Bump buffer and counters according to read size. */
+ cursize += sz;
+ buffer += sz;
+ nitems -= sz;
+ }
+
+#ifdef CURL_DOES_CONVERSIONS
+ if(mime->easy && convbuf < buffer &&
+ mime->state.state <= MIMESTATE_CONTENT) {
+ CURLcode result = Curl_convert_to_network(mime->easy, convbuf,
+ buffer - convbuf);
+ if(result)
+ return READ_ERROR;
+ }
+#endif
+
+ return cursize;
+}
+
+static int mime_part_rewind(curl_mimepart *part)
+{
+ int res = CURL_SEEKFUNC_OK;
+ enum mimestate targetstate = MIMESTATE_BEGIN;
+
+ if(part->flags & MIME_BODY_ONLY)
+ targetstate = MIMESTATE_BODY;
+ cleanup_encoder_state(&part->encstate);
+ if(part->state.state > targetstate) {
+ res = CURL_SEEKFUNC_CANTSEEK;
+ if(part->seekfunc) {
+ res = part->seekfunc(part->arg, (curl_off_t) 0, SEEK_SET);
+ switch(res) {
+ case CURL_SEEKFUNC_OK:
+ case CURL_SEEKFUNC_FAIL:
+ case CURL_SEEKFUNC_CANTSEEK:
+ break;
+ case -1: /* For fseek() error. */
+ res = CURL_SEEKFUNC_CANTSEEK;
+ break;
+ default:
+ res = CURL_SEEKFUNC_FAIL;
+ break;
+ }
+ }
+ }
+
+ if(res == CURL_SEEKFUNC_OK)
+ mimesetstate(&part->state, targetstate, NULL);
+
+ return res;
+}
+
+static int mime_subparts_seek(void *instream, curl_off_t offset, int whence)
+{
+ curl_mime *mime = (curl_mime *) instream;
+ curl_mimepart *part;
+ int result = CURL_SEEKFUNC_OK;
+ int res;
+
+ if(whence != SEEK_SET || offset)
+ return CURL_SEEKFUNC_CANTSEEK; /* Only support full rewind. */
+
+ if(mime->state.state == MIMESTATE_BEGIN)
+ return CURL_SEEKFUNC_OK; /* Already rewound. */
+
+ for(part = mime->firstpart; part; part = part->nextpart) {
+ res = mime_part_rewind(part);
+ if(res != CURL_SEEKFUNC_OK)
+ result = res;
+ }
+
+ if(result == CURL_SEEKFUNC_OK)
+ mimesetstate(&mime->state, MIMESTATE_BEGIN, NULL);
+
+ return result;
+}
+
+/* Release part content. */
+static void cleanup_part_content(curl_mimepart *part)
+{
+ if(part->freefunc)
+ part->freefunc(part->arg);
+
+ part->readfunc = NULL;
+ part->seekfunc = NULL;
+ part->freefunc = NULL;
+ part->arg = (void *) part; /* Defaults to part itself. */
+ part->data = NULL;
+ part->fp = NULL;
+ part->datasize = (curl_off_t) 0; /* No size yet. */
+ cleanup_encoder_state(&part->encstate);
+ part->kind = MIMEKIND_NONE;
+}
+
+static void mime_subparts_free(void *ptr)
+{
+ curl_mime *mime = (curl_mime *) ptr;
+
+ if(mime && mime->parent) {
+ mime->parent->freefunc = NULL; /* Be sure we won't be called again. */
+ cleanup_part_content(mime->parent); /* Avoid dangling pointer in part. */
+ }
+ curl_mime_free(mime);
+}
+
+/* Do not free subparts: unbind them. This is used for the top level only. */
+static void mime_subparts_unbind(void *ptr)
+{
+ curl_mime *mime = (curl_mime *) ptr;
+
+ if(mime && mime->parent) {
+ mime->parent->freefunc = NULL; /* Be sure we won't be called again. */
+ cleanup_part_content(mime->parent); /* Avoid dangling pointer in part. */
+ mime->parent = NULL;
+ }
+}
+
+
+void Curl_mime_cleanpart(curl_mimepart *part)
+{
+ cleanup_part_content(part);
+ curl_slist_free_all(part->curlheaders);
+ if(part->flags & MIME_USERHEADERS_OWNER)
+ curl_slist_free_all(part->userheaders);
+ Curl_safefree(part->mimetype);
+ Curl_safefree(part->name);
+ Curl_safefree(part->filename);
+ Curl_mime_initpart(part, part->easy);
+}
+
+/* Recursively delete a mime handle and its parts. */
+void curl_mime_free(curl_mime *mime)
+{
+ curl_mimepart *part;
+
+ if(mime) {
+ mime_subparts_unbind(mime); /* Be sure it's not referenced anymore. */
+ while(mime->firstpart) {
+ part = mime->firstpart;
+ mime->firstpart = part->nextpart;
+ Curl_mime_cleanpart(part);
+ free(part);
+ }
+
+ free(mime->boundary);
+ free(mime);
+ }
+}
+
+/*
+ * Mime build functions.
+ */
+
+/* Create a mime handle. */
+curl_mime *curl_mime_init(struct Curl_easy *easy)
+{
+ curl_mime *mime;
+
+ mime = (curl_mime *) malloc(sizeof *mime);
+
+ if(mime) {
+ mime->easy = easy;
+ mime->parent = NULL;
+ mime->firstpart = NULL;
+ mime->lastpart = NULL;
+
+ /* Get a part boundary. */
+ mime->boundary = malloc(24 + MIME_RAND_BOUNDARY_CHARS + 1);
+ if(!mime->boundary) {
+ free(mime);
+ return NULL;
+ }
+
+ memset(mime->boundary, '-', 24);
+ Curl_rand_hex(easy, (unsigned char *) mime->boundary + 24,
+ MIME_RAND_BOUNDARY_CHARS + 1);
+ mimesetstate(&mime->state, MIMESTATE_BEGIN, NULL);
+ }
+
+ return mime;
+}
+
+/* Initialize a mime part. */
+void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy)
+{
+ memset((char *) part, 0, sizeof *part);
+ part->easy = easy;
+ mimesetstate(&part->state, MIMESTATE_BEGIN, NULL);
+}
+
+/* Create a mime part and append it to a mime handle's part list. */
+curl_mimepart *curl_mime_addpart(curl_mime *mime)
+{
+ curl_mimepart *part;
+
+ if(!mime)
+ return NULL;
+
+ part = (curl_mimepart *) malloc(sizeof *part);
+
+ if(part) {
+ Curl_mime_initpart(part, mime->easy);
+ part->parent = mime;
+
+ if(mime->lastpart)
+ mime->lastpart->nextpart = part;
+ else
+ mime->firstpart = part;
+
+ mime->lastpart = part;
+ }
+
+ return part;
+}
+
+/* Set mime part name. */
+CURLcode curl_mime_name(curl_mimepart *part, const char *name)
+{
+ if(!part)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ Curl_safefree(part->name);
+ part->name = NULL;
+
+ if(name) {
+ part->name = strdup(name);
+ if(!part->name)
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ return CURLE_OK;
+}
+
+/* Set mime part remote file name. */
+CURLcode curl_mime_filename(curl_mimepart *part, const char *filename)
+{
+ if(!part)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ Curl_safefree(part->filename);
+ part->filename = NULL;
+
+ if(filename) {
+ part->filename = strdup(filename);
+ if(!part->filename)
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ return CURLE_OK;
+}
+
+/* Set mime part content from memory data. */
+CURLcode curl_mime_data(curl_mimepart *part,
+ const char *data, size_t datasize)
+{
+ if(!part)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ cleanup_part_content(part);
+
+ if(data) {
+ if(datasize == CURL_ZERO_TERMINATED)
+ datasize = strlen(data);
+
+ part->data = malloc(datasize + 1);
+ if(!part->data)
+ return CURLE_OUT_OF_MEMORY;
+
+ part->datasize = datasize;
+
+ if(datasize)
+ memcpy(part->data, data, datasize);
+ part->data[datasize] = '\0'; /* Set a nul terminator as sentinel. */
+
+ part->readfunc = mime_mem_read;
+ part->seekfunc = mime_mem_seek;
+ part->freefunc = mime_mem_free;
+ part->kind = MIMEKIND_DATA;
+ }
+
+ return CURLE_OK;
+}
+
+/* Set mime part content from named local file. */
+CURLcode curl_mime_filedata(curl_mimepart *part, const char *filename)
+{
+ CURLcode result = CURLE_OK;
+ char *base;
+
+ if(!part)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ cleanup_part_content(part);
+
+ if(filename) {
+ struct_stat sbuf;
+
+ if(stat(filename, &sbuf) || access(filename, R_OK))
+ result = CURLE_READ_ERROR;
+
+ part->data = strdup(filename);
+ if(!part->data)
+ result = CURLE_OUT_OF_MEMORY;
+
+ part->datasize = -1;
+ if(!result && S_ISREG(sbuf.st_mode)) {
+ part->datasize = filesize(filename, sbuf);
+ part->seekfunc = mime_file_seek;
+ }
+
+ part->readfunc = mime_file_read;
+ part->freefunc = mime_file_free;
+ part->kind = MIMEKIND_FILE;
+
+ /* As a side effect, set the filename to the current file's base name.
+ It is possible to withdraw this by explicitly calling
+ curl_mime_filename() with a NULL filename argument after the current
+ call. */
+ base = strippath(filename);
+ if(!base)
+ result = CURLE_OUT_OF_MEMORY;
+ else {
+ CURLcode res = curl_mime_filename(part, base);
+
+ if(res)
+ result = res;
+ free(base);
+ }
+ }
+ return result;
+}
+
+/* Set mime part type. */
+CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype)
+{
+ if(!part)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ Curl_safefree(part->mimetype);
+ part->mimetype = NULL;
+
+ if(mimetype) {
+ part->mimetype = strdup(mimetype);
+ if(!part->mimetype)
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ return CURLE_OK;
+}
+
+/* Set mime data transfer encoder. */
+CURLcode curl_mime_encoder(curl_mimepart *part, const char *encoding)
+{
+ CURLcode result = CURLE_BAD_FUNCTION_ARGUMENT;
+ const mime_encoder *mep;
+
+ if(!part)
+ return result;
+
+ part->encoder = NULL;
+
+ if(!encoding)
+ return CURLE_OK; /* Removing current encoder. */
+
+ for(mep = encoders; mep->name; mep++)
+ if(strcasecompare(encoding, mep->name)) {
+ part->encoder = mep;
+ result = CURLE_OK;
+ }
+
+ return result;
+}
+
+/* Set mime part headers. */
+CURLcode curl_mime_headers(curl_mimepart *part,
+ struct curl_slist *headers, int take_ownership)
+{
+ if(!part)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ if(part->flags & MIME_USERHEADERS_OWNER) {
+ if(part->userheaders != headers) /* Allow setting twice the same list. */
+ curl_slist_free_all(part->userheaders);
+ part->flags &= ~MIME_USERHEADERS_OWNER;
+ }
+ part->userheaders = headers;
+ if(headers && take_ownership)
+ part->flags |= MIME_USERHEADERS_OWNER;
+ return CURLE_OK;
+}
+
+/* Set mime part content from callback. */
+CURLcode curl_mime_data_cb(curl_mimepart *part, curl_off_t datasize,
+ curl_read_callback readfunc,
+ curl_seek_callback seekfunc,
+ curl_free_callback freefunc, void *arg)
+{
+ if(!part)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ cleanup_part_content(part);
+
+ if(readfunc) {
+ part->readfunc = readfunc;
+ part->seekfunc = seekfunc;
+ part->freefunc = freefunc;
+ part->arg = arg;
+ part->datasize = datasize;
+ part->kind = MIMEKIND_CALLBACK;
+ }
+
+ return CURLE_OK;
+}
+
+/* Set mime part content from subparts. */
+CURLcode Curl_mime_set_subparts(curl_mimepart *part,
+ curl_mime *subparts, int take_ownership)
+{
+ curl_mime *root;
+
+ if(!part)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ /* Accept setting twice the same subparts. */
+ if(part->kind == MIMEKIND_MULTIPART && part->arg == subparts)
+ return CURLE_OK;
+
+ cleanup_part_content(part);
+
+ if(subparts) {
+ /* Must belong to the same data handle. */
+ if(part->easy && subparts->easy && part->easy != subparts->easy)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ /* Should not have been attached already. */
+ if(subparts->parent)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ /* Should not be the part's root. */
+ root = part->parent;
+ if(root) {
+ while(root->parent && root->parent->parent)
+ root = root->parent->parent;
+ if(subparts == root) {
+ if(part->easy)
+ failf(part->easy, "Can't add itself as a subpart!");
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ }
+ }
+
+ subparts->parent = part;
+ part->readfunc = mime_subparts_read;
+ part->seekfunc = mime_subparts_seek;
+ part->freefunc = take_ownership? mime_subparts_free: mime_subparts_unbind;
+ part->arg = subparts;
+ part->datasize = -1;
+ part->kind = MIMEKIND_MULTIPART;
+ }
+
+ return CURLE_OK;
+}
+
+CURLcode curl_mime_subparts(curl_mimepart *part, curl_mime *subparts)
+{
+ return Curl_mime_set_subparts(part, subparts, TRUE);
+}
+
+
+/* Readback from top mime. */
+/* Argument is the dummy top part. */
+size_t Curl_mime_read(char *buffer, size_t size, size_t nitems, void *instream)
+{
+ curl_mimepart *part = (curl_mimepart *) instream;
+
+ (void) size; /* Always 1. */
+ return readback_part(part, buffer, nitems);
+}
+
+/* Rewind mime stream. */
+CURLcode Curl_mime_rewind(curl_mimepart *part)
+{
+ return mime_part_rewind(part) == CURL_SEEKFUNC_OK?
+ CURLE_OK: CURLE_SEND_FAIL_REWIND;
+}
+
+/* Compute header list size. */
+static size_t slist_size(struct curl_slist *s,
+ size_t overhead, const char *skip)
+{
+ size_t size = 0;
+ size_t skiplen = skip? strlen(skip): 0;
+
+ for(; s; s = s->next)
+ if(!skip || !match_header(s, skip, skiplen))
+ size += strlen(s->data) + overhead;
+ return size;
+}
+
+/* Get/compute multipart size. */
+static curl_off_t multipart_size(curl_mime *mime)
+{
+ curl_off_t size;
+ curl_off_t sz;
+ size_t boundarysize;
+ curl_mimepart *part;
+
+ if(!mime)
+ return 0; /* Not present -> empty. */
+
+ boundarysize = 4 + strlen(mime->boundary) + 2;
+ size = boundarysize; /* Final boundary - CRLF after headers. */
+
+ for(part = mime->firstpart; part; part = part->nextpart) {
+ sz = Curl_mime_size(part);
+
+ if(sz < 0)
+ size = sz;
+
+ if(size >= 0)
+ size += boundarysize + sz;
+ }
+
+ return size;
+}
+
+/* Get/compute mime size. */
+curl_off_t Curl_mime_size(curl_mimepart *part)
+{
+ curl_off_t size;
+
+ if(part->kind == MIMEKIND_MULTIPART)
+ part->datasize = multipart_size(part->arg);
+
+ size = part->datasize;
+
+ if(part->encoder)
+ size = part->encoder->sizefunc(part);
+
+ if(size >= 0 && !(part->flags & MIME_BODY_ONLY)) {
+ /* Compute total part size. */
+ size += slist_size(part->curlheaders, 2, NULL);
+ size += slist_size(part->userheaders, 2, "Content-Type");
+ size += 2; /* CRLF after headers. */
+ }
+ return size;
+}
+
+/* Add a header. */
+/* VARARGS2 */
+CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...)
+{
+ struct curl_slist *hdr = NULL;
+ char *s = NULL;
+ va_list ap;
+
+ va_start(ap, fmt);
+ s = curl_mvaprintf(fmt, ap);
+ va_end(ap);
+
+ if(s) {
+ hdr = Curl_slist_append_nodup(*slp, s);
+ if(hdr)
+ *slp = hdr;
+ else
+ free(s);
+ }
+
+ return hdr? CURLE_OK: CURLE_OUT_OF_MEMORY;
+}
+
+/* Add a content type header. */
+static CURLcode add_content_type(struct curl_slist **slp,
+ const char *type, const char *boundary)
+{
+ return Curl_mime_add_header(slp, "Content-Type: %s%s%s", type,
+ boundary? "; boundary=": "",
+ boundary? boundary: "");
+}
+
+
+static const char *ContentTypeForFilename(const char *filename)
+{
+ unsigned int i;
+
+ /*
+ * If no content type was specified, we scan through a few well-known
+ * extensions and pick the first we match!
+ */
+ struct ContentType {
+ const char *extension;
+ const char *type;
+ };
+ static const struct ContentType ctts[] = {
+ {".gif", "image/gif"},
+ {".jpg", "image/jpeg"},
+ {".jpeg", "image/jpeg"},
+ {".png", "image/png"},
+ {".svg", "image/svg+xml"},
+ {".txt", "text/plain"},
+ {".htm", "text/html"},
+ {".html", "text/html"},
+ {".pdf", "application/pdf"},
+ {".xml", "application/xml"}
+ };
+
+ if(filename) {
+ size_t len1 = strlen(filename);
+ const char *nameend = filename + len1;
+
+ for(i = 0; i < sizeof ctts / sizeof ctts[0]; i++) {
+ size_t len2 = strlen(ctts[i].extension);
+
+ if(len1 >= len2 && strcasecompare(nameend - len2, ctts[i].extension))
+ return ctts[i].type;
+ }
+ }
+ return NULL;
+}
+
+CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
+ const char *contenttype,
+ const char *disposition,
+ enum mimestrategy strategy)
+{
+ curl_mime *mime = NULL;
+ const char *boundary = NULL;
+ char *customct;
+ const char *cte = NULL;
+ CURLcode ret = CURLE_OK;
+
+ /* Get rid of previously prepared headers. */
+ curl_slist_free_all(part->curlheaders);
+ part->curlheaders = NULL;
+
+ /* Be sure we won't access old headers later. */
+ if(part->state.state == MIMESTATE_CURLHEADERS)
+ mimesetstate(&part->state, MIMESTATE_CURLHEADERS, NULL);
+
+ /* Check if content type is specified. */
+ customct = part->mimetype;
+ if(!customct)
+ customct = search_header(part->userheaders, "Content-Type");
+ if(customct)
+ contenttype = customct;
+
+ /* If content type is not specified, try to determine it. */
+ if(!contenttype) {
+ switch(part->kind) {
+ case MIMEKIND_MULTIPART:
+ contenttype = MULTIPART_CONTENTTYPE_DEFAULT;
+ break;
+ case MIMEKIND_FILE:
+ contenttype = ContentTypeForFilename(part->filename);
+ if(!contenttype)
+ contenttype = ContentTypeForFilename(part->data);
+ if(!contenttype && part->filename)
+ contenttype = FILE_CONTENTTYPE_DEFAULT;
+ break;
+ default:
+ contenttype = ContentTypeForFilename(part->filename);
+ break;
+ }
+ }
+
+ if(part->kind == MIMEKIND_MULTIPART) {
+ mime = (curl_mime *) part->arg;
+ if(mime)
+ boundary = mime->boundary;
+ }
+ else if(contenttype && !customct &&
+ strcasecompare(contenttype, "text/plain"))
+ if(strategy == MIMESTRATEGY_MAIL || !part->filename)
+ contenttype = NULL;
+
+ /* Issue content-disposition header only if not already set by caller. */
+ if(!search_header(part->userheaders, "Content-Disposition")) {
+ if(!disposition)
+ if(part->filename || part->name ||
+ (contenttype && !strncasecompare(contenttype, "multipart/", 10)))
+ disposition = DISPOSITION_DEFAULT;
+ if(disposition && curl_strequal(disposition, "attachment") &&
+ !part->name && !part->filename)
+ disposition = NULL;
+ if(disposition) {
+ char *name = NULL;
+ char *filename = NULL;
+
+ if(part->name) {
+ name = escape_string(part->name);
+ if(!name)
+ ret = CURLE_OUT_OF_MEMORY;
+ }
+ if(!ret && part->filename) {
+ filename = escape_string(part->filename);
+ if(!filename)
+ ret = CURLE_OUT_OF_MEMORY;
+ }
+ if(!ret)
+ ret = Curl_mime_add_header(&part->curlheaders,
+ "Content-Disposition: %s%s%s%s%s%s%s",
+ disposition,
+ name? "; name=\"": "",
+ name? name: "",
+ name? "\"": "",
+ filename? "; filename=\"": "",
+ filename? filename: "",
+ filename? "\"": "");
+ Curl_safefree(name);
+ Curl_safefree(filename);
+ if(ret)
+ return ret;
+ }
+ }
+
+ /* Issue Content-Type header. */
+ if(contenttype) {
+ ret = add_content_type(&part->curlheaders, contenttype, boundary);
+ if(ret)
+ return ret;
+ }
+
+ /* Content-Transfer-Encoding header. */
+ if(!search_header(part->userheaders, "Content-Transfer-Encoding")) {
+ if(part->encoder)
+ cte = part->encoder->name;
+ else if(contenttype && strategy == MIMESTRATEGY_MAIL &&
+ part->kind != MIMEKIND_MULTIPART)
+ cte = "8bit";
+ if(cte) {
+ ret = Curl_mime_add_header(&part->curlheaders,
+ "Content-Transfer-Encoding: %s", cte);
+ if(ret)
+ return ret;
+ }
+ }
+
+ /* If we were reading curl-generated headers, restart with new ones (this
+ should not occur). */
+ if(part->state.state == MIMESTATE_CURLHEADERS)
+ mimesetstate(&part->state, MIMESTATE_CURLHEADERS, part->curlheaders);
+
+ /* Process subparts. */
+ if(part->kind == MIMEKIND_MULTIPART && mime) {
+ curl_mimepart *subpart;
+
+ disposition = NULL;
+ if(strcasecompare(contenttype, "multipart/form-data"))
+ disposition = "form-data";
+ for(subpart = mime->firstpart; subpart; subpart = subpart->nextpart) {
+ ret = Curl_mime_prepare_headers(subpart, NULL, disposition, strategy);
+ if(ret)
+ return ret;
+ }
+ }
+ return ret;
+}
+
+#else /* !CURL_DISABLE_HTTP || !CURL_DISABLE_SMTP || !CURL_DISABLE_IMAP */
+
+/* Mime not compiled in: define stubs for externally-referenced functions. */
+curl_mime *curl_mime_init(CURL *easy)
+{
+ (void) easy;
+ return NULL;
+}
+
+void curl_mime_free(curl_mime *mime)
+{
+ (void) mime;
+}
+
+curl_mimepart *curl_mime_addpart(curl_mime *mime)
+{
+ (void) mime;
+ return NULL;
+}
+
+CURLcode curl_mime_name(curl_mimepart *part, const char *name)
+{
+ (void) part;
+ (void) name;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode curl_mime_filename(curl_mimepart *part, const char *filename)
+{
+ (void) part;
+ (void) filename;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype)
+{
+ (void) part;
+ (void) mimetype;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode curl_mime_encoder(curl_mimepart *part, const char *encoding)
+{
+ (void) part;
+ (void) encoding;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode curl_mime_data(curl_mimepart *part,
+ const char *data, size_t datasize)
+{
+ (void) part;
+ (void) data;
+ (void) datasize;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode curl_mime_filedata(curl_mimepart *part, const char *filename)
+{
+ (void) part;
+ (void) filename;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode curl_mime_data_cb(curl_mimepart *part,
+ curl_off_t datasize,
+ curl_read_callback readfunc,
+ curl_seek_callback seekfunc,
+ curl_free_callback freefunc,
+ void *arg)
+{
+ (void) part;
+ (void) datasize;
+ (void) readfunc;
+ (void) seekfunc;
+ (void) freefunc;
+ (void) arg;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode curl_mime_subparts(curl_mimepart *part, curl_mime *subparts)
+{
+ (void) part;
+ (void) subparts;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode curl_mime_headers(curl_mimepart *part,
+ struct curl_slist *headers, int take_ownership)
+{
+ (void) part;
+ (void) headers;
+ (void) take_ownership;
+ return CURLE_NOT_BUILT_IN;
+}
+
+void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy)
+{
+ (void) part;
+ (void) easy;
+}
+
+void Curl_mime_cleanpart(curl_mimepart *part)
+{
+ (void) part;
+}
+
+CURLcode Curl_mime_set_subparts(curl_mimepart *part,
+ curl_mime *subparts, int take_ownership)
+{
+ (void) part;
+ (void) subparts;
+ (void) take_ownership;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
+ const char *contenttype,
+ const char *disposition,
+ enum mimestrategy strategy)
+{
+ (void) part;
+ (void) contenttype;
+ (void) disposition;
+ (void) strategy;
+ return CURLE_NOT_BUILT_IN;
+}
+
+curl_off_t Curl_mime_size(curl_mimepart *part)
+{
+ (void) part;
+ return (curl_off_t) -1;
+}
+
+size_t Curl_mime_read(char *buffer, size_t size, size_t nitems, void *instream)
+{
+ (void) buffer;
+ (void) size;
+ (void) nitems;
+ (void) instream;
+ return 0;
+}
+
+CURLcode Curl_mime_rewind(curl_mimepart *part)
+{
+ (void) part;
+ return CURLE_NOT_BUILT_IN;
+}
+
+/* VARARGS2 */
+CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...)
+{
+ (void) slp;
+ (void) fmt;
+ return CURLE_NOT_BUILT_IN;
+}
+
+#endif /* !CURL_DISABLE_HTTP || !CURL_DISABLE_SMTP || !CURL_DISABLE_IMAP */
diff --git a/lib/mime.h b/lib/mime.h
new file mode 100644
index 0000000..7827f74
--- /dev/null
+++ b/lib/mime.h
@@ -0,0 +1,137 @@
+#ifndef HEADER_CURL_MIME_H
+#define HEADER_CURL_MIME_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#define MIME_RAND_BOUNDARY_CHARS 16 /* Nb. of random boundary chars. */
+#define MAX_ENCODED_LINE_LENGTH 76 /* Maximum encoded line length. */
+#define ENCODING_BUFFER_SIZE 256 /* Encoding temp buffers size. */
+
+/* Part flags. */
+#define MIME_USERHEADERS_OWNER (1 << 0)
+#define MIME_BODY_ONLY (1 << 1)
+
+/* Part source kinds. */
+enum mimekind {
+ MIMEKIND_NONE = 0, /* Part not set. */
+ MIMEKIND_DATA, /* Allocated mime data. */
+ MIMEKIND_FILE, /* Data from file. */
+ MIMEKIND_CALLBACK, /* Data from `read' callback. */
+ MIMEKIND_MULTIPART, /* Data is a mime subpart. */
+ MIMEKIND_LAST
+};
+
+/* Readback state tokens. */
+enum mimestate {
+ MIMESTATE_BEGIN, /* Readback has not yet started. */
+ MIMESTATE_CURLHEADERS, /* In curl-generated headers. */
+ MIMESTATE_USERHEADERS, /* In caller's supplied headers. */
+ MIMESTATE_EOH, /* End of headers. */
+ MIMESTATE_BODY, /* Placeholder. */
+ MIMESTATE_BOUNDARY1, /* In boundary prefix. */
+ MIMESTATE_BOUNDARY2, /* In boundary. */
+ MIMESTATE_CONTENT, /* In content. */
+ MIMESTATE_END, /* End of part reached. */
+ MIMESTATE_LAST
+};
+
+/* Mime headers strategies. */
+enum mimestrategy {
+ MIMESTRATEGY_MAIL, /* Mime mail. */
+ MIMESTRATEGY_FORM, /* HTTP post form. */
+ MIMESTRATEGY_LAST
+};
+
+/* Content transfer encoder. */
+typedef struct {
+ const char * name; /* Encoding name. */
+ size_t (*encodefunc)(char *buffer, size_t size, bool ateof,
+ curl_mimepart *part); /* Encoded read. */
+ curl_off_t (*sizefunc)(curl_mimepart *part); /* Encoded size. */
+} mime_encoder;
+
+/* Content transfer encoder state. */
+typedef struct {
+ size_t pos; /* Position on output line. */
+ size_t bufbeg; /* Next data index in input buffer. */
+ size_t bufend; /* First unused byte index in input buffer. */
+ char buf[ENCODING_BUFFER_SIZE]; /* Input buffer. */
+} mime_encoder_state;
+
+/* Mime readback state. */
+typedef struct {
+ enum mimestate state; /* Current state token. */
+ void *ptr; /* State-dependent pointer. */
+ size_t offset; /* State-dependent offset. */
+} mime_state;
+
+/* A mime multipart. */
+struct curl_mime_s {
+ struct Curl_easy *easy; /* The associated easy handle. */
+ curl_mimepart *parent; /* Parent part. */
+ curl_mimepart *firstpart; /* First part. */
+ curl_mimepart *lastpart; /* Last part. */
+ char *boundary; /* The part boundary. */
+ mime_state state; /* Current readback state. */
+};
+
+/* A mime part. */
+struct curl_mimepart_s {
+ struct Curl_easy *easy; /* The associated easy handle. */
+ curl_mime *parent; /* Parent mime structure. */
+ curl_mimepart *nextpart; /* Forward linked list. */
+ enum mimekind kind; /* The part kind. */
+ char *data; /* Memory data or file name. */
+ curl_read_callback readfunc; /* Read function. */
+ curl_seek_callback seekfunc; /* Seek function. */
+ curl_free_callback freefunc; /* Argument free function. */
+ void *arg; /* Argument to callback functions. */
+ FILE *fp; /* File pointer. */
+ struct curl_slist *curlheaders; /* Part headers. */
+ struct curl_slist *userheaders; /* Part headers. */
+ char *mimetype; /* Part mime type. */
+ char *filename; /* Remote file name. */
+ char *name; /* Data name. */
+ curl_off_t datasize; /* Expected data size. */
+ unsigned int flags; /* Flags. */
+ mime_state state; /* Current readback state. */
+ const mime_encoder *encoder; /* Content data encoder. */
+ mime_encoder_state encstate; /* Data encoder state. */
+};
+
+
+/* Prototypes. */
+void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy);
+void Curl_mime_cleanpart(curl_mimepart *part);
+CURLcode Curl_mime_set_subparts(curl_mimepart *part,
+ curl_mime *subparts, int take_ownership);
+CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
+ const char *contenttype,
+ const char *disposition,
+ enum mimestrategy strategy);
+curl_off_t Curl_mime_size(curl_mimepart *part);
+size_t Curl_mime_read(char *buffer, size_t size, size_t nitems,
+ void *instream);
+CURLcode Curl_mime_rewind(curl_mimepart *part);
+CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...);
+
+#endif /* HEADER_CURL_MIME_H */
diff --git a/lib/mk-ca-bundle.pl b/lib/mk-ca-bundle.pl
index cc36c76..dcfec0b 100755
--- a/lib/mk-ca-bundle.pl
+++ b/lib/mk-ca-bundle.pl
@@ -47,11 +47,9 @@ eval "require LWP::UserAgent";
my %urls = (
'nss' =>
- 'https://hg.mozilla.org/projects/nss/raw-file/tip/lib/ckfw/builtins/certdata.txt',
+ 'https://hg.mozilla.org/projects/nss/raw-file/default/lib/ckfw/builtins/certdata.txt',
'central' =>
'https://hg.mozilla.org/mozilla-central/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt',
- 'aurora' =>
- 'https://hg.mozilla.org/releases/mozilla-aurora/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt',
'beta' =>
'https://hg.mozilla.org/releases/mozilla-beta/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt',
'release' =>
diff --git a/lib/mprintf.c b/lib/mprintf.c
index eb7ee0c..d2d91d7 100644
--- a/lib/mprintf.c
+++ b/lib/mprintf.c
@@ -46,10 +46,6 @@
* If SIZEOF_SIZE_T has not been defined, default to the size of long.
*/
-#ifndef SIZEOF_SIZE_T
-# define SIZEOF_SIZE_T CURL_SIZEOF_LONG
-#endif
-
#ifdef HAVE_LONGLONG
# define LONG_LONG_TYPE long long
# define HAVE_LONG_LONG_TYPE
@@ -111,7 +107,7 @@ static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
} WHILE_FALSE
/* Data type to read from the arglist */
-typedef enum {
+typedef enum {
FORMAT_UNKNOWN = 0,
FORMAT_STRING,
FORMAT_PTR,
@@ -181,7 +177,7 @@ struct asprintf {
static long dprintf_DollarString(char *input, char **end)
{
- int number=0;
+ int number = 0;
while(ISDIGIT(*input)) {
number *= 10;
number += *input-'0';
@@ -237,7 +233,7 @@ static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
long width;
long precision;
int flags;
- long max_param=0;
+ long max_param = 0;
long i;
while(*fmt) {
@@ -326,7 +322,7 @@ static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
break;
#if defined(MP_HAVE_INT_EXTENSIONS)
case 'I':
-#if (CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG)
+#if (SIZEOF_CURL_OFF_T > SIZEOF_LONG)
flags |= FLAGS_LONGLONG;
#else
flags |= FLAGS_LONG;
@@ -348,14 +344,14 @@ static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
case 'z':
/* the code below generates a warning if -Wunreachable-code is
used */
-#if (SIZEOF_SIZE_T > CURL_SIZEOF_LONG)
+#if (SIZEOF_SIZE_T > SIZEOF_LONG)
flags |= FLAGS_LONGLONG;
#else
flags |= FLAGS_LONG;
#endif
break;
case 'O':
-#if (CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG)
+#if (SIZEOF_CURL_OFF_T > SIZEOF_LONG)
flags |= FLAGS_LONGLONG;
#else
flags |= FLAGS_LONG;
@@ -380,7 +376,7 @@ static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
else
width = param_num;
if(width > max_param)
- max_param=width;
+ max_param = width;
break;
default:
break;
@@ -486,7 +482,7 @@ static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
}
/* Read the arg list parameters into our data list */
- for(i=0; i<max_param; i++) {
+ for(i = 0; i<max_param; i++) {
/* Width/precision arguments must be read before the main argument
they are attached to */
if(vto[i].flags & FLAGS_WIDTHPARAM) {
@@ -573,7 +569,7 @@ static int dprintf_formatf(
int done = 0;
long param; /* current parameter to read */
- long param_num=0; /* parameter counter */
+ long param_num = 0; /* parameter counter */
va_stack_t vto[MAX_PARAMETERS];
char *endpos[MAX_PARAMETERS];
@@ -643,7 +639,7 @@ static int dprintf_formatf(
/* If this is a positional parameter, the position must follow immediately
after the %, thus create a %<num>$ sequence */
- param=dprintf_DollarString(f, &f);
+ param = dprintf_DollarString(f, &f);
if(!param)
param = param_num;
@@ -952,7 +948,7 @@ static int dprintf_formatf(
output characters */
(sprintf)(work, formatbuf, p->data.dnum);
DEBUGASSERT(strlen(work) <= sizeof(work));
- for(fptr=work; *fptr; fptr++)
+ for(fptr = work; *fptr; fptr++)
OUTCHAR(*fptr);
}
break;
@@ -984,7 +980,7 @@ static int dprintf_formatf(
/* fputc() look-alike */
static int addbyter(int output, FILE *data)
{
- struct nsprintf *infop=(struct nsprintf *)data;
+ struct nsprintf *infop = (struct nsprintf *)data;
unsigned char outc = (unsigned char)output;
if(infop->length < infop->max) {
@@ -1032,7 +1028,7 @@ int curl_msnprintf(char *buffer, size_t maxlength, const char *format, ...)
/* fputc() look-alike */
static int alloc_addbyter(int output, FILE *data)
{
- struct asprintf *infop=(struct asprintf *)data;
+ struct asprintf *infop = (struct asprintf *)data;
unsigned char outc = (unsigned char)output;
if(!infop->buffer) {
@@ -1042,9 +1038,9 @@ static int alloc_addbyter(int output, FILE *data)
return -1; /* fail */
}
infop->alloc = 32;
- infop->len =0;
+ infop->len = 0;
}
- else if(infop->len+1 >= infop->alloc) {
+ else if(infop->len + 1 >= infop->alloc) {
char *newptr = NULL;
size_t newsize = infop->alloc*2;
@@ -1133,7 +1129,7 @@ int curl_msprintf(char *buffer, const char *format, ...)
va_start(ap_save, format);
retcode = dprintf_formatf(&buffer, storebuffer, format, ap_save);
va_end(ap_save);
- *buffer=0; /* we terminate this with a zero byte */
+ *buffer = 0; /* we terminate this with a zero byte */
return retcode;
}
@@ -1162,7 +1158,7 @@ int curl_mvsprintf(char *buffer, const char *format, va_list ap_save)
{
int retcode;
retcode = dprintf_formatf(&buffer, storebuffer, format, ap_save);
- *buffer=0; /* we terminate this with a zero byte */
+ *buffer = 0; /* we terminate this with a zero byte */
return retcode;
}
diff --git a/lib/multi.c b/lib/multi.c
index d5bc532..9728e5a 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -59,7 +59,9 @@
#define CURL_SOCKET_HASH_TABLE_SIZE 911
#endif
+#ifndef CURL_CONNECTION_HASH_SIZE
#define CURL_CONNECTION_HASH_SIZE 97
+#endif
#define CURL_MULTI_HANDLE 0x000bab1e
@@ -324,14 +326,6 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
Curl_llist_init(&multi->msglist, multi_freeamsg);
Curl_llist_init(&multi->pending, multi_freeamsg);
- /* allocate a new easy handle to use when closing cached connections */
- multi->closure_handle = curl_easy_init();
- if(!multi->closure_handle)
- goto error;
-
- multi->closure_handle->multi = multi;
- multi->closure_handle->state.conn_cache = &multi->conn_cache;
-
multi->max_pipeline_length = 5;
/* -1 means it not set by user, use the default value */
@@ -343,8 +337,6 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
Curl_hash_destroy(&multi->sockhash);
Curl_hash_destroy(&multi->hostcache);
Curl_conncache_destroy(&multi->conn_cache);
- Curl_close(multi->closure_handle);
- multi->closure_handle = NULL;
Curl_llist_destroy(&multi->msglist, NULL);
Curl_llist_destroy(&multi->pending, NULL);
@@ -405,8 +397,11 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
data->dns.hostcachetype = HCACHE_MULTI;
}
- /* Point to the multi's connection cache */
- data->state.conn_cache = &multi->conn_cache;
+ /* Point to the shared or multi handle connection cache */
+ if(data->share && (data->share->specifier & (1<< CURL_LOCK_DATA_CONNECT)))
+ data->state.conn_cache = &data->share->conn_cache;
+ else
+ data->state.conn_cache = &multi->conn_cache;
/* This adds the new entry at the 'end' of the doubly-linked circular
list of Curl_easy structs to try and maintain a FIFO queue so
@@ -460,8 +455,8 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
state somewhat we clone the timeouts from each added handle so that the
closure handle always has the same timeouts as the most recently added
easy handle. */
- multi->closure_handle->set.timeout = data->set.timeout;
- multi->closure_handle->set.server_response_timeout =
+ data->state.conn_cache->closure_handle->set.timeout = data->set.timeout;
+ data->state.conn_cache->closure_handle->set.server_response_timeout =
data->set.server_response_timeout;
update_timer(multi);
@@ -502,7 +497,7 @@ ConnectionDone(struct Curl_easy *data, struct connectdata *conn)
data->state.conn_cache->num_connections > maxconnects) {
infof(data, "Connection cache is full, closing the oldest one.\n");
- conn_candidate = Curl_oldest_idle_connection(data);
+ conn_candidate = Curl_conncache_oldest_idle(data);
if(conn_candidate) {
/* Set the connection's owner correctly */
@@ -592,7 +587,7 @@ static CURLcode multi_done(struct connectdata **connp,
/* if the transfer was completed in a paused state there can be buffered
data left to free */
- for(i=0; i < data->state.tempcount; i++) {
+ for(i = 0; i < data->state.tempcount; i++) {
free(data->state.tempwrite[i].buf);
}
data->state.tempcount = 0;
@@ -705,12 +700,6 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
curl_easy_cleanup is called. */
Curl_expire_clear(data);
- if(data->dns.hostcachetype == HCACHE_MULTI) {
- /* stop using the multi handle's DNS cache */
- data->dns.hostcache = NULL;
- data->dns.hostcachetype = HCACHE_NONE;
- }
-
if(data->easy_conn) {
/* we must call multi_done() here (if we still own the connection) so that
@@ -729,6 +718,13 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
Curl_getoff_all_pipelines(data, data->easy_conn);
}
+ if(data->dns.hostcachetype == HCACHE_MULTI) {
+ /* stop using the multi handle's DNS cache, *after* the possible
+ multi_done() call above */
+ data->dns.hostcache = NULL;
+ data->dns.hostcachetype = HCACHE_NONE;
+ }
+
Curl_wildcard_dtor(&data->wildcard);
/* destroy the timeout list that is held in the easy handle, do this *after*
@@ -802,8 +798,8 @@ static int waitconnect_getsock(struct connectdata *conn,
int numsocks)
{
int i;
- int s=0;
- int rc=0;
+ int s = 0;
+ int rc = 0;
if(!numsocks)
return GETSOCK_BLANK;
@@ -813,7 +809,7 @@ static int waitconnect_getsock(struct connectdata *conn,
return Curl_ssl_getsock(conn, sock, numsocks);
#endif
- for(i=0; i<2; i++) {
+ for(i = 0; i<2; i++) {
if(conn->tempsock[i] != CURL_SOCKET_BAD) {
sock[s] = conn->tempsock[i];
rc |= GETSOCK_WRITESOCK(s++);
@@ -924,7 +920,7 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
Some easy handles may not have connected to the remote host yet,
and then we must make sure that is done. */
struct Curl_easy *data;
- int this_max_fd=-1;
+ int this_max_fd = -1;
curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
int bitmap;
int i;
@@ -933,11 +929,11 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
if(!GOOD_MULTI_HANDLE(multi))
return CURLM_BAD_HANDLE;
- data=multi->easyp;
+ data = multi->easyp;
while(data) {
bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
- for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) {
+ for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
if((bitmap & GETSOCK_READSOCK(i)) && VALID_SOCK((sockbunch[i]))) {
@@ -994,11 +990,11 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
timeout_ms = (int)timeout_internal;
/* Count up how many fds we have from the multi handle */
- data=multi->easyp;
+ data = multi->easyp;
while(data) {
bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
- for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) {
+ for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
if(bitmap & GETSOCK_READSOCK(i)) {
@@ -1041,11 +1037,11 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
if(curlfds) {
/* Add the curl handles to our pollfds first */
- data=multi->easyp;
+ data = multi->easyp;
while(data) {
bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
- for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) {
+ for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
if(bitmap & GETSOCK_READSOCK(i)) {
@@ -1229,15 +1225,15 @@ static CURLcode multi_reconnect_request(struct connectdata **connp)
*/
static void do_complete(struct connectdata *conn)
{
- conn->data->req.chunk=FALSE;
+ conn->data->req.chunk = FALSE;
conn->data->req.maxfd = (conn->sockfd>conn->writesockfd?
- conn->sockfd:conn->writesockfd)+1;
+ conn->sockfd:conn->writesockfd) + 1;
Curl_pgrsTime(conn->data, TIMER_PRETRANSFER);
}
static CURLcode multi_do(struct connectdata **connp, bool *done)
{
- CURLcode result=CURLE_OK;
+ CURLcode result = CURLE_OK;
struct connectdata *conn = *connp;
struct Curl_easy *data = conn->data;
@@ -1286,7 +1282,7 @@ static CURLcode multi_do(struct connectdata **connp, bool *done)
static CURLcode multi_do_more(struct connectdata *conn, int *complete)
{
- CURLcode result=CURLE_OK;
+ CURLcode result = CURLE_OK;
*complete = 0;
@@ -1315,7 +1311,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
struct SingleRequest *k;
time_t timeout_ms;
time_t recv_timeout_ms;
- time_t send_timeout_ms;
+ timediff_t send_timeout_ms;
int control;
if(!GOOD_EASY_HANDLE(data))
@@ -1379,23 +1375,23 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
/* Handle timed out */
if(data->mstate == CURLM_STATE_WAITRESOLVE)
failf(data, "Resolving timed out after %ld milliseconds",
- Curl_tvdiff(now, data->progress.t_startsingle));
+ Curl_timediff(now, data->progress.t_startsingle));
else if(data->mstate == CURLM_STATE_WAITCONNECT)
failf(data, "Connection timed out after %ld milliseconds",
- Curl_tvdiff(now, data->progress.t_startsingle));
+ Curl_timediff(now, data->progress.t_startsingle));
else {
k = &data->req;
if(k->size != -1) {
failf(data, "Operation timed out after %ld milliseconds with %"
CURL_FORMAT_CURL_OFF_T " out of %"
CURL_FORMAT_CURL_OFF_T " bytes received",
- Curl_tvdiff(now, data->progress.t_startsingle),
+ Curl_timediff(now, data->progress.t_startsingle),
k->bytecount, k->size);
}
else {
failf(data, "Operation timed out after %ld milliseconds with %"
CURL_FORMAT_CURL_OFF_T " bytes received",
- Curl_tvdiff(now, data->progress.t_startsingle),
+ Curl_timediff(now, data->progress.t_startsingle),
k->bytecount);
}
}
@@ -1415,7 +1411,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
switch(data->mstate) {
case CURLM_STATE_INIT:
/* init this transfer. */
- result=Curl_pretransfer(data);
+ result = Curl_pretransfer(data);
if(!result) {
/* after init, go CONNECT */
@@ -1660,7 +1656,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(!result) {
if(!dophase_done) {
/* some steps needed for wildcard matching */
- if(data->set.wildcardmatch) {
+ if(data->state.wildcardmatch) {
struct WildcardData *wc = &data->wildcard;
if(wc->state == CURLWC_DONE || wc->state == CURLWC_SKIP) {
/* skip some states if it is important */
@@ -1697,7 +1693,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
* back to the CONNECT phase so we can try again.
*/
char *newurl = NULL;
- followtype follow=FOLLOW_NONE;
+ followtype follow = FOLLOW_NONE;
CURLcode drc;
bool retry = FALSE;
@@ -1783,7 +1779,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(control) {
/* if positive, advance to DO_DONE
if negative, go back to DOING */
- multistate(data, control==1?
+ multistate(data, control == 1?
CURLM_STATE_DO_DONE:
CURLM_STATE_DOING);
rc = CURLM_CALL_MULTI_PERFORM;
@@ -1812,7 +1808,13 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
(data->easy_conn->writesockfd != CURL_SOCKET_BAD))
multistate(data, CURLM_STATE_WAITPERFORM);
else
+ {
+ if(data->state.wildcardmatch &&
+ ((data->easy_conn->handler->flags & PROTOPT_WILDCARD) == 0)) {
+ data->wildcard.state = CURLWC_DONE;
+ }
multistate(data, CURLM_STATE_DONE);
+ }
rc = CURLM_CALL_MULTI_PERFORM;
break;
@@ -1938,7 +1940,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
multi_done(&data->easy_conn, result, TRUE);
}
else if(done) {
- followtype follow=FOLLOW_NONE;
+ followtype follow = FOLLOW_NONE;
/* call this even if the readwrite function returned error */
Curl_posttransfer(data);
@@ -2029,7 +2031,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
data->easy_conn = NULL;
}
- if(data->set.wildcardmatch) {
+ if(data->state.wildcardmatch) {
if(data->wildcard.state != CURLWC_DONE) {
/* if a wildcard is set and we are not ending -> lets start again
with CURLM_STATE_INIT */
@@ -2144,14 +2146,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
{
struct Curl_easy *data;
- CURLMcode returncode=CURLM_OK;
+ CURLMcode returncode = CURLM_OK;
struct Curl_tree *t;
- struct curltime now = Curl_tvnow();
+ struct curltime now = Curl_now();
if(!GOOD_MULTI_HANDLE(multi))
return CURLM_BAD_HANDLE;
- data=multi->easyp;
+ data = multi->easyp;
while(data) {
CURLMcode result;
SIGPIPE_VARIABLE(pipe_st);
@@ -2192,61 +2194,21 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
return returncode;
}
-static void close_all_connections(struct Curl_multi *multi)
-{
- struct connectdata *conn;
-
- conn = Curl_conncache_find_first_connection(&multi->conn_cache);
- while(conn) {
- SIGPIPE_VARIABLE(pipe_st);
- conn->data = multi->closure_handle;
-
- sigpipe_ignore(conn->data, &pipe_st);
- conn->data->easy_conn = NULL; /* clear the easy handle's connection
- pointer */
- /* This will remove the connection from the cache */
- connclose(conn, "kill all");
- (void)Curl_disconnect(conn, FALSE);
- sigpipe_restore(&pipe_st);
-
- conn = Curl_conncache_find_first_connection(&multi->conn_cache);
- }
-}
-
CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
{
struct Curl_easy *data;
struct Curl_easy *nextdata;
if(GOOD_MULTI_HANDLE(multi)) {
- bool restore_pipe = FALSE;
- SIGPIPE_VARIABLE(pipe_st);
-
multi->type = 0; /* not good anymore */
- /* Close all the connections in the connection cache */
- close_all_connections(multi);
-
- if(multi->closure_handle) {
- sigpipe_ignore(multi->closure_handle, &pipe_st);
- restore_pipe = TRUE;
-
- multi->closure_handle->dns.hostcache = &multi->hostcache;
- Curl_hostcache_clean(multi->closure_handle,
- multi->closure_handle->dns.hostcache);
-
- Curl_close(multi->closure_handle);
- }
-
- Curl_hash_destroy(&multi->sockhash);
- Curl_conncache_destroy(&multi->conn_cache);
- Curl_llist_destroy(&multi->msglist, NULL);
- Curl_llist_destroy(&multi->pending, NULL);
-
- /* remove all easy handles */
+ /* Firsrt remove all remaining easy handles */
data = multi->easyp;
while(data) {
- nextdata=data->next;
+ nextdata = data->next;
+ if(!data->state.done && data->easy_conn)
+ /* if DONE was never called for this handle */
+ (void)multi_done(&data->easy_conn, CURLE_OK, TRUE);
if(data->dns.hostcachetype == HCACHE_MULTI) {
/* clear out the usage of the shared DNS cache */
Curl_hostcache_clean(data, data->dns.hostcache);
@@ -2261,6 +2223,14 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
data = nextdata;
}
+ /* Close all the connections in the connection cache */
+ Curl_conncache_close_all_connections(&multi->conn_cache);
+
+ Curl_hash_destroy(&multi->sockhash);
+ Curl_conncache_destroy(&multi->conn_cache);
+ Curl_llist_destroy(&multi->msglist, NULL);
+ Curl_llist_destroy(&multi->pending, NULL);
+
Curl_hash_destroy(&multi->hostcache);
/* Free the blacklists by setting them to NULL */
@@ -2268,8 +2238,6 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
Curl_pipeline_set_server_blacklist(NULL, &multi->pipelining_server_bl);
free(multi);
- if(restore_pipe)
- sigpipe_restore(&pipe_st);
return CURLM_OK;
}
@@ -2326,7 +2294,7 @@ static void singlesocket(struct Curl_multi *multi,
int num;
unsigned int curraction;
- for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++)
+ for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++)
socks[i] = CURL_SOCKET_BAD;
/* Fill in the 'current' struct with the state as it is now: what sockets to
@@ -2338,7 +2306,7 @@ static void singlesocket(struct Curl_multi *multi,
longer supervised ones and add new ones */
/* walk over the sockets we got right now */
- for(i=0; (i< MAX_SOCKSPEREASYHANDLE) &&
+ for(i = 0; (i< MAX_SOCKSPEREASYHANDLE) &&
(curraction & (GETSOCK_READSOCK(i) | GETSOCK_WRITESOCK(i)));
i++) {
int action = CURL_POLL_NONE;
@@ -2382,10 +2350,10 @@ static void singlesocket(struct Curl_multi *multi,
/* when we've walked over all the sockets we should have right now, we must
make sure to detect sockets that are removed */
- for(i=0; i< data->numsocks; i++) {
+ for(i = 0; i< data->numsocks; i++) {
int j;
s = data->sockets[i];
- for(j=0; j<num; j++) {
+ for(j = 0; j<num; j++) {
if(s == socks[j]) {
/* this is still supervised */
s = CURL_SOCKET_BAD;
@@ -2510,9 +2478,9 @@ static CURLMcode add_next_timeout(struct curltime now,
timeout in *tv */
for(e = list->head; e;) {
struct curl_llist_element *n = e->next;
- time_t diff;
+ timediff_t diff;
node = (struct time_node *)e->ptr;
- diff = curlx_tvdiff(node->time, now);
+ diff = Curl_timediff(node->time, now);
if(diff <= 0)
/* remove outdated entry */
Curl_llist_remove(list, e, NULL);
@@ -2549,7 +2517,7 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
CURLMcode result = CURLM_OK;
struct Curl_easy *data = NULL;
struct Curl_tree *t;
- struct curltime now = Curl_tvnow();
+ struct curltime now = Curl_now();
if(checkall) {
/* *perform() deals with running_handles on its own */
@@ -2558,7 +2526,7 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
/* walk through each easy handle and do the socket state change magic
and callbacks */
if(result != CURLM_BAD_HANDLE) {
- data=multi->easyp;
+ data = multi->easyp;
while(data) {
singlesocket(multi, data);
data = data->next;
@@ -2625,8 +2593,8 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
data = NULL; /* set data to NULL again to avoid calling
multi_runsingle() in case there's no need to */
- now = Curl_tvnow(); /* get a newer time since the multi_runsingle() loop
- may have taken some time */
+ now = Curl_now(); /* get a newer time since the multi_runsingle() loop
+ may have taken some time */
}
}
else {
@@ -2779,15 +2747,15 @@ static CURLMcode multi_timeout(struct Curl_multi *multi,
if(multi->timetree) {
/* we have a tree of expire times */
- struct curltime now = Curl_tvnow();
+ struct curltime now = Curl_now();
/* splay the lowest to the bottom */
multi->timetree = Curl_splay(tv_zero, multi->timetree);
if(Curl_splaycomparekeys(multi->timetree->key, now) > 0) {
/* some time left before expiration */
- *timeout_ms = (long)curlx_tvdiff(multi->timetree->key, now);
- if(!*timeout_ms)
+ timediff_t diff = Curl_timediff(multi->timetree->key, now);
+ if(diff <= 0)
/*
* Since we only provide millisecond resolution on the returned value
* and the diff might be less than one millisecond here, we don't
@@ -2795,7 +2763,11 @@ static CURLMcode multi_timeout(struct Curl_multi *multi,
* processors while the diff is still present but less than one
* millisecond! instead we return 1 until the time is ripe.
*/
- *timeout_ms=1;
+ *timeout_ms = 1;
+ else
+ /* this should be safe even on 64 bit archs, as we don't use that
+ overly long timeouts */
+ *timeout_ms = (long)diff;
}
else
/* 0 means immediately */
@@ -2831,7 +2803,7 @@ static int update_timer(struct Curl_multi *multi)
return -1;
}
if(timeout_ms < 0) {
- static const struct curltime none={0, 0};
+ static const struct curltime none = {0, 0};
if(Curl_splaycomparekeys(none, multi->timer_lastcall)) {
multi->timer_lastcall = none;
/* there's no timeout now but there was one previously, tell the app to
@@ -2902,7 +2874,7 @@ multi_addtimeout(struct Curl_easy *data,
/* find the correct spot in the list */
for(e = timeoutlist->head; e; e = e->next) {
struct time_node *check = (struct time_node *)e->ptr;
- time_t diff = curlx_tvdiff(check->time, node->time);
+ timediff_t diff = Curl_timediff(check->time, node->time);
if(diff > 0)
break;
prev = e;
@@ -2941,7 +2913,7 @@ void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
DEBUGASSERT(id < EXPIRE_LAST);
- set = Curl_tvnow();
+ set = Curl_now();
set.tv_sec += milli/1000;
set.tv_usec += (unsigned int)(milli%1000)*1000;
@@ -2961,7 +2933,7 @@ void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
/* This means that the struct is added as a node in the splay tree.
Compare if the new time is earlier, and only remove-old/add-new if it
is. */
- time_t diff = curlx_tvdiff(set, *nowp);
+ timediff_t diff = Curl_timediff(set, *nowp);
if(diff > 0) {
/* The current splay tree entry is sooner than this new expiry time.
@@ -3115,13 +3087,13 @@ void Curl_multi_dump(struct Curl_multi *multi)
int i;
fprintf(stderr, "* Multi status: %d handles, %d alive\n",
multi->num_easy, multi->num_alive);
- for(data=multi->easyp; data; data = data->next) {
+ for(data = multi->easyp; data; data = data->next) {
if(data->mstate < CURLM_STATE_COMPLETED) {
/* only display handles that are not completed */
fprintf(stderr, "handle %p, state %s, %d sockets\n",
(void *)data,
statename[data->mstate], data->numsocks);
- for(i=0; i < data->numsocks; i++) {
+ for(i = 0; i < data->numsocks; i++) {
curl_socket_t s = data->sockets[i];
struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
diff --git a/lib/multihandle.h b/lib/multihandle.h
index 4057539..de9a7cf 100644
--- a/lib/multihandle.h
+++ b/lib/multihandle.h
@@ -114,10 +114,6 @@ struct Curl_multi {
/* Shared connection cache (bundles)*/
struct conncache conn_cache;
- /* This handle will be used for closing the cached connections in
- curl_multi_cleanup() */
- struct Curl_easy *closure_handle;
-
long maxconnects; /* if >0, a fixed limit of the maximum number of entries
we're allowed to grow the connection cache to */
diff --git a/lib/netrc.c b/lib/netrc.c
index 6e4858b..dbcc59a 100644
--- a/lib/netrc.c
+++ b/lib/netrc.c
@@ -56,14 +56,15 @@ int Curl_parsenetrc(const char *host,
char *netrcfile)
{
FILE *file;
- int retcode=1;
+ int retcode = 1;
int specific_login = (*loginp && **loginp != 0);
bool netrc_alloc = FALSE;
- enum host_lookup_state state=NOTHING;
+ enum host_lookup_state state = NOTHING;
- char state_login=0; /* Found a login keyword */
- char state_password=0; /* Found a password keyword */
- int state_our_login=FALSE; /* With specific_login, found *our* login name */
+ char state_login = 0; /* Found a login keyword */
+ char state_password = 0; /* Found a password keyword */
+ int state_our_login = FALSE; /* With specific_login, found *our* login
+ name */
#define NETRC DOT_CHAR "netrc"
@@ -88,7 +89,7 @@ int Curl_parsenetrc(const char *host,
}
else {
struct passwd *pw;
- pw= getpwuid(geteuid());
+ pw = getpwuid(geteuid());
if(pw) {
home = pw->pw_dir;
}
@@ -113,19 +114,19 @@ int Curl_parsenetrc(const char *host,
if(file) {
char *tok;
char *tok_buf;
- bool done=FALSE;
+ bool done = FALSE;
char netrcbuffer[256];
int netrcbuffsize = (int)sizeof(netrcbuffer);
while(!done && fgets(netrcbuffer, netrcbuffsize, file)) {
- tok=strtok_r(netrcbuffer, " \t\n", &tok_buf);
+ tok = strtok_r(netrcbuffer, " \t\n", &tok_buf);
if(tok && *tok == '#')
/* treat an initial hash as a comment line */
continue;
while(!done && tok) {
if((*loginp && **loginp) && (*passwordp && **passwordp)) {
- done=TRUE;
+ done = TRUE;
break;
}
@@ -136,22 +137,22 @@ int Curl_parsenetrc(const char *host,
delimiter that starts the stuff entered for this machine,
after this we need to search for 'login' and
'password'. */
- state=HOSTFOUND;
+ state = HOSTFOUND;
}
else if(strcasecompare("default", tok)) {
- state=HOSTVALID;
- retcode=0; /* we did find our host */
+ state = HOSTVALID;
+ retcode = 0; /* we did find our host */
}
break;
case HOSTFOUND:
if(strcasecompare(host, tok)) {
/* and yes, this is our host! */
- state=HOSTVALID;
- retcode=0; /* we did find our host */
+ state = HOSTVALID;
+ retcode = 0; /* we did find our host */
}
else
/* not our host */
- state=NOTHING;
+ state = NOTHING;
break;
case HOSTVALID:
/* we are now parsing sub-keywords concerning "our" host */
@@ -167,7 +168,7 @@ int Curl_parsenetrc(const char *host,
goto out;
}
}
- state_login=0;
+ state_login = 0;
}
else if(state_password) {
if(state_our_login || !specific_login) {
@@ -178,12 +179,12 @@ int Curl_parsenetrc(const char *host,
goto out;
}
}
- state_password=0;
+ state_password = 0;
}
else if(strcasecompare("login", tok))
- state_login=1;
+ state_login = 1;
else if(strcasecompare("password", tok))
- state_password=1;
+ state_password = 1;
else if(strcasecompare("machine", tok)) {
/* ok, there's machine here go => */
state = HOSTFOUND;
diff --git a/lib/non-ascii.c b/lib/non-ascii.c
index ae00970..92b2f8d 100644
--- a/lib/non-ascii.c
+++ b/lib/non-ascii.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -82,7 +82,7 @@ CURLcode Curl_convert_clone(struct Curl_easy *data,
CURLcode Curl_convert_to_network(struct Curl_easy *data,
char *buffer, size_t length)
{
- if(data->set.convtonetwork) {
+ if(data && data->set.convtonetwork) {
/* use translation callback */
CURLcode result = data->set.convtonetwork(buffer, length);
if(result) {
@@ -96,14 +96,18 @@ CURLcode Curl_convert_to_network(struct Curl_easy *data,
else {
#ifdef HAVE_ICONV
/* do the translation ourselves */
+ iconv_t tmpcd = (iconv_t) -1;
+ iconv_t *cd = &tmpcd;
char *input_ptr, *output_ptr;
size_t in_bytes, out_bytes, rc;
/* open an iconv conversion descriptor if necessary */
- if(data->outbound_cd == (iconv_t)-1) {
- data->outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
- CURL_ICONV_CODESET_OF_HOST);
- if(data->outbound_cd == (iconv_t)-1) {
+ if(data)
+ cd = &data->outbound_cd;
+ if(*cd == (iconv_t)-1) {
+ *cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
+ CURL_ICONV_CODESET_OF_HOST);
+ if(*cd == (iconv_t)-1) {
failf(data,
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
CURL_ICONV_CODESET_OF_NETWORK,
@@ -115,8 +119,10 @@ CURLcode Curl_convert_to_network(struct Curl_easy *data,
/* call iconv */
input_ptr = output_ptr = buffer;
in_bytes = out_bytes = length;
- rc = iconv(data->outbound_cd, (const char **)&input_ptr, &in_bytes,
+ rc = iconv(*cd, &input_ptr, &in_bytes,
&output_ptr, &out_bytes);
+ if(!data)
+ iconv_close(tmpcd);
if((rc == ICONV_ERROR) || (in_bytes != 0)) {
failf(data,
"The Curl_convert_to_network iconv call failed with errno %i: %s",
@@ -139,7 +145,7 @@ CURLcode Curl_convert_to_network(struct Curl_easy *data,
CURLcode Curl_convert_from_network(struct Curl_easy *data,
char *buffer, size_t length)
{
- if(data->set.convfromnetwork) {
+ if(data && data->set.convfromnetwork) {
/* use translation callback */
CURLcode result = data->set.convfromnetwork(buffer, length);
if(result) {
@@ -153,14 +159,18 @@ CURLcode Curl_convert_from_network(struct Curl_easy *data,
else {
#ifdef HAVE_ICONV
/* do the translation ourselves */
+ iconv_t tmpcd = (iconv_t) -1;
+ iconv_t *cd = &tmpcd;
char *input_ptr, *output_ptr;
size_t in_bytes, out_bytes, rc;
/* open an iconv conversion descriptor if necessary */
- if(data->inbound_cd == (iconv_t)-1) {
- data->inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
- CURL_ICONV_CODESET_OF_NETWORK);
- if(data->inbound_cd == (iconv_t)-1) {
+ if(data)
+ cd = &data->inbound_cd;
+ if(*cd == (iconv_t)-1) {
+ *cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
+ CURL_ICONV_CODESET_OF_NETWORK);
+ if(*cd == (iconv_t)-1) {
failf(data,
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
CURL_ICONV_CODESET_OF_HOST,
@@ -172,8 +182,10 @@ CURLcode Curl_convert_from_network(struct Curl_easy *data,
/* call iconv */
input_ptr = output_ptr = buffer;
in_bytes = out_bytes = length;
- rc = iconv(data->inbound_cd, (const char **)&input_ptr, &in_bytes,
+ rc = iconv(*cd, &input_ptr, &in_bytes,
&output_ptr, &out_bytes);
+ if(!data)
+ iconv_close(tmpcd);
if((rc == ICONV_ERROR) || (in_bytes != 0)) {
failf(data,
"Curl_convert_from_network iconv call failed with errno %i: %s",
@@ -196,7 +208,7 @@ CURLcode Curl_convert_from_network(struct Curl_easy *data,
CURLcode Curl_convert_from_utf8(struct Curl_easy *data,
char *buffer, size_t length)
{
- if(data->set.convfromutf8) {
+ if(data && data->set.convfromutf8) {
/* use translation callback */
CURLcode result = data->set.convfromutf8(buffer, length);
if(result) {
@@ -210,15 +222,19 @@ CURLcode Curl_convert_from_utf8(struct Curl_easy *data,
else {
#ifdef HAVE_ICONV
/* do the translation ourselves */
- const char *input_ptr;
+ iconv_t tmpcd = (iconv_t) -1;
+ iconv_t *cd = &tmpcd;
+ char *input_ptr;
char *output_ptr;
size_t in_bytes, out_bytes, rc;
/* open an iconv conversion descriptor if necessary */
- if(data->utf8_cd == (iconv_t)-1) {
- data->utf8_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
- CURL_ICONV_CODESET_FOR_UTF8);
- if(data->utf8_cd == (iconv_t)-1) {
+ if(data)
+ cd = &data->utf8_cd;
+ if(*cd == (iconv_t)-1) {
+ *cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
+ CURL_ICONV_CODESET_FOR_UTF8);
+ if(*cd == (iconv_t)-1) {
failf(data,
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
CURL_ICONV_CODESET_OF_HOST,
@@ -230,8 +246,10 @@ CURLcode Curl_convert_from_utf8(struct Curl_easy *data,
/* call iconv */
input_ptr = output_ptr = buffer;
in_bytes = out_bytes = length;
- rc = iconv(data->utf8_cd, &input_ptr, &in_bytes,
+ rc = iconv(*cd, &input_ptr, &in_bytes,
&output_ptr, &out_bytes);
+ if(!data)
+ iconv_close(tmpcd);
if((rc == ICONV_ERROR) || (in_bytes != 0)) {
failf(data,
"The Curl_convert_from_utf8 iconv call failed with errno %i: %s",
@@ -301,29 +319,4 @@ void Curl_convert_close(struct Curl_easy *data)
#endif /* HAVE_ICONV */
}
-/*
- * Curl_convert_form() is used from http.c, this converts any form items that
- need to be sent in the network encoding. Returns CURLE_OK on success.
- */
-CURLcode Curl_convert_form(struct Curl_easy *data, struct FormData *form)
-{
- CURLcode result;
-
- if(!data)
- return CURLE_BAD_FUNCTION_ARGUMENT;
-
- while(form) {
- if(form->type == FORM_DATA) {
- result = Curl_convert_to_network(data, form->line, form->length);
- /* Curl_convert_to_network calls failf if unsuccessful */
- if(result)
- return result;
- }
-
- form = form->next;
- }
-
- return CURLE_OK;
-}
-
#endif /* CURL_DOES_CONVERSIONS */
diff --git a/lib/non-ascii.h b/lib/non-ascii.h
index e27f1f4..5fb5771 100644
--- a/lib/non-ascii.h
+++ b/lib/non-ascii.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -48,7 +48,6 @@ CURLcode Curl_convert_from_network(struct Curl_easy *data,
char *buffer, size_t length);
CURLcode Curl_convert_from_utf8(struct Curl_easy *data,
char *buffer, size_t length);
-CURLcode Curl_convert_form(struct Curl_easy *data, struct FormData *form);
#else
#define Curl_convert_clone(a,b,c,d) ((void)a, CURLE_OK)
#define Curl_convert_init(x) Curl_nop_stmt
@@ -57,7 +56,6 @@ CURLcode Curl_convert_form(struct Curl_easy *data, struct FormData *form);
#define Curl_convert_to_network(a,b,c) ((void)a, CURLE_OK)
#define Curl_convert_from_network(a,b,c) ((void)a, CURLE_OK)
#define Curl_convert_from_utf8(a,b,c) ((void)a, CURLE_OK)
-#define Curl_convert_form(a,b) CURLE_OK
#endif
#endif /* HEADER_CURL_NON_ASCII_H */
diff --git a/lib/openldap.c b/lib/openldap.c
index 369309c..ac356d0 100644
--- a/lib/openldap.c
+++ b/lib/openldap.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010, Howard Chu, <hyc@openldap.org>
+ * Copyright (C) 2010, 2017, Howard Chu, <hyc@openldap.org>
* Copyright (C) 2011 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
@@ -152,7 +152,7 @@ static CURLcode ldap_setup_connection(struct connectdata *conn)
{
ldapconninfo *li;
LDAPURLDesc *lud;
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
int rc, proto;
CURLcode status;
@@ -198,7 +198,7 @@ static CURLcode ldap_connect(struct connectdata *conn, bool *done)
(void)done;
strcpy(hosturl, "ldap");
- ptr = hosturl+4;
+ ptr = hosturl + 4;
if(conn->handler->flags & PROTOPT_SSL)
*ptr++ = 's';
snprintf(ptr, sizeof(hosturl)-(ptr-hosturl), "://%s:%d",
@@ -354,7 +354,7 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done)
int rc = 0;
LDAPURLDesc *ludp = NULL;
int msgid;
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
connkeep(conn, "OpenLDAP do");
@@ -519,7 +519,7 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
else
binary = 0;
- for(i=0; bvals[i].bv_val != NULL; i++) {
+ for(i = 0; bvals[i].bv_val != NULL; i++) {
int binval = 0;
writeerr = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1);
if(writeerr) {
@@ -549,7 +549,7 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
else {
/* check for unprintable characters */
unsigned int j;
- for(j=0; j<bvals[i].bv_len; j++)
+ for(j = 0; j<bvals[i].bv_len; j++)
if(!ISPRINT(bvals[i].bv_val[j])) {
binval = 1;
break;
@@ -677,7 +677,7 @@ ldapsb_tls_read(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
ber_slen_t ret;
CURLcode err = CURLE_RECV_ERROR;
- ret = li->recv(conn, FIRSTSOCKET, buf, len, &err);
+ ret = (li->recv)(conn, FIRSTSOCKET, buf, len, &err);
if(ret < 0 && err == CURLE_AGAIN) {
SET_SOCKERRNO(EWOULDBLOCK);
}
@@ -692,7 +692,7 @@ ldapsb_tls_write(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
ber_slen_t ret;
CURLcode err = CURLE_SEND_ERROR;
- ret = li->send(conn, FIRSTSOCKET, buf, len, &err);
+ ret = (li->send)(conn, FIRSTSOCKET, buf, len, &err);
if(ret < 0 && err == CURLE_AGAIN) {
SET_SOCKERRNO(EWOULDBLOCK);
}
diff --git a/lib/parsedate.c b/lib/parsedate.c
index 609fd53..b82605b 100644
--- a/lib/parsedate.c
+++ b/lib/parsedate.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -167,20 +167,20 @@ static const struct tzinfo tz[]= {
RFC 1123) had their signs wrong. Here we use the correct signs to match
actual military usage.
*/
- {"A", +1 * 60}, /* Alpha */
- {"B", +2 * 60}, /* Bravo */
- {"C", +3 * 60}, /* Charlie */
- {"D", +4 * 60}, /* Delta */
- {"E", +5 * 60}, /* Echo */
- {"F", +6 * 60}, /* Foxtrot */
- {"G", +7 * 60}, /* Golf */
- {"H", +8 * 60}, /* Hotel */
- {"I", +9 * 60}, /* India */
+ {"A", 1 * 60}, /* Alpha */
+ {"B", 2 * 60}, /* Bravo */
+ {"C", 3 * 60}, /* Charlie */
+ {"D", 4 * 60}, /* Delta */
+ {"E", 5 * 60}, /* Echo */
+ {"F", 6 * 60}, /* Foxtrot */
+ {"G", 7 * 60}, /* Golf */
+ {"H", 8 * 60}, /* Hotel */
+ {"I", 9 * 60}, /* India */
/* "J", Juliet is not used as a timezone, to indicate the observer's local
time */
- {"K", +10 * 60}, /* Kilo */
- {"L", +11 * 60}, /* Lima */
- {"M", +12 * 60}, /* Mike */
+ {"K", 10 * 60}, /* Kilo */
+ {"L", 11 * 60}, /* Lima */
+ {"M", 12 * 60}, /* Mike */
{"N", -1 * 60}, /* November */
{"O", -2 * 60}, /* Oscar */
{"P", -3 * 60}, /* Papa */
@@ -205,14 +205,14 @@ static int checkday(const char *check, size_t len)
{
int i;
const char * const *what;
- bool found= FALSE;
+ bool found = FALSE;
if(len > 3)
what = &weekday[0];
else
what = &Curl_wkday[0];
- for(i=0; i<7; i++) {
+ for(i = 0; i<7; i++) {
if(strcasecompare(check, what[0])) {
- found=TRUE;
+ found = TRUE;
break;
}
what++;
@@ -224,12 +224,12 @@ static int checkmonth(const char *check)
{
int i;
const char * const *what;
- bool found= FALSE;
+ bool found = FALSE;
what = &Curl_month[0];
- for(i=0; i<12; i++) {
+ for(i = 0; i<12; i++) {
if(strcasecompare(check, what[0])) {
- found=TRUE;
+ found = TRUE;
break;
}
what++;
@@ -244,12 +244,12 @@ static int checktz(const char *check)
{
unsigned int i;
const struct tzinfo *what;
- bool found= FALSE;
+ bool found = FALSE;
what = tz;
- for(i=0; i< sizeof(tz)/sizeof(tz[0]); i++) {
+ for(i = 0; i< sizeof(tz)/sizeof(tz[0]); i++) {
if(strcasecompare(check, what->name)) {
- found=TRUE;
+ found = TRUE;
break;
}
what++;
@@ -331,21 +331,21 @@ static time_t my_timegm(struct my_tm *tm)
static int parsedate(const char *date, time_t *output)
{
time_t t = 0;
- int wdaynum=-1; /* day of the week number, 0-6 (mon-sun) */
- int monnum=-1; /* month of the year number, 0-11 */
- int mdaynum=-1; /* day of month, 1 - 31 */
- int hournum=-1;
- int minnum=-1;
- int secnum=-1;
- int yearnum=-1;
- int tzoff=-1;
+ int wdaynum = -1; /* day of the week number, 0-6 (mon-sun) */
+ int monnum = -1; /* month of the year number, 0-11 */
+ int mdaynum = -1; /* day of month, 1 - 31 */
+ int hournum = -1;
+ int minnum = -1;
+ int secnum = -1;
+ int yearnum = -1;
+ int tzoff = -1;
struct my_tm tm;
enum assume dignext = DATE_MDAY;
const char *indate = date; /* save the original pointer */
int part = 0; /* max 6 parts */
while(*date && (part < 6)) {
- bool found=FALSE;
+ bool found = FALSE;
skip(&date);
@@ -386,7 +386,7 @@ static int parsedate(const char *date, time_t *output)
/* a digit */
int val;
char *end;
- int len=0;
+ int len = 0;
if((secnum == -1) &&
(3 == sscanf(date, "%02d:%02d:%02d%n",
&hournum, &minnum, &secnum, &len))) {
diff --git a/lib/pingpong.c b/lib/pingpong.c
index 5ed79b7..438856a 100644
--- a/lib/pingpong.c
+++ b/lib/pingpong.c
@@ -47,10 +47,10 @@
time_t Curl_pp_state_timeout(struct pingpong *pp)
{
struct connectdata *conn = pp->conn;
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
time_t timeout_ms; /* in milliseconds */
time_t timeout2_ms; /* in milliseconds */
- long response_time= (data->set.server_response_timeout)?
+ long response_time = (data->set.server_response_timeout)?
data->set.server_response_timeout: pp->response_time;
/* if CURLOPT_SERVER_RESPONSE_TIMEOUT is set, use that to determine
@@ -61,12 +61,12 @@ time_t Curl_pp_state_timeout(struct pingpong *pp)
/* Without a requested timeout, we only wait 'response_time' seconds for the
full response to arrive before we bail out */
timeout_ms = response_time -
- Curl_tvdiff(Curl_tvnow(), pp->response); /* spent time */
+ Curl_timediff(Curl_now(), pp->response); /* spent time */
if(data->set.timeout) {
/* if timeout is requested, find out how much remaining time we have */
timeout2_ms = data->set.timeout - /* timeout time */
- Curl_tvdiff(Curl_tvnow(), conn->now); /* spent time */
+ Curl_timediff(Curl_now(), conn->now); /* spent time */
/* pick the lowest number */
timeout_ms = CURLMIN(timeout_ms, timeout2_ms);
@@ -85,10 +85,10 @@ CURLcode Curl_pp_statemach(struct pingpong *pp, bool block)
int rc;
time_t interval_ms;
time_t timeout_ms = Curl_pp_state_timeout(pp);
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
CURLcode result = CURLE_OK;
- if(timeout_ms <=0) {
+ if(timeout_ms <= 0) {
failf(data, "server response timeout");
return CURLE_OPERATION_TIMEDOUT; /* already too little time */
}
@@ -120,7 +120,7 @@ CURLcode Curl_pp_statemach(struct pingpong *pp, bool block)
if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
else
- result = Curl_speedcheck(data, Curl_tvnow());
+ result = Curl_speedcheck(data, Curl_now());
if(result)
return result;
@@ -143,7 +143,7 @@ void Curl_pp_init(struct pingpong *pp)
pp->nread_resp = 0;
pp->linestart_resp = conn->data->state.buffer;
pp->pending_resp = TRUE;
- pp->response = Curl_tvnow(); /* start response time-out now! */
+ pp->response = Curl_now(); /* start response time-out now! */
}
@@ -168,16 +168,22 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
char *s;
CURLcode result;
struct connectdata *conn = pp->conn;
- struct Curl_easy *data = conn->data;
+ struct Curl_easy *data;
#ifdef HAVE_GSSAPI
- enum protection_level data_sec = conn->data_prot;
+ enum protection_level data_sec;
#endif
DEBUGASSERT(pp->sendleft == 0);
DEBUGASSERT(pp->sendsize == 0);
DEBUGASSERT(pp->sendthis == NULL);
+ if(!conn)
+ /* can't send without a connection! */
+ return CURLE_SEND_ERROR;
+
+ data = conn->data;
+
fmt_crlf = aprintf("%s\r\n", fmt); /* append a trailing CRLF */
if(!fmt_crlf)
return CURLE_OUT_OF_MEMORY;
@@ -205,6 +211,7 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
result = Curl_write(conn, conn->sock[FIRSTSOCKET], s, write_len,
&bytes_written);
#ifdef HAVE_GSSAPI
+ data_sec = conn->data_prot;
DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST);
conn->data_prot = data_sec;
#endif
@@ -228,7 +235,7 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
free(s);
pp->sendthis = NULL;
pp->sendleft = pp->sendsize = 0;
- pp->response = Curl_tvnow();
+ pp->response = Curl_now();
}
return CURLE_OK;
@@ -270,7 +277,7 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
size_t *size) /* size of the response */
{
ssize_t perline; /* count bytes per line */
- bool keepon=TRUE;
+ bool keepon = TRUE;
ssize_t gotbytes;
char *ptr;
struct connectdata *conn = pp->conn;
@@ -281,7 +288,7 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
*code = 0; /* 0 for errors or not done */
*size = 0;
- ptr=buf + pp->nread_resp;
+ ptr = buf + pp->nread_resp;
/* number of bytes in the current line, so far */
perline = (ssize_t)(ptr-pp->linestart_resp);
@@ -297,7 +304,7 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
* it would have been populated with something of size int to begin
* with, even though its datatype may be larger than an int.
*/
- DEBUGASSERT((ptr+pp->cache_size) <= (buf+data->set.buffer_size+1));
+ DEBUGASSERT((ptr + pp->cache_size) <= (buf + data->set.buffer_size + 1));
memcpy(ptr, pp->cache, pp->cache_size);
gotbytes = (ssize_t)pp->cache_size;
free(pp->cache); /* free the cache */
@@ -351,7 +358,7 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
pp->nread_resp += gotbytes;
for(i = 0; i < gotbytes; ptr++, i++) {
perline++;
- if(*ptr=='\n') {
+ if(*ptr == '\n') {
/* a newline is CRLF in pp-talk, so the CR is ignored as
the line isn't really terminated until the LF comes */
@@ -378,17 +385,17 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
start of the buffer and zero terminate, for old times sake */
size_t n = ptr - pp->linestart_resp;
memmove(buf, pp->linestart_resp, n);
- buf[n]=0; /* zero terminate */
- keepon=FALSE;
- pp->linestart_resp = ptr+1; /* advance pointer */
+ buf[n] = 0; /* zero terminate */
+ keepon = FALSE;
+ pp->linestart_resp = ptr + 1; /* advance pointer */
i++; /* skip this before getting out */
*size = pp->nread_resp; /* size of the response */
pp->nread_resp = 0; /* restart */
break;
}
- perline=0; /* line starts over here */
- pp->linestart_resp = ptr+1;
+ perline = 0; /* line starts over here */
+ pp->linestart_resp = ptr + 1;
}
}
@@ -490,9 +497,9 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp)
}
else {
free(pp->sendthis);
- pp->sendthis=NULL;
+ pp->sendthis = NULL;
pp->sendleft = pp->sendsize = 0;
- pp->response = Curl_tvnow();
+ pp->response = Curl_now();
}
return CURLE_OK;
}
diff --git a/lib/pingpong.h b/lib/pingpong.h
index a2c8ff5..5ac8df8 100644
--- a/lib/pingpong.h
+++ b/lib/pingpong.h
@@ -58,8 +58,8 @@ struct pingpong {
server */
size_t sendleft; /* number of bytes left to send from the sendthis buffer */
size_t sendsize; /* total size of the sendthis buffer */
- struct curltime response; /* set to Curl_tvnow() when a command has been sent
- off, used to time-out response reading */
+ struct curltime response; /* set to Curl_now() when a command has been sent
+ off, used to time-out response reading */
long response_time; /* When no timeout is given, this is the amount of
milliseconds we await for a server response. */
diff --git a/lib/progress.c b/lib/progress.c
index 740ff28..72c518a 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -134,7 +134,7 @@ int Curl_pgrsDone(struct connectdata *conn)
{
int rc;
struct Curl_easy *data = conn->data;
- data->progress.lastshow=0;
+ data->progress.lastshow = 0;
rc = Curl_pgrsUpdate(conn); /* the final (forced) update */
if(rc)
return rc;
@@ -149,14 +149,9 @@ int Curl_pgrsDone(struct connectdata *conn)
return 0;
}
-/* reset all times except redirect, and reset the known transfer sizes */
-void Curl_pgrsResetTimesSizes(struct Curl_easy *data)
+/* reset the known transfer sizes */
+void Curl_pgrsResetTransferSizes(struct Curl_easy *data)
{
- data->progress.t_nslookup = 0;
- data->progress.t_connect = 0;
- data->progress.t_pretransfer = 0;
- data->progress.t_starttransfer = 0;
-
Curl_pgrsSetDownloadSize(data, -1);
Curl_pgrsSetUploadSize(data, -1);
}
@@ -166,7 +161,7 @@ void Curl_pgrsResetTimesSizes(struct Curl_easy *data)
*/
void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
{
- struct curltime now = Curl_tvnow();
+ struct curltime now = Curl_now();
time_t *delta = NULL;
switch(timer) {
@@ -181,6 +176,7 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
case TIMER_STARTSINGLE:
/* This is set at the start of each single fetch */
data->progress.t_startsingle = now;
+ data->progress.is_t_startransfer_set = false;
break;
case TIMER_STARTACCEPT:
data->progress.t_acceptdata = now;
@@ -205,31 +201,33 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
* This prevents repeated invocations of the function from incorrectly
* changing the t_starttransfer time.
*/
- if (*delta > data->progress.t_redirect) {
+ if(data->progress.is_t_startransfer_set) {
return;
}
else {
+ data->progress.is_t_startransfer_set = true;
break;
}
case TIMER_POSTRANSFER:
/* this is the normal end-of-transfer thing */
break;
case TIMER_REDIRECT:
- data->progress.t_redirect = Curl_tvdiff_us(now, data->progress.start);
+ data->progress.t_redirect = Curl_timediff_us(now, data->progress.start);
break;
}
if(delta) {
- time_t us = Curl_tvdiff_us(now, data->progress.t_startsingle);
- if(!us)
- us++; /* make sure at least one microsecond passed */
- *delta = us;
+ timediff_t us = Curl_timediff_us(now, data->progress.t_startsingle);
+ if(us < 1)
+ us = 1; /* make sure at least one microsecond passed */
+ *delta += us;
}
}
void Curl_pgrsStartNow(struct Curl_easy *data)
{
data->progress.speeder_c = 0; /* reset the progress meter display */
- data->progress.start = Curl_tvnow();
+ data->progress.start = Curl_now();
+ data->progress.is_t_startransfer_set = false;
data->progress.ul_limit_start.tv_sec = 0;
data->progress.ul_limit_start.tv_usec = 0;
data->progress.dl_limit_start.tv_sec = 0;
@@ -276,7 +274,7 @@ long Curl_pgrsLimitWaitTime(curl_off_t cursize,
return -1;
minimum = (time_t) (CURL_OFF_T_C(1000) * size / limit);
- actual = Curl_tvdiff(now, start);
+ actual = Curl_timediff(now, start);
if(actual < minimum)
/* this is a conversion on some systems (64bit time_t => 32bit long) */
@@ -287,7 +285,7 @@ long Curl_pgrsLimitWaitTime(curl_off_t cursize,
void Curl_pgrsSetDownloadCounter(struct Curl_easy *data, curl_off_t size)
{
- struct curltime now = Curl_tvnow();
+ struct curltime now = Curl_now();
data->progress.downloaded = size;
@@ -305,7 +303,7 @@ void Curl_pgrsSetDownloadCounter(struct Curl_easy *data, curl_off_t size)
void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size)
{
- struct curltime now = Curl_tvnow();
+ struct curltime now = Curl_now();
data->progress.uploaded = size;
@@ -354,9 +352,9 @@ int Curl_pgrsUpdate(struct connectdata *conn)
struct curltime now;
int result;
char max5[6][10];
- curl_off_t dlpercen=0;
- curl_off_t ulpercen=0;
- curl_off_t total_percen=0;
+ curl_off_t dlpercen = 0;
+ curl_off_t ulpercen = 0;
+ curl_off_t total_percen = 0;
curl_off_t total_transfer;
curl_off_t total_expected_transfer;
curl_off_t timespent;
@@ -367,15 +365,15 @@ int Curl_pgrsUpdate(struct connectdata *conn)
char time_left[10];
char time_total[10];
char time_spent[10];
- curl_off_t ulestimate=0;
- curl_off_t dlestimate=0;
+ curl_off_t ulestimate = 0;
+ curl_off_t dlestimate = 0;
curl_off_t total_estimate;
- bool shownow=FALSE;
+ bool shownow = FALSE;
- now = Curl_tvnow(); /* what time is it */
+ now = Curl_now(); /* what time is it */
/* The time spent so far (from the start) */
- data->progress.timespent = Curl_tvdiff_us(now, data->progress.start);
+ data->progress.timespent = Curl_timediff_us(now, data->progress.start);
timespent = (curl_off_t)data->progress.timespent/1000000; /* seconds */
/* The average download speed this far */
@@ -410,24 +408,24 @@ int Curl_pgrsUpdate(struct connectdata *conn)
array. With N_ENTRIES filled in, we have about N_ENTRIES-1 seconds of
transfer. Imagine, after one second we have filled in two entries,
after two seconds we've filled in three entries etc. */
- countindex = ((data->progress.speeder_c>=CURR_TIME)?
+ countindex = ((data->progress.speeder_c >= CURR_TIME)?
CURR_TIME:data->progress.speeder_c) - 1;
/* first of all, we don't do this if there's no counted seconds yet */
if(countindex) {
- time_t span_ms;
+ timediff_t span_ms;
/* Get the index position to compare with the 'nowindex' position.
Get the oldest entry possible. While we have less than CURR_TIME
entries, the first entry will remain the oldest. */
- checkindex = (data->progress.speeder_c>=CURR_TIME)?
+ checkindex = (data->progress.speeder_c >= CURR_TIME)?
data->progress.speeder_c%CURR_TIME:0;
/* Figure out the exact time for the time span */
- span_ms = Curl_tvdiff(now,
- data->progress.speeder_time[checkindex]);
+ span_ms = Curl_timediff(now,
+ data->progress.speeder_time[checkindex]);
if(0 == span_ms)
- span_ms=1; /* at least one millisecond MUST have passed */
+ span_ms = 1; /* at least one millisecond MUST have passed */
/* Calculate the average speed the last 'span_ms' milliseconds */
{
@@ -457,22 +455,22 @@ int Curl_pgrsUpdate(struct connectdata *conn)
if(data->set.fxferinfo) {
/* There's a callback set, call that */
- result= data->set.fxferinfo(data->set.progress_client,
- data->progress.size_dl,
- data->progress.downloaded,
- data->progress.size_ul,
- data->progress.uploaded);
+ result = data->set.fxferinfo(data->set.progress_client,
+ data->progress.size_dl,
+ data->progress.downloaded,
+ data->progress.size_ul,
+ data->progress.uploaded);
if(result)
failf(data, "Callback aborted");
return result;
}
if(data->set.fprogress) {
/* The older deprecated callback is set, call that */
- result= data->set.fprogress(data->set.progress_client,
- (double)data->progress.size_dl,
- (double)data->progress.downloaded,
- (double)data->progress.size_ul,
- (double)data->progress.uploaded);
+ result = data->set.fprogress(data->set.progress_client,
+ (double)data->progress.size_dl,
+ (double)data->progress.downloaded,
+ (double)data->progress.size_ul,
+ (double)data->progress.uploaded);
if(result)
failf(data, "Callback aborted");
return result;
diff --git a/lib/progress.h b/lib/progress.h
index ed57e33..9333ab2 100644
--- a/lib/progress.h
+++ b/lib/progress.h
@@ -47,7 +47,7 @@ void Curl_pgrsSetUploadSize(struct Curl_easy *data, curl_off_t size);
void Curl_pgrsSetDownloadCounter(struct Curl_easy *data, curl_off_t size);
void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size);
int Curl_pgrsUpdate(struct connectdata *);
-void Curl_pgrsResetTimesSizes(struct Curl_easy *data);
+void Curl_pgrsResetTransferSizes(struct Curl_easy *data);
void Curl_pgrsTime(struct Curl_easy *data, timerid timer);
long Curl_pgrsLimitWaitTime(curl_off_t cursize,
curl_off_t startsize,
diff --git a/lib/rand.c b/lib/rand.c
index 2713a0a..2670af9 100644
--- a/lib/rand.c
+++ b/lib/rand.c
@@ -86,7 +86,7 @@ static CURLcode randit(struct Curl_easy *data, unsigned int *rnd)
#endif
if(!seeded) {
- struct curltime now = curlx_tvnow();
+ struct curltime now = Curl_now();
infof(data, "WARNING: Using weak random seed\n");
randseed += (unsigned int)now.tv_usec + (unsigned int)now.tv_sec;
randseed = randseed * 1103515245 + 12345;
diff --git a/lib/rtsp.c b/lib/rtsp.c
index 9bd935f..925da2c 100644
--- a/lib/rtsp.c
+++ b/lib/rtsp.c
@@ -250,7 +250,7 @@ static CURLcode rtsp_done(struct connectdata *conn,
static CURLcode rtsp_do(struct connectdata *conn, bool *done)
{
struct Curl_easy *data = conn->data;
- CURLcode result=CURLE_OK;
+ CURLcode result = CURLE_OK;
Curl_RtspReq rtspreq = data->set.rtspreq;
struct RTSP *rtsp = data->req.protop;
struct HTTP *http;
@@ -749,14 +749,28 @@ CURLcode rtp_client_write(struct connectdata *conn, char *ptr, size_t len)
struct Curl_easy *data = conn->data;
size_t wrote;
curl_write_callback writeit;
+ void *user_ptr;
if(len == 0) {
failf(data, "Cannot write a 0 size RTP packet.");
return CURLE_WRITE_ERROR;
}
- writeit = data->set.fwrite_rtp?data->set.fwrite_rtp:data->set.fwrite_func;
- wrote = writeit(ptr, 1, len, data->set.rtp_out);
+ /* If the user has configured CURLOPT_INTERLEAVEFUNCTION then use that
+ function and any configured CURLOPT_INTERLEAVEDATA to write out the RTP
+ data. Otherwise, use the CURLOPT_WRITEFUNCTION with the CURLOPT_WRITEDATA
+ pointer to write out the RTP data. */
+ if(data->set.fwrite_rtp) {
+ writeit = data->set.fwrite_rtp;
+ user_ptr = data->set.rtp_out;
+ }
+ else
+ {
+ writeit = data->set.fwrite_func;
+ user_ptr = data->set.out;
+ }
+
+ wrote = writeit(ptr, 1, len, user_ptr);
if(CURL_WRITEFUNC_PAUSE == wrote) {
failf(data, "Cannot pause RTP");
diff --git a/lib/security.c b/lib/security.c
index f4a8763..9b98968 100644
--- a/lib/security.c
+++ b/lib/security.c
@@ -7,7 +7,7 @@
* rewrite to work around the paragraph 2 in the BSD licenses as explained
* below.
*
- * Copyright (c) 1998, 1999 Kungliga Tekniska Högskolan
+ * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
*
* Copyright (C) 2001 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
@@ -115,7 +115,7 @@ static char level_to_char(int level)
static int ftp_send_command(struct connectdata *conn, const char *message, ...)
{
int ftp_code;
- ssize_t nread=0;
+ ssize_t nread = 0;
va_list args;
char print_buffer[50];
diff --git a/lib/select.c b/lib/select.c
index f6fecaf..28390a4 100644
--- a/lib/select.c
+++ b/lib/select.c
@@ -51,7 +51,7 @@
#include "warnless.h"
/* Convenience local macros */
-#define ELAPSED_MS() (int)curlx_tvdiff(curlx_tvnow(), initial_tv)
+#define ELAPSED_MS() (int)Curl_timediff(Curl_now(), initial_tv)
int Curl_ack_eintr = 0;
#define ERROR_NOT_EINTR(error) (Curl_ack_eintr || error != EINTR)
@@ -96,7 +96,7 @@ int Curl_wait_ms(int timeout_ms)
Sleep(timeout_ms);
#else
pending_ms = timeout_ms;
- initial_tv = curlx_tvnow();
+ initial_tv = Curl_now();
do {
#if defined(HAVE_POLL_FINE)
r = poll(NULL, 0, pending_ms);
@@ -177,14 +177,14 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
return r;
}
- /* Avoid initial timestamp, avoid curlx_tvnow() call, when elapsed
+ /* Avoid initial timestamp, avoid Curl_now() call, when elapsed
time in this function does not need to be measured. This happens
when function is called with a zero timeout or a negative timeout
value indicating a blocking call should be performed. */
if(timeout_ms > 0) {
pending_ms = (int)timeout_ms;
- initial_tv = curlx_tvnow();
+ initial_tv = Curl_now();
}
#ifdef HAVE_POLL_FINE
@@ -418,14 +418,14 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
return r;
}
- /* Avoid initial timestamp, avoid curlx_tvnow() call, when elapsed
+ /* Avoid initial timestamp, avoid Curl_now() call, when elapsed
time in this function does not need to be measured. This happens
when function is called with a zero timeout or a negative timeout
value indicating a blocking call should be performed. */
if(timeout_ms > 0) {
pending_ms = timeout_ms;
- initial_tv = curlx_tvnow();
+ initial_tv = Curl_now();
}
#ifdef HAVE_POLL_FINE
diff --git a/lib/sendf.c b/lib/sendf.c
index 595c361..a1cb8e4 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -22,6 +22,10 @@
#include "curl_setup.h"
+#ifdef HAVE_LINUX_TCP_H
+#include <linux/tcp.h>
+#endif
+
#include <curl/curl.h>
#include "urldata.h"
@@ -63,7 +67,7 @@ static size_t convert_lineends(struct Curl_easy *data,
if(*startPtr == '\n') {
/* This block of incoming data starts with the
previous block's LF so get rid of it */
- memmove(startPtr, startPtr+1, size-1);
+ memmove(startPtr, startPtr + 1, size-1);
size--;
/* and it wasn't a bare CR but a CRLF conversion instead */
data->state.crlf_conversions++;
@@ -75,7 +79,7 @@ static size_t convert_lineends(struct Curl_easy *data,
inPtr = outPtr = memchr(startPtr, '\r', size);
if(inPtr) {
/* at least one CR, now look for CRLF */
- while(inPtr < (startPtr+size-1)) {
+ while(inPtr < (startPtr + size-1)) {
/* note that it's size-1, so we'll never look past the last byte */
if(memcmp(inPtr, "\r\n", 2) == 0) {
/* CRLF found, bump past the CR and copy the NL */
@@ -98,7 +102,7 @@ static size_t convert_lineends(struct Curl_easy *data,
inPtr++;
} /* end of while loop */
- if(inPtr < startPtr+size) {
+ if(inPtr < startPtr + size) {
/* handle last byte */
if(*inPtr == '\r') {
/* deal with a CR at the end of the buffer */
@@ -112,7 +116,7 @@ static size_t convert_lineends(struct Curl_easy *data,
}
outPtr++;
}
- if(outPtr < startPtr+size)
+ if(outPtr < startPtr + size)
/* tidy up by null terminating the now shorter data */
*outPtr = '\0';
@@ -241,25 +245,25 @@ void Curl_infof(struct Curl_easy *data, const char *fmt, ...)
void Curl_failf(struct Curl_easy *data, const char *fmt, ...)
{
- va_list ap;
- size_t len;
- char error[CURL_ERROR_SIZE + 2];
- va_start(ap, fmt);
-
- vsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
- len = strlen(error);
+ if(data->set.verbose || data->set.errorbuffer) {
+ va_list ap;
+ size_t len;
+ char error[CURL_ERROR_SIZE + 2];
+ va_start(ap, fmt);
+ vsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
+ len = strlen(error);
- if(data->set.errorbuffer && !data->state.errorbuf) {
- strcpy(data->set.errorbuffer, error);
- data->state.errorbuf = TRUE; /* wrote error string */
- }
- if(data->set.verbose) {
- error[len] = '\n';
- error[++len] = '\0';
- Curl_debug(data, CURLINFO_TEXT, error, len, NULL);
+ if(data->set.errorbuffer && !data->state.errorbuf) {
+ strcpy(data->set.errorbuffer, error);
+ data->state.errorbuf = TRUE; /* wrote error string */
+ }
+ if(data->set.verbose) {
+ error[len] = '\n';
+ error[++len] = '\0';
+ Curl_debug(data, CURLINFO_TEXT, error, len, NULL);
+ }
+ va_end(ap);
}
-
- va_end(ap);
}
/* Curl_sendf() sends formatted data to the server */
@@ -279,7 +283,7 @@ CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn,
if(!s)
return CURLE_OUT_OF_MEMORY; /* failure */
- bytes_written=0;
+ bytes_written = 0;
write_len = strlen(s);
sptr = s;
@@ -360,7 +364,7 @@ ssize_t Curl_send_plain(struct connectdata *conn, int num,
available. */
pre_receive_plain(conn, num);
-#ifdef MSG_FASTOPEN /* Linux */
+#if defined(MSG_FASTOPEN) && !defined(TCP_FASTOPEN_CONNECT) /* Linux */
if(conn->bits.tcp_fastopen) {
bytes_written = sendto(sockfd, mem, len, MSG_FASTOPEN,
conn->ip_addr->ai_addr, conn->ip_addr->ai_addrlen);
@@ -387,7 +391,7 @@ ssize_t Curl_send_plain(struct connectdata *conn, int num,
#endif
) {
/* this is just a case of EWOULDBLOCK */
- bytes_written=0;
+ bytes_written = 0;
*code = CURLE_AGAIN;
}
else {
@@ -480,7 +484,7 @@ static CURLcode pausewrite(struct Curl_easy *data,
bool newtype = TRUE;
if(s->tempcount) {
- for(i=0; i< s->tempcount; i++) {
+ for(i = 0; i< s->tempcount; i++) {
if(s->tempwrite[i].type == type) {
/* data for this type exists */
newtype = FALSE;
@@ -704,7 +708,7 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */
us use the correct ssl handle. */
int num = (sockfd == conn->sock[SECONDARYSOCKET]);
- *n=0; /* reset amount to zero */
+ *n = 0; /* reset amount to zero */
/* If session can pipeline, check connection buffer */
if(pipelining) {
@@ -823,8 +827,8 @@ int Curl_debug(struct Curl_easy *data, curl_infotype type,
int rc;
if(data->set.printhost && conn && conn->host.dispname) {
char buffer[160];
- const char *t=NULL;
- const char *w="Data";
+ const char *t = NULL;
+ const char *w = "Data";
switch(type) {
case CURLINFO_HEADER_IN:
w = "Header";
diff --git a/lib/setopt.c b/lib/setopt.c
new file mode 100644
index 0000000..70466bf
--- /dev/null
+++ b/lib/setopt.c
@@ -0,0 +1,2554 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifdef HAVE_LINUX_TCP_H
+#include <linux/tcp.h>
+#endif
+
+#include "urldata.h"
+#include "url.h"
+#include "progress.h"
+#include "content_encoding.h"
+#include "strcase.h"
+#include "share.h"
+#include "vtls/vtls.h"
+#include "warnless.h"
+#include "sendf.h"
+#include "http2.h"
+#include "setopt.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+CURLcode Curl_setstropt(char **charp, const char *s)
+{
+ /* Release the previous storage at `charp' and replace by a dynamic storage
+ copy of `s'. Return CURLE_OK or CURLE_OUT_OF_MEMORY. */
+
+ Curl_safefree(*charp);
+
+ if(s) {
+ char *str = strdup(s);
+
+ if(!str)
+ return CURLE_OUT_OF_MEMORY;
+
+ *charp = str;
+ }
+
+ return CURLE_OK;
+}
+
+static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
+{
+ CURLcode result = CURLE_OK;
+ char *user = NULL;
+ char *passwd = NULL;
+
+ /* Parse the login details if specified. It not then we treat NULL as a hint
+ to clear the existing data */
+ if(option) {
+ result = Curl_parse_login_details(option, strlen(option),
+ (userp ? &user : NULL),
+ (passwdp ? &passwd : NULL),
+ NULL);
+ }
+
+ if(!result) {
+ /* Store the username part of option if required */
+ if(userp) {
+ if(!user && option && option[0] == ':') {
+ /* Allocate an empty string instead of returning NULL as user name */
+ user = strdup("");
+ if(!user)
+ result = CURLE_OUT_OF_MEMORY;
+ }
+
+ Curl_safefree(*userp);
+ *userp = user;
+ }
+
+ /* Store the password part of option if required */
+ if(passwdp) {
+ Curl_safefree(*passwdp);
+ *passwdp = passwd;
+ }
+ }
+
+ return result;
+}
+
+#define C_SSLVERSION_VALUE(x) (x & 0xffff)
+#define C_SSLVERSION_MAX_VALUE(x) (x & 0xffff0000)
+
+static CURLcode setopt(struct Curl_easy *data, CURLoption option,
+ va_list param)
+{
+ char *argptr;
+ CURLcode result = CURLE_OK;
+ long arg;
+ curl_off_t bigsize;
+
+ switch(option) {
+ case CURLOPT_DNS_CACHE_TIMEOUT:
+ arg = va_arg(param, long);
+ if(arg < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.dns_cache_timeout = arg;
+ break;
+ case CURLOPT_DNS_USE_GLOBAL_CACHE:
+ /* remember we want this enabled */
+ arg = va_arg(param, long);
+ data->set.global_dns_cache = (0 != arg) ? TRUE : FALSE;
+ break;
+ case CURLOPT_SSL_CIPHER_LIST:
+ /* set a list of cipher we want to use in the SSL connection */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_ORIG],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXY_SSL_CIPHER_LIST:
+ /* set a list of cipher we want to use in the SSL connection for proxy */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_PROXY],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_RANDOM_FILE:
+ /*
+ * This is the path name to a file that contains random data to seed
+ * the random SSL stuff with. The file is only used for reading.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_RANDOM_FILE],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_EGDSOCKET:
+ /*
+ * The Entropy Gathering Daemon socket pathname
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_EGDSOCKET],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_MAXCONNECTS:
+ /*
+ * Set the absolute number of maximum simultaneous alive connection that
+ * libcurl is allowed to have.
+ */
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.maxconnects = arg;
+ break;
+ case CURLOPT_FORBID_REUSE:
+ /*
+ * When this transfer is done, it must not be left to be reused by a
+ * subsequent transfer but shall be closed immediately.
+ */
+ data->set.reuse_forbid = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_FRESH_CONNECT:
+ /*
+ * This transfer shall not use a previously cached connection but
+ * should be made with a fresh new connect!
+ */
+ data->set.reuse_fresh = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_VERBOSE:
+ /*
+ * Verbose means infof() calls that give a lot of information about
+ * the connection and transfer procedures as well as internal choices.
+ */
+ data->set.verbose = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_HEADER:
+ /*
+ * Set to include the header in the general data output stream.
+ */
+ data->set.include_header = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_NOPROGRESS:
+ /*
+ * Shut off the internal supported progress meter
+ */
+ data->set.hide_progress = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ if(data->set.hide_progress)
+ data->progress.flags |= PGRS_HIDE;
+ else
+ data->progress.flags &= ~PGRS_HIDE;
+ break;
+ case CURLOPT_NOBODY:
+ /*
+ * Do not include the body part in the output data stream.
+ */
+ data->set.opt_no_body = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_FAILONERROR:
+ /*
+ * Don't output the >=400 error code HTML-page, but instead only
+ * return error.
+ */
+ data->set.http_fail_on_error = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_KEEP_SENDING_ON_ERROR:
+ data->set.http_keep_sending_on_error = (0 != va_arg(param, long)) ?
+ TRUE : FALSE;
+ break;
+ case CURLOPT_UPLOAD:
+ case CURLOPT_PUT:
+ /*
+ * We want to sent data to the remote host. If this is HTTP, that equals
+ * using the PUT request.
+ */
+ data->set.upload = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ if(data->set.upload) {
+ /* If this is HTTP, PUT is what's needed to "upload" */
+ data->set.httpreq = HTTPREQ_PUT;
+ data->set.opt_no_body = FALSE; /* this is implied */
+ }
+ else
+ /* In HTTP, the opposite of upload is GET (unless NOBODY is true as
+ then this can be changed to HEAD later on) */
+ data->set.httpreq = HTTPREQ_GET;
+ break;
+ case CURLOPT_REQUEST_TARGET:
+ result = Curl_setstropt(&data->set.str[STRING_TARGET],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_FILETIME:
+ /*
+ * Try to get the file time of the remote document. The time will
+ * later (possibly) become available using curl_easy_getinfo().
+ */
+ data->set.get_filetime = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_FTP_CREATE_MISSING_DIRS:
+ /*
+ * An FTP option that modifies an upload to create missing directories on
+ * the server.
+ */
+ switch(va_arg(param, long)) {
+ case 0:
+ data->set.ftp_create_missing_dirs = 0;
+ break;
+ case 1:
+ data->set.ftp_create_missing_dirs = 1;
+ break;
+ case 2:
+ data->set.ftp_create_missing_dirs = 2;
+ break;
+ default:
+ /* reserve other values for future use */
+ result = CURLE_UNKNOWN_OPTION;
+ break;
+ }
+ break;
+ case CURLOPT_SERVER_RESPONSE_TIMEOUT:
+ /*
+ * Option that specifies how quickly an server response must be obtained
+ * before it is considered failure. For pingpong protocols.
+ */
+ arg = va_arg(param, long);
+ if((arg >= 0) && (arg < (INT_MAX/1000)))
+ data->set.server_response_timeout = arg * 1000;
+ else
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ break;
+ case CURLOPT_TFTP_NO_OPTIONS:
+ /*
+ * Option that prevents libcurl from sending TFTP option requests to the
+ * server.
+ */
+ data->set.tftp_no_options = va_arg(param, long) != 0;
+ break;
+ case CURLOPT_TFTP_BLKSIZE:
+ /*
+ * TFTP option that specifies the block size to use for data transmission.
+ */
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.tftp_blksize = arg;
+ break;
+ case CURLOPT_DIRLISTONLY:
+ /*
+ * An option that changes the command to one that asks for a list
+ * only, no file info details.
+ */
+ data->set.ftp_list_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_APPEND:
+ /*
+ * We want to upload and append to an existing file.
+ */
+ data->set.ftp_append = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_FTP_FILEMETHOD:
+ /*
+ * How do access files over FTP.
+ */
+ arg = va_arg(param, long);
+ if((arg < CURLFTPMETHOD_DEFAULT) || (arg > CURLFTPMETHOD_SINGLECWD))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.ftp_filemethod = (curl_ftpfile)arg;
+ break;
+ case CURLOPT_NETRC:
+ /*
+ * Parse the $HOME/.netrc file
+ */
+ arg = va_arg(param, long);
+ if((arg < CURL_NETRC_IGNORED) || (arg > CURL_NETRC_REQUIRED))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.use_netrc = (enum CURL_NETRC_OPTION)arg;
+ break;
+ case CURLOPT_NETRC_FILE:
+ /*
+ * Use this file instead of the $HOME/.netrc file
+ */
+ result = Curl_setstropt(&data->set.str[STRING_NETRC_FILE],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_TRANSFERTEXT:
+ /*
+ * This option was previously named 'FTPASCII'. Renamed to work with
+ * more protocols than merely FTP.
+ *
+ * Transfer using ASCII (instead of BINARY).
+ */
+ data->set.prefer_ascii = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_TIMECONDITION:
+ /*
+ * Set HTTP time condition. This must be one of the defines in the
+ * curl/curl.h header file.
+ */
+ arg = va_arg(param, long);
+ if((arg < CURL_TIMECOND_NONE) || (arg > CURL_TIMECOND_LASTMOD))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.timecondition = (curl_TimeCond)arg;
+ break;
+ case CURLOPT_TIMEVALUE:
+ /*
+ * This is the value to compare with the remote document with the
+ * method set with CURLOPT_TIMECONDITION
+ */
+ data->set.timevalue = (time_t)va_arg(param, long);
+ break;
+ case CURLOPT_SSLVERSION:
+ /*
+ * Set explicit SSL version to try to connect with, as some SSL
+ * implementations are lame.
+ */
+#ifdef USE_SSL
+ arg = va_arg(param, long);
+ if((arg < CURL_SSLVERSION_DEFAULT) || (arg > CURL_SSLVERSION_TLSv1_3))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.ssl.primary.version = C_SSLVERSION_VALUE(arg);
+ data->set.ssl.primary.version_max = C_SSLVERSION_MAX_VALUE(arg);
+#else
+ result = CURLE_UNKNOWN_OPTION;
+#endif
+ break;
+ case CURLOPT_PROXY_SSLVERSION:
+ /*
+ * Set explicit SSL version to try to connect with for proxy, as some SSL
+ * implementations are lame.
+ */
+#ifdef USE_SSL
+ arg = va_arg(param, long);
+ if((arg < CURL_SSLVERSION_DEFAULT) || (arg > CURL_SSLVERSION_TLSv1_3))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.proxy_ssl.primary.version = C_SSLVERSION_VALUE(arg);
+ data->set.proxy_ssl.primary.version_max = C_SSLVERSION_MAX_VALUE(arg);
+#else
+ result = CURLE_UNKNOWN_OPTION;
+#endif
+ break;
+
+#ifndef CURL_DISABLE_HTTP
+ case CURLOPT_AUTOREFERER:
+ /*
+ * Switch on automatic referer that gets set if curl follows locations.
+ */
+ data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_ACCEPT_ENCODING:
+ /*
+ * String to use at the value of Accept-Encoding header.
+ *
+ * If the encoding is set to "" we use an Accept-Encoding header that
+ * encompasses all the encodings we support.
+ * If the encoding is set to NULL we don't send an Accept-Encoding header
+ * and ignore an received Content-Encoding header.
+ *
+ */
+ argptr = va_arg(param, char *);
+ if(argptr && !*argptr) {
+ argptr = Curl_all_content_encodings();
+ if(!argptr)
+ result = CURLE_OUT_OF_MEMORY;
+ else {
+ result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
+ free(argptr);
+ }
+ }
+ else
+ result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
+ break;
+
+ case CURLOPT_TRANSFER_ENCODING:
+ data->set.http_transfer_encoding = (0 != va_arg(param, long)) ?
+ TRUE : FALSE;
+ break;
+
+ case CURLOPT_FOLLOWLOCATION:
+ /*
+ * Follow Location: header hints on a HTTP-server.
+ */
+ data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_UNRESTRICTED_AUTH:
+ /*
+ * Send authentication (user+password) when following locations, even when
+ * hostname changed.
+ */
+ data->set.http_disable_hostname_check_before_authentication =
+ (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_MAXREDIRS:
+ /*
+ * The maximum amount of hops you allow curl to follow Location:
+ * headers. This should mostly be used to detect never-ending loops.
+ */
+ arg = va_arg(param, long);
+ if(arg < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.maxredirs = arg;
+ break;
+
+ case CURLOPT_POSTREDIR:
+ /*
+ * Set the behaviour of POST when redirecting
+ * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302
+ * CURL_REDIR_POST_301 - POST is kept as POST after 301
+ * CURL_REDIR_POST_302 - POST is kept as POST after 302
+ * CURL_REDIR_POST_303 - POST is kept as POST after 303
+ * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
+ * other - POST is kept as POST after 301 and 302
+ */
+ arg = va_arg(param, long);
+ if(arg < CURL_REDIR_GET_ALL)
+ /* no return error on too high numbers since the bitmask could be
+ extended in a future */
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.keep_post = arg & CURL_REDIR_POST_ALL;
+ break;
+
+ case CURLOPT_POST:
+ /* Does this option serve a purpose anymore? Yes it does, when
+ CURLOPT_POSTFIELDS isn't used and the POST data is read off the
+ callback! */
+ if(va_arg(param, long)) {
+ data->set.httpreq = HTTPREQ_POST;
+ data->set.opt_no_body = FALSE; /* this is implied */
+ }
+ else
+ data->set.httpreq = HTTPREQ_GET;
+ break;
+
+ case CURLOPT_COPYPOSTFIELDS:
+ /*
+ * A string with POST data. Makes curl HTTP POST. Even if it is NULL.
+ * If needed, CURLOPT_POSTFIELDSIZE must have been set prior to
+ * CURLOPT_COPYPOSTFIELDS and not altered later.
+ */
+ argptr = va_arg(param, char *);
+
+ if(!argptr || data->set.postfieldsize == -1)
+ result = Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], argptr);
+ else {
+ /*
+ * Check that requested length does not overflow the size_t type.
+ */
+
+ if((data->set.postfieldsize < 0) ||
+ ((sizeof(curl_off_t) != sizeof(size_t)) &&
+ (data->set.postfieldsize > (curl_off_t)((size_t)-1))))
+ result = CURLE_OUT_OF_MEMORY;
+ else {
+ char *p;
+
+ (void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
+
+ /* Allocate even when size == 0. This satisfies the need of possible
+ later address compare to detect the COPYPOSTFIELDS mode, and
+ to mark that postfields is used rather than read function or
+ form data.
+ */
+ p = malloc((size_t)(data->set.postfieldsize?
+ data->set.postfieldsize:1));
+
+ if(!p)
+ result = CURLE_OUT_OF_MEMORY;
+ else {
+ if(data->set.postfieldsize)
+ memcpy(p, argptr, (size_t)data->set.postfieldsize);
+
+ data->set.str[STRING_COPYPOSTFIELDS] = p;
+ }
+ }
+ }
+
+ data->set.postfields = data->set.str[STRING_COPYPOSTFIELDS];
+ data->set.httpreq = HTTPREQ_POST;
+ break;
+
+ case CURLOPT_POSTFIELDS:
+ /*
+ * Like above, but use static data instead of copying it.
+ */
+ data->set.postfields = va_arg(param, void *);
+ /* Release old copied data. */
+ (void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
+ data->set.httpreq = HTTPREQ_POST;
+ break;
+
+ case CURLOPT_POSTFIELDSIZE:
+ /*
+ * The size of the POSTFIELD data to prevent libcurl to do strlen() to
+ * figure it out. Enables binary posts.
+ */
+ bigsize = va_arg(param, long);
+ if(bigsize < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ if(data->set.postfieldsize < bigsize &&
+ data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) {
+ /* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */
+ (void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
+ data->set.postfields = NULL;
+ }
+
+ data->set.postfieldsize = bigsize;
+ break;
+
+ case CURLOPT_POSTFIELDSIZE_LARGE:
+ /*
+ * The size of the POSTFIELD data to prevent libcurl to do strlen() to
+ * figure it out. Enables binary posts.
+ */
+ bigsize = va_arg(param, curl_off_t);
+ if(bigsize < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ if(data->set.postfieldsize < bigsize &&
+ data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) {
+ /* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */
+ (void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
+ data->set.postfields = NULL;
+ }
+
+ data->set.postfieldsize = bigsize;
+ break;
+
+ case CURLOPT_HTTPPOST:
+ /*
+ * Set to make us do HTTP POST
+ */
+ data->set.httppost = va_arg(param, struct curl_httppost *);
+ data->set.httpreq = HTTPREQ_POST_FORM;
+ data->set.opt_no_body = FALSE; /* this is implied */
+ break;
+#endif /* CURL_DISABLE_HTTP */
+
+ case CURLOPT_MIMEPOST:
+ /*
+ * Set to make us do MIME/form POST
+ */
+ result = Curl_mime_set_subparts(&data->set.mimepost,
+ va_arg(param, curl_mime *), FALSE);
+ if(!result) {
+ data->set.httpreq = HTTPREQ_POST_MIME;
+ data->set.opt_no_body = FALSE; /* this is implied */
+ }
+ break;
+
+ case CURLOPT_REFERER:
+ /*
+ * String to set in the HTTP Referer: field.
+ */
+ if(data->change.referer_alloc) {
+ Curl_safefree(data->change.referer);
+ data->change.referer_alloc = FALSE;
+ }
+ result = Curl_setstropt(&data->set.str[STRING_SET_REFERER],
+ va_arg(param, char *));
+ data->change.referer = data->set.str[STRING_SET_REFERER];
+ break;
+
+ case CURLOPT_USERAGENT:
+ /*
+ * String to use in the HTTP User-Agent field
+ */
+ result = Curl_setstropt(&data->set.str[STRING_USERAGENT],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_HTTPHEADER:
+ /*
+ * Set a list with HTTP headers to use (or replace internals with)
+ */
+ data->set.headers = va_arg(param, struct curl_slist *);
+ break;
+
+#ifndef CURL_DISABLE_HTTP
+ case CURLOPT_PROXYHEADER:
+ /*
+ * Set a list with proxy headers to use (or replace internals with)
+ *
+ * Since CURLOPT_HTTPHEADER was the only way to set HTTP headers for a
+ * long time we remain doing it this way until CURLOPT_PROXYHEADER is
+ * used. As soon as this option has been used, if set to anything but
+ * NULL, custom headers for proxies are only picked from this list.
+ *
+ * Set this option to NULL to restore the previous behavior.
+ */
+ data->set.proxyheaders = va_arg(param, struct curl_slist *);
+ break;
+
+ case CURLOPT_HEADEROPT:
+ /*
+ * Set header option.
+ */
+ arg = va_arg(param, long);
+ data->set.sep_headers = (arg & CURLHEADER_SEPARATE)? TRUE: FALSE;
+ break;
+
+ case CURLOPT_HTTP200ALIASES:
+ /*
+ * Set a list of aliases for HTTP 200 in response header
+ */
+ data->set.http200aliases = va_arg(param, struct curl_slist *);
+ break;
+
+#if !defined(CURL_DISABLE_COOKIES)
+ case CURLOPT_COOKIE:
+ /*
+ * Cookie string to send to the remote server in the request.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_COOKIE],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_COOKIEFILE:
+ /*
+ * Set cookie file to read and parse. Can be used multiple times.
+ */
+ argptr = (char *)va_arg(param, void *);
+ if(argptr) {
+ struct curl_slist *cl;
+ /* append the cookie file name to the list of file names, and deal with
+ them later */
+ cl = curl_slist_append(data->change.cookielist, argptr);
+ if(!cl) {
+ curl_slist_free_all(data->change.cookielist);
+ data->change.cookielist = NULL;
+ return CURLE_OUT_OF_MEMORY;
+ }
+ data->change.cookielist = cl; /* store the list for later use */
+ }
+ break;
+
+ case CURLOPT_COOKIEJAR:
+ /*
+ * Set cookie file name to dump all cookies to when we're done.
+ */
+ {
+ struct CookieInfo *newcookies;
+ result = Curl_setstropt(&data->set.str[STRING_COOKIEJAR],
+ va_arg(param, char *));
+
+ /*
+ * Activate the cookie parser. This may or may not already
+ * have been made.
+ */
+ newcookies = Curl_cookie_init(data, NULL, data->cookies,
+ data->set.cookiesession);
+ if(!newcookies)
+ result = CURLE_OUT_OF_MEMORY;
+ data->cookies = newcookies;
+ }
+ break;
+
+ case CURLOPT_COOKIESESSION:
+ /*
+ * Set this option to TRUE to start a new "cookie session". It will
+ * prevent the forthcoming read-cookies-from-file actions to accept
+ * cookies that are marked as being session cookies, as they belong to a
+ * previous session.
+ *
+ * In the original Netscape cookie spec, "session cookies" are cookies
+ * with no expire date set. RFC2109 describes the same action if no
+ * 'Max-Age' is set and RFC2965 includes the RFC2109 description and adds
+ * a 'Discard' action that can enforce the discard even for cookies that
+ * have a Max-Age.
+ *
+ * We run mostly with the original cookie spec, as hardly anyone implements
+ * anything else.
+ */
+ data->set.cookiesession = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_COOKIELIST:
+ argptr = va_arg(param, char *);
+
+ if(argptr == NULL)
+ break;
+
+ if(strcasecompare(argptr, "ALL")) {
+ /* clear all cookies */
+ Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
+ Curl_cookie_clearall(data->cookies);
+ Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
+ }
+ else if(strcasecompare(argptr, "SESS")) {
+ /* clear session cookies */
+ Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
+ Curl_cookie_clearsess(data->cookies);
+ Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
+ }
+ else if(strcasecompare(argptr, "FLUSH")) {
+ /* flush cookies to file, takes care of the locking */
+ Curl_flush_cookies(data, 0);
+ }
+ else if(strcasecompare(argptr, "RELOAD")) {
+ /* reload cookies from file */
+ Curl_cookie_loadfiles(data);
+ break;
+ }
+ else {
+ if(!data->cookies)
+ /* if cookie engine was not running, activate it */
+ data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE);
+
+ argptr = strdup(argptr);
+ if(!argptr || !data->cookies) {
+ result = CURLE_OUT_OF_MEMORY;
+ free(argptr);
+ }
+ else {
+ Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
+
+ if(checkprefix("Set-Cookie:", argptr))
+ /* HTTP Header format line */
+ Curl_cookie_add(data, data->cookies, TRUE, argptr + 11, NULL, NULL);
+
+ else
+ /* Netscape format line */
+ Curl_cookie_add(data, data->cookies, FALSE, argptr, NULL, NULL);
+
+ Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
+ free(argptr);
+ }
+ }
+
+ break;
+#endif /* !CURL_DISABLE_COOKIES */
+
+ case CURLOPT_HTTPGET:
+ /*
+ * Set to force us do HTTP GET
+ */
+ if(va_arg(param, long)) {
+ data->set.httpreq = HTTPREQ_GET;
+ data->set.upload = FALSE; /* switch off upload */
+ data->set.opt_no_body = FALSE; /* this is implied */
+ }
+ break;
+
+ case CURLOPT_HTTP_VERSION:
+ /*
+ * This sets a requested HTTP version to be used. The value is one of
+ * the listed enums in curl/curl.h.
+ */
+ arg = va_arg(param, long);
+ if(arg < CURL_HTTP_VERSION_NONE)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+#ifndef USE_NGHTTP2
+ if(arg >= CURL_HTTP_VERSION_2)
+ return CURLE_UNSUPPORTED_PROTOCOL;
+#else
+ if(arg > CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE)
+ return CURLE_UNSUPPORTED_PROTOCOL;
+#endif
+ data->set.httpversion = arg;
+ break;
+
+ case CURLOPT_EXPECT_100_TIMEOUT_MS:
+ /*
+ * Time to wait for a response to a HTTP request containing an
+ * Expect: 100-continue header before sending the data anyway.
+ */
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.expect_100_timeout = arg;
+ break;
+
+#endif /* CURL_DISABLE_HTTP */
+
+ case CURLOPT_HTTPAUTH:
+ /*
+ * Set HTTP Authentication type BITMASK.
+ */
+ {
+ int bitcheck;
+ bool authbits;
+ unsigned long auth = va_arg(param, unsigned long);
+
+ if(auth == CURLAUTH_NONE) {
+ data->set.httpauth = auth;
+ break;
+ }
+
+ /* the DIGEST_IE bit is only used to set a special marker, for all the
+ rest we need to handle it as normal DIGEST */
+ data->state.authhost.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE;
+
+ if(auth & CURLAUTH_DIGEST_IE) {
+ auth |= CURLAUTH_DIGEST; /* set standard digest bit */
+ auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */
+ }
+
+ /* switch off bits we can't support */
+#ifndef USE_NTLM
+ auth &= ~CURLAUTH_NTLM; /* no NTLM support */
+ auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
+#elif !defined(NTLM_WB_ENABLED)
+ auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
+#endif
+#ifndef USE_SPNEGO
+ auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without
+ GSS-API or SSPI */
+#endif
+
+ /* check if any auth bit lower than CURLAUTH_ONLY is still set */
+ bitcheck = 0;
+ authbits = FALSE;
+ while(bitcheck < 31) {
+ if(auth & (1UL << bitcheck++)) {
+ authbits = TRUE;
+ break;
+ }
+ }
+ if(!authbits)
+ return CURLE_NOT_BUILT_IN; /* no supported types left! */
+
+ data->set.httpauth = auth;
+ }
+ break;
+
+ case CURLOPT_CUSTOMREQUEST:
+ /*
+ * Set a custom string to use as request
+ */
+ result = Curl_setstropt(&data->set.str[STRING_CUSTOMREQUEST],
+ va_arg(param, char *));
+
+ /* we don't set
+ data->set.httpreq = HTTPREQ_CUSTOM;
+ here, we continue as if we were using the already set type
+ and this just changes the actual request keyword */
+ break;
+
+#ifndef CURL_DISABLE_PROXY
+ case CURLOPT_HTTPPROXYTUNNEL:
+ /*
+ * Tunnel operations through the proxy instead of normal proxy use
+ */
+ data->set.tunnel_thru_httpproxy = (0 != va_arg(param, long)) ?
+ TRUE : FALSE;
+ break;
+
+ case CURLOPT_PROXYPORT:
+ /*
+ * Explicitly set HTTP proxy port number.
+ */
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 65535))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.proxyport = arg;
+ break;
+
+ case CURLOPT_PROXYAUTH:
+ /*
+ * Set HTTP Authentication type BITMASK.
+ */
+ {
+ int bitcheck;
+ bool authbits;
+ unsigned long auth = va_arg(param, unsigned long);
+
+ if(auth == CURLAUTH_NONE) {
+ data->set.proxyauth = auth;
+ break;
+ }
+
+ /* the DIGEST_IE bit is only used to set a special marker, for all the
+ rest we need to handle it as normal DIGEST */
+ data->state.authproxy.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE;
+
+ if(auth & CURLAUTH_DIGEST_IE) {
+ auth |= CURLAUTH_DIGEST; /* set standard digest bit */
+ auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */
+ }
+ /* switch off bits we can't support */
+#ifndef USE_NTLM
+ auth &= ~CURLAUTH_NTLM; /* no NTLM support */
+ auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
+#elif !defined(NTLM_WB_ENABLED)
+ auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
+#endif
+#ifndef USE_SPNEGO
+ auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without
+ GSS-API or SSPI */
+#endif
+
+ /* check if any auth bit lower than CURLAUTH_ONLY is still set */
+ bitcheck = 0;
+ authbits = FALSE;
+ while(bitcheck < 31) {
+ if(auth & (1UL << bitcheck++)) {
+ authbits = TRUE;
+ break;
+ }
+ }
+ if(!authbits)
+ return CURLE_NOT_BUILT_IN; /* no supported types left! */
+
+ data->set.proxyauth = auth;
+ }
+ break;
+
+ case CURLOPT_PROXY:
+ /*
+ * Set proxy server:port to use as proxy.
+ *
+ * If the proxy is set to "" (and CURLOPT_SOCKS_PROXY is set to "" or NULL)
+ * we explicitly say that we don't want to use a proxy
+ * (even though there might be environment variables saying so).
+ *
+ * Setting it to NULL, means no proxy but allows the environment variables
+ * to decide for us (if CURLOPT_SOCKS_PROXY setting it to NULL).
+ */
+ result = Curl_setstropt(&data->set.str[STRING_PROXY],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_PRE_PROXY:
+ /*
+ * Set proxy server:port to use as SOCKS proxy.
+ *
+ * If the proxy is set to "" or NULL we explicitly say that we don't want
+ * to use the socks proxy.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_PRE_PROXY],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_PROXYTYPE:
+ /*
+ * Set proxy type. HTTP/HTTP_1_0/SOCKS4/SOCKS4a/SOCKS5/SOCKS5_HOSTNAME
+ */
+ arg = va_arg(param, long);
+ if((arg < CURLPROXY_HTTP) || (arg > CURLPROXY_SOCKS5_HOSTNAME))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.proxytype = (curl_proxytype)arg;
+ break;
+
+ case CURLOPT_PROXY_TRANSFER_MODE:
+ /*
+ * set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy
+ */
+ switch(va_arg(param, long)) {
+ case 0:
+ data->set.proxy_transfer_mode = FALSE;
+ break;
+ case 1:
+ data->set.proxy_transfer_mode = TRUE;
+ break;
+ default:
+ /* reserve other values for future use */
+ result = CURLE_UNKNOWN_OPTION;
+ break;
+ }
+ break;
+#endif /* CURL_DISABLE_PROXY */
+
+ case CURLOPT_SOCKS5_AUTH:
+ data->set.socks5auth = va_arg(param, unsigned long);
+ if(data->set.socks5auth & ~(CURLAUTH_BASIC | CURLAUTH_GSSAPI))
+ result = CURLE_NOT_BUILT_IN;
+ break;
+#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
+ case CURLOPT_SOCKS5_GSSAPI_NEC:
+ /*
+ * Set flag for NEC SOCK5 support
+ */
+ data->set.socks5_gssapi_nec = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_SOCKS5_GSSAPI_SERVICE:
+ case CURLOPT_PROXY_SERVICE_NAME:
+ /*
+ * Set proxy authentication service name for Kerberos 5 and SPNEGO
+ */
+ result = Curl_setstropt(&data->set.str[STRING_PROXY_SERVICE_NAME],
+ va_arg(param, char *));
+ break;
+#endif
+
+#if !defined(CURL_DISABLE_CRYPTO_AUTH) || defined(USE_KERBEROS5) || \
+ defined(USE_SPNEGO)
+ case CURLOPT_SERVICE_NAME:
+ /*
+ * Set authentication service name for DIGEST-MD5, Kerberos 5 and SPNEGO
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SERVICE_NAME],
+ va_arg(param, char *));
+ break;
+
+#endif
+
+ case CURLOPT_HEADERDATA:
+ /*
+ * Custom pointer to pass the header write callback function
+ */
+ data->set.writeheader = (void *)va_arg(param, void *);
+ break;
+ case CURLOPT_ERRORBUFFER:
+ /*
+ * Error buffer provided by the caller to get the human readable
+ * error string in.
+ */
+ data->set.errorbuffer = va_arg(param, char *);
+ break;
+ case CURLOPT_WRITEDATA:
+ /*
+ * FILE pointer to write to. Or possibly
+ * used as argument to the write callback.
+ */
+ data->set.out = va_arg(param, void *);
+ break;
+ case CURLOPT_FTPPORT:
+ /*
+ * Use FTP PORT, this also specifies which IP address to use
+ */
+ result = Curl_setstropt(&data->set.str[STRING_FTPPORT],
+ va_arg(param, char *));
+ data->set.ftp_use_port = (data->set.str[STRING_FTPPORT]) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_FTP_USE_EPRT:
+ data->set.ftp_use_eprt = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_FTP_USE_EPSV:
+ data->set.ftp_use_epsv = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_FTP_USE_PRET:
+ data->set.ftp_use_pret = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_FTP_SSL_CCC:
+ arg = va_arg(param, long);
+ if((arg < CURLFTPSSL_CCC_NONE) || (arg > CURLFTPSSL_CCC_ACTIVE))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.ftp_ccc = (curl_ftpccc)arg;
+ break;
+
+ case CURLOPT_FTP_SKIP_PASV_IP:
+ /*
+ * Enable or disable FTP_SKIP_PASV_IP, which will disable/enable the
+ * bypass of the IP address in PASV responses.
+ */
+ data->set.ftp_skip_ip = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_READDATA:
+ /*
+ * FILE pointer to read the file to be uploaded from. Or possibly
+ * used as argument to the read callback.
+ */
+ data->set.in_set = va_arg(param, void *);
+ break;
+ case CURLOPT_INFILESIZE:
+ /*
+ * If known, this should inform curl about the file size of the
+ * to-be-uploaded file.
+ */
+ arg = va_arg(param, long);
+ if(arg < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.filesize = arg;
+ break;
+ case CURLOPT_INFILESIZE_LARGE:
+ /*
+ * If known, this should inform curl about the file size of the
+ * to-be-uploaded file.
+ */
+ bigsize = va_arg(param, curl_off_t);
+ if(bigsize < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.filesize = bigsize;
+ break;
+ case CURLOPT_LOW_SPEED_LIMIT:
+ /*
+ * The low speed limit that if transfers are below this for
+ * CURLOPT_LOW_SPEED_TIME, the transfer is aborted.
+ */
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.low_speed_limit = arg;
+ break;
+ case CURLOPT_MAX_SEND_SPEED_LARGE:
+ /*
+ * When transfer uploads are faster then CURLOPT_MAX_SEND_SPEED_LARGE
+ * bytes per second the transfer is throttled..
+ */
+ bigsize = va_arg(param, curl_off_t);
+ if(bigsize < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.max_send_speed = bigsize;
+ break;
+ case CURLOPT_MAX_RECV_SPEED_LARGE:
+ /*
+ * When receiving data faster than CURLOPT_MAX_RECV_SPEED_LARGE bytes per
+ * second the transfer is throttled..
+ */
+ bigsize = va_arg(param, curl_off_t);
+ if(bigsize < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.max_recv_speed = bigsize;
+ break;
+ case CURLOPT_LOW_SPEED_TIME:
+ /*
+ * The low speed time that if transfers are below the set
+ * CURLOPT_LOW_SPEED_LIMIT during this time, the transfer is aborted.
+ */
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.low_speed_time = arg;
+ break;
+ case CURLOPT_URL:
+ /*
+ * The URL to fetch.
+ */
+ if(data->change.url_alloc) {
+ /* the already set URL is allocated, free it first! */
+ Curl_safefree(data->change.url);
+ data->change.url_alloc = FALSE;
+ }
+ result = Curl_setstropt(&data->set.str[STRING_SET_URL],
+ va_arg(param, char *));
+ data->change.url = data->set.str[STRING_SET_URL];
+ break;
+ case CURLOPT_PORT:
+ /*
+ * The port number to use when getting the URL
+ */
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 65535))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.use_port = arg;
+ break;
+ case CURLOPT_TIMEOUT:
+ /*
+ * The maximum time you allow curl to use for a single transfer
+ * operation.
+ */
+ arg = va_arg(param, long);
+ if((arg >= 0) && (arg < (INT_MAX/1000)))
+ data->set.timeout = arg * 1000;
+ else
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ break;
+
+ case CURLOPT_TIMEOUT_MS:
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.timeout = arg;
+ break;
+
+ case CURLOPT_CONNECTTIMEOUT:
+ /*
+ * The maximum time you allow curl to use to connect.
+ */
+ arg = va_arg(param, long);
+ if((arg >= 0) && (arg < (INT_MAX/1000)))
+ data->set.connecttimeout = arg * 1000;
+ else
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ break;
+
+ case CURLOPT_CONNECTTIMEOUT_MS:
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.connecttimeout = arg;
+ break;
+
+ case CURLOPT_ACCEPTTIMEOUT_MS:
+ /*
+ * The maximum time you allow curl to wait for server connect
+ */
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.accepttimeout = arg;
+ break;
+
+ case CURLOPT_USERPWD:
+ /*
+ * user:password to use in the operation
+ */
+ result = setstropt_userpwd(va_arg(param, char *),
+ &data->set.str[STRING_USERNAME],
+ &data->set.str[STRING_PASSWORD]);
+ break;
+
+ case CURLOPT_USERNAME:
+ /*
+ * authentication user name to use in the operation
+ */
+ result = Curl_setstropt(&data->set.str[STRING_USERNAME],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_PASSWORD:
+ /*
+ * authentication password to use in the operation
+ */
+ result = Curl_setstropt(&data->set.str[STRING_PASSWORD],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_LOGIN_OPTIONS:
+ /*
+ * authentication options to use in the operation
+ */
+ result = Curl_setstropt(&data->set.str[STRING_OPTIONS],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_XOAUTH2_BEARER:
+ /*
+ * OAuth 2.0 bearer token to use in the operation
+ */
+ result = Curl_setstropt(&data->set.str[STRING_BEARER],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_POSTQUOTE:
+ /*
+ * List of RAW FTP commands to use after a transfer
+ */
+ data->set.postquote = va_arg(param, struct curl_slist *);
+ break;
+ case CURLOPT_PREQUOTE:
+ /*
+ * List of RAW FTP commands to use prior to RETR (Wesley Laxton)
+ */
+ data->set.prequote = va_arg(param, struct curl_slist *);
+ break;
+ case CURLOPT_QUOTE:
+ /*
+ * List of RAW FTP commands to use before a transfer
+ */
+ data->set.quote = va_arg(param, struct curl_slist *);
+ break;
+ case CURLOPT_RESOLVE:
+ /*
+ * List of NAME:[address] names to populate the DNS cache with
+ * Prefix the NAME with dash (-) to _remove_ the name from the cache.
+ *
+ * Names added with this API will remain in the cache until explicitly
+ * removed or the handle is cleaned up.
+ *
+ * This API can remove any name from the DNS cache, but only entries
+ * that aren't actually in use right now will be pruned immediately.
+ */
+ data->set.resolve = va_arg(param, struct curl_slist *);
+ data->change.resolve = data->set.resolve;
+ break;
+ case CURLOPT_PROGRESSFUNCTION:
+ /*
+ * Progress callback function
+ */
+ data->set.fprogress = va_arg(param, curl_progress_callback);
+ if(data->set.fprogress)
+ data->progress.callback = TRUE; /* no longer internal */
+ else
+ data->progress.callback = FALSE; /* NULL enforces internal */
+ break;
+
+ case CURLOPT_XFERINFOFUNCTION:
+ /*
+ * Transfer info callback function
+ */
+ data->set.fxferinfo = va_arg(param, curl_xferinfo_callback);
+ if(data->set.fxferinfo)
+ data->progress.callback = TRUE; /* no longer internal */
+ else
+ data->progress.callback = FALSE; /* NULL enforces internal */
+
+ break;
+
+ case CURLOPT_PROGRESSDATA:
+ /*
+ * Custom client data to pass to the progress callback
+ */
+ data->set.progress_client = va_arg(param, void *);
+ break;
+
+#ifndef CURL_DISABLE_PROXY
+ case CURLOPT_PROXYUSERPWD:
+ /*
+ * user:password needed to use the proxy
+ */
+ result = setstropt_userpwd(va_arg(param, char *),
+ &data->set.str[STRING_PROXYUSERNAME],
+ &data->set.str[STRING_PROXYPASSWORD]);
+ break;
+ case CURLOPT_PROXYUSERNAME:
+ /*
+ * authentication user name to use in the operation
+ */
+ result = Curl_setstropt(&data->set.str[STRING_PROXYUSERNAME],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXYPASSWORD:
+ /*
+ * authentication password to use in the operation
+ */
+ result = Curl_setstropt(&data->set.str[STRING_PROXYPASSWORD],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_NOPROXY:
+ /*
+ * proxy exception list
+ */
+ result = Curl_setstropt(&data->set.str[STRING_NOPROXY],
+ va_arg(param, char *));
+ break;
+#endif
+
+ case CURLOPT_RANGE:
+ /*
+ * What range of the file you want to transfer
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SET_RANGE],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_RESUME_FROM:
+ /*
+ * Resume transfer at the given file position
+ */
+ arg = va_arg(param, long);
+ if(arg < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.set_resume_from = arg;
+ break;
+ case CURLOPT_RESUME_FROM_LARGE:
+ /*
+ * Resume transfer at the given file position
+ */
+ bigsize = va_arg(param, curl_off_t);
+ if(bigsize < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.set_resume_from = bigsize;
+ break;
+ case CURLOPT_DEBUGFUNCTION:
+ /*
+ * stderr write callback.
+ */
+ data->set.fdebug = va_arg(param, curl_debug_callback);
+ /*
+ * if the callback provided is NULL, it'll use the default callback
+ */
+ break;
+ case CURLOPT_DEBUGDATA:
+ /*
+ * Set to a void * that should receive all error writes. This
+ * defaults to CURLOPT_STDERR for normal operations.
+ */
+ data->set.debugdata = va_arg(param, void *);
+ break;
+ case CURLOPT_STDERR:
+ /*
+ * Set to a FILE * that should receive all error writes. This
+ * defaults to stderr for normal operations.
+ */
+ data->set.err = va_arg(param, FILE *);
+ if(!data->set.err)
+ data->set.err = stderr;
+ break;
+ case CURLOPT_HEADERFUNCTION:
+ /*
+ * Set header write callback
+ */
+ data->set.fwrite_header = va_arg(param, curl_write_callback);
+ break;
+ case CURLOPT_WRITEFUNCTION:
+ /*
+ * Set data write callback
+ */
+ data->set.fwrite_func = va_arg(param, curl_write_callback);
+ if(!data->set.fwrite_func) {
+ data->set.is_fwrite_set = 0;
+ /* When set to NULL, reset to our internal default function */
+ data->set.fwrite_func = (curl_write_callback)fwrite;
+ }
+ else
+ data->set.is_fwrite_set = 1;
+ break;
+ case CURLOPT_READFUNCTION:
+ /*
+ * Read data callback
+ */
+ data->set.fread_func_set = va_arg(param, curl_read_callback);
+ if(!data->set.fread_func_set) {
+ data->set.is_fread_set = 0;
+ /* When set to NULL, reset to our internal default function */
+ data->set.fread_func_set = (curl_read_callback)fread;
+ }
+ else
+ data->set.is_fread_set = 1;
+ break;
+ case CURLOPT_SEEKFUNCTION:
+ /*
+ * Seek callback. Might be NULL.
+ */
+ data->set.seek_func = va_arg(param, curl_seek_callback);
+ break;
+ case CURLOPT_SEEKDATA:
+ /*
+ * Seek control callback. Might be NULL.
+ */
+ data->set.seek_client = va_arg(param, void *);
+ break;
+ case CURLOPT_CONV_FROM_NETWORK_FUNCTION:
+ /*
+ * "Convert from network encoding" callback
+ */
+ data->set.convfromnetwork = va_arg(param, curl_conv_callback);
+ break;
+ case CURLOPT_CONV_TO_NETWORK_FUNCTION:
+ /*
+ * "Convert to network encoding" callback
+ */
+ data->set.convtonetwork = va_arg(param, curl_conv_callback);
+ break;
+ case CURLOPT_CONV_FROM_UTF8_FUNCTION:
+ /*
+ * "Convert from UTF-8 encoding" callback
+ */
+ data->set.convfromutf8 = va_arg(param, curl_conv_callback);
+ break;
+ case CURLOPT_IOCTLFUNCTION:
+ /*
+ * I/O control callback. Might be NULL.
+ */
+ data->set.ioctl_func = va_arg(param, curl_ioctl_callback);
+ break;
+ case CURLOPT_IOCTLDATA:
+ /*
+ * I/O control data pointer. Might be NULL.
+ */
+ data->set.ioctl_client = va_arg(param, void *);
+ break;
+ case CURLOPT_SSLCERT:
+ /*
+ * String that holds file name of the SSL certificate to use
+ */
+ result = Curl_setstropt(&data->set.str[STRING_CERT_ORIG],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXY_SSLCERT:
+ /*
+ * String that holds file name of the SSL certificate to use for proxy
+ */
+ result = Curl_setstropt(&data->set.str[STRING_CERT_PROXY],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_SSLCERTTYPE:
+ /*
+ * String that holds file type of the SSL certificate to use
+ */
+ result = Curl_setstropt(&data->set.str[STRING_CERT_TYPE_ORIG],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXY_SSLCERTTYPE:
+ /*
+ * String that holds file type of the SSL certificate to use for proxy
+ */
+ result = Curl_setstropt(&data->set.str[STRING_CERT_TYPE_PROXY],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_SSLKEY:
+ /*
+ * String that holds file name of the SSL key to use
+ */
+ result = Curl_setstropt(&data->set.str[STRING_KEY_ORIG],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXY_SSLKEY:
+ /*
+ * String that holds file name of the SSL key to use for proxy
+ */
+ result = Curl_setstropt(&data->set.str[STRING_KEY_PROXY],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_SSLKEYTYPE:
+ /*
+ * String that holds file type of the SSL key to use
+ */
+ result = Curl_setstropt(&data->set.str[STRING_KEY_TYPE_ORIG],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXY_SSLKEYTYPE:
+ /*
+ * String that holds file type of the SSL key to use for proxy
+ */
+ result = Curl_setstropt(&data->set.str[STRING_KEY_TYPE_PROXY],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_KEYPASSWD:
+ /*
+ * String that holds the SSL or SSH private key password.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_KEY_PASSWD_ORIG],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXY_KEYPASSWD:
+ /*
+ * String that holds the SSL private key password for proxy.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_KEY_PASSWD_PROXY],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_SSLENGINE:
+ /*
+ * String that holds the SSL crypto engine.
+ */
+ argptr = va_arg(param, char *);
+ if(argptr && argptr[0])
+ result = Curl_ssl_set_engine(data, argptr);
+ break;
+
+ case CURLOPT_SSLENGINE_DEFAULT:
+ /*
+ * flag to set engine as default.
+ */
+ result = Curl_ssl_set_engine_default(data);
+ break;
+ case CURLOPT_CRLF:
+ /*
+ * Kludgy option to enable CRLF conversions. Subject for removal.
+ */
+ data->set.crlf = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_INTERFACE:
+ /*
+ * Set what interface or address/hostname to bind the socket to when
+ * performing an operation and thus what from-IP your connection will use.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_DEVICE],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_LOCALPORT:
+ /*
+ * Set what local port to bind the socket to when performing an operation.
+ */
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 65535))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.localport = curlx_sltous(arg);
+ break;
+ case CURLOPT_LOCALPORTRANGE:
+ /*
+ * Set number of local ports to try, starting with CURLOPT_LOCALPORT.
+ */
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 65535))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.localportrange = curlx_sltosi(arg);
+ break;
+ case CURLOPT_KRBLEVEL:
+ /*
+ * A string that defines the kerberos security level.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_KRB_LEVEL],
+ va_arg(param, char *));
+ data->set.krb = (data->set.str[STRING_KRB_LEVEL]) ? TRUE : FALSE;
+ break;
+ case CURLOPT_GSSAPI_DELEGATION:
+ /*
+ * GSS-API credential delegation bitmask
+ */
+ arg = va_arg(param, long);
+ if(arg < CURLGSSAPI_DELEGATION_NONE)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.gssapi_delegation = arg;
+ break;
+ case CURLOPT_SSL_VERIFYPEER:
+ /*
+ * Enable peer SSL verifying.
+ */
+ data->set.ssl.primary.verifypeer = (0 != va_arg(param, long)) ?
+ TRUE : FALSE;
+
+ /* Update the current connection ssl_config. */
+ if(data->easy_conn) {
+ data->easy_conn->ssl_config.verifypeer =
+ data->set.ssl.primary.verifypeer;
+ }
+ break;
+ case CURLOPT_PROXY_SSL_VERIFYPEER:
+ /*
+ * Enable peer SSL verifying for proxy.
+ */
+ data->set.proxy_ssl.primary.verifypeer =
+ (0 != va_arg(param, long))?TRUE:FALSE;
+
+ /* Update the current connection proxy_ssl_config. */
+ if(data->easy_conn) {
+ data->easy_conn->proxy_ssl_config.verifypeer =
+ data->set.proxy_ssl.primary.verifypeer;
+ }
+ break;
+ case CURLOPT_SSL_VERIFYHOST:
+ /*
+ * Enable verification of the host name in the peer certificate
+ */
+ arg = va_arg(param, long);
+
+ /* Obviously people are not reading documentation and too many thought
+ this argument took a boolean when it wasn't and misused it. We thus ban
+ 1 as a sensible input and we warn about its use. Then we only have the
+ 2 action internally stored as TRUE. */
+
+ if(1 == arg) {
+ failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ }
+
+ data->set.ssl.primary.verifyhost = (0 != arg) ? TRUE : FALSE;
+
+ /* Update the current connection ssl_config. */
+ if(data->easy_conn) {
+ data->easy_conn->ssl_config.verifyhost =
+ data->set.ssl.primary.verifyhost;
+ }
+ break;
+ case CURLOPT_PROXY_SSL_VERIFYHOST:
+ /*
+ * Enable verification of the host name in the peer certificate for proxy
+ */
+ arg = va_arg(param, long);
+
+ /* Obviously people are not reading documentation and too many thought
+ this argument took a boolean when it wasn't and misused it. We thus ban
+ 1 as a sensible input and we warn about its use. Then we only have the
+ 2 action internally stored as TRUE. */
+
+ if(1 == arg) {
+ failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ }
+
+ data->set.proxy_ssl.primary.verifyhost = (0 != arg)?TRUE:FALSE;
+
+ /* Update the current connection proxy_ssl_config. */
+ if(data->easy_conn) {
+ data->easy_conn->proxy_ssl_config.verifyhost =
+ data->set.proxy_ssl.primary.verifyhost;
+ }
+ break;
+ case CURLOPT_SSL_VERIFYSTATUS:
+ /*
+ * Enable certificate status verifying.
+ */
+ if(!Curl_ssl_cert_status_request()) {
+ result = CURLE_NOT_BUILT_IN;
+ break;
+ }
+
+ data->set.ssl.primary.verifystatus = (0 != va_arg(param, long)) ?
+ TRUE : FALSE;
+
+ /* Update the current connection ssl_config. */
+ if(data->easy_conn) {
+ data->easy_conn->ssl_config.verifystatus =
+ data->set.ssl.primary.verifystatus;
+ }
+ break;
+ case CURLOPT_SSL_CTX_FUNCTION:
+ /*
+ * Set a SSL_CTX callback
+ */
+#ifdef USE_SSL
+ if(Curl_ssl->have_ssl_ctx)
+ data->set.ssl.fsslctx = va_arg(param, curl_ssl_ctx_callback);
+ else
+#endif
+ result = CURLE_NOT_BUILT_IN;
+ break;
+ case CURLOPT_SSL_CTX_DATA:
+ /*
+ * Set a SSL_CTX callback parameter pointer
+ */
+#ifdef USE_SSL
+ if(Curl_ssl->have_ssl_ctx)
+ data->set.ssl.fsslctxp = va_arg(param, void *);
+ else
+#endif
+ result = CURLE_NOT_BUILT_IN;
+ break;
+ case CURLOPT_SSL_FALSESTART:
+ /*
+ * Enable TLS false start.
+ */
+ if(!Curl_ssl_false_start()) {
+ result = CURLE_NOT_BUILT_IN;
+ break;
+ }
+
+ data->set.ssl.falsestart = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_CERTINFO:
+#ifdef USE_SSL
+ if(Curl_ssl->have_certinfo)
+ data->set.ssl.certinfo = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ else
+#endif
+ result = CURLE_NOT_BUILT_IN;
+ break;
+ case CURLOPT_PINNEDPUBLICKEY:
+ /*
+ * Set pinned public key for SSL connection.
+ * Specify file name of the public key in DER format.
+ */
+#ifdef USE_SSL
+ if(Curl_ssl->have_pinnedpubkey)
+ result = Curl_setstropt(&data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG],
+ va_arg(param, char *));
+ else
+#endif
+ result = CURLE_NOT_BUILT_IN;
+ break;
+ case CURLOPT_PROXY_PINNEDPUBLICKEY:
+ /*
+ * Set pinned public key for SSL connection.
+ * Specify file name of the public key in DER format.
+ */
+#ifdef USE_SSL
+ if(Curl_ssl->have_pinnedpubkey)
+ result = Curl_setstropt(&data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY],
+ va_arg(param, char *));
+ else
+#endif
+ result = CURLE_NOT_BUILT_IN;
+ break;
+ case CURLOPT_CAINFO:
+ /*
+ * Set CA info for SSL connection. Specify file name of the CA certificate
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_CAFILE_ORIG],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXY_CAINFO:
+ /*
+ * Set CA info SSL connection for proxy. Specify file name of the
+ * CA certificate
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_CAFILE_PROXY],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_CAPATH:
+ /*
+ * Set CA path info for SSL connection. Specify directory name of the CA
+ * certificates which have been prepared using openssl c_rehash utility.
+ */
+#ifdef USE_SSL
+ if(Curl_ssl->have_ca_path)
+ /* This does not work on windows. */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_CAPATH_ORIG],
+ va_arg(param, char *));
+ else
+#endif
+ result = CURLE_NOT_BUILT_IN;
+ break;
+ case CURLOPT_PROXY_CAPATH:
+ /*
+ * Set CA path info for SSL connection proxy. Specify directory name of the
+ * CA certificates which have been prepared using openssl c_rehash utility.
+ */
+#ifdef USE_SSL
+ if(Curl_ssl->have_ca_path)
+ /* This does not work on windows. */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_CAPATH_PROXY],
+ va_arg(param, char *));
+ else
+#endif
+ result = CURLE_NOT_BUILT_IN;
+ break;
+ case CURLOPT_CRLFILE:
+ /*
+ * Set CRL file info for SSL connection. Specify file name of the CRL
+ * to check certificates revocation
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_CRLFILE_ORIG],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXY_CRLFILE:
+ /*
+ * Set CRL file info for SSL connection for proxy. Specify file name of the
+ * CRL to check certificates revocation
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_CRLFILE_PROXY],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_ISSUERCERT:
+ /*
+ * Set Issuer certificate file
+ * to check certificates issuer
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_ISSUERCERT_ORIG],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_TELNETOPTIONS:
+ /*
+ * Set a linked list of telnet options
+ */
+ data->set.telnet_options = va_arg(param, struct curl_slist *);
+ break;
+
+ case CURLOPT_BUFFERSIZE:
+ /*
+ * The application kindly asks for a differently sized receive buffer.
+ * If it seems reasonable, we'll use it.
+ */
+ arg = va_arg(param, long);
+
+ if(arg > READBUFFER_MAX)
+ arg = READBUFFER_MAX;
+ else if(arg < 1)
+ arg = READBUFFER_SIZE;
+ else if(arg < READBUFFER_MIN)
+ arg = READBUFFER_MIN;
+
+ /* Resize if new size */
+ if(arg != data->set.buffer_size) {
+ char *newbuff = realloc(data->state.buffer, arg + 1);
+ if(!newbuff) {
+ DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
+ result = CURLE_OUT_OF_MEMORY;
+ }
+ else
+ data->state.buffer = newbuff;
+ }
+ data->set.buffer_size = arg;
+
+ break;
+
+ case CURLOPT_NOSIGNAL:
+ /*
+ * The application asks not to set any signal() or alarm() handlers,
+ * even when using a timeout.
+ */
+ data->set.no_signal = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_SHARE:
+ {
+ struct Curl_share *set;
+ set = va_arg(param, struct Curl_share *);
+
+ /* disconnect from old share, if any */
+ if(data->share) {
+ Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
+
+ if(data->dns.hostcachetype == HCACHE_SHARED) {
+ data->dns.hostcache = NULL;
+ data->dns.hostcachetype = HCACHE_NONE;
+ }
+
+#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
+ if(data->share->cookies == data->cookies)
+ data->cookies = NULL;
+#endif
+
+ if(data->share->sslsession == data->state.session)
+ data->state.session = NULL;
+
+ data->share->dirty--;
+
+ Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
+ data->share = NULL;
+ }
+
+ /* use new share if it set */
+ data->share = set;
+ if(data->share) {
+
+ Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
+
+ data->share->dirty++;
+
+ if(data->share->specifier & (1<< CURL_LOCK_DATA_DNS)) {
+ /* use shared host cache */
+ data->dns.hostcache = &data->share->hostcache;
+ data->dns.hostcachetype = HCACHE_SHARED;
+ }
+#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
+ if(data->share->cookies) {
+ /* use shared cookie list, first free own one if any */
+ Curl_cookie_cleanup(data->cookies);
+ /* enable cookies since we now use a share that uses cookies! */
+ data->cookies = data->share->cookies;
+ }
+#endif /* CURL_DISABLE_HTTP */
+ if(data->share->sslsession) {
+ data->set.general_ssl.max_ssl_sessions = data->share->max_ssl_sessions;
+ data->state.session = data->share->sslsession;
+ }
+ Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
+
+ }
+ /* check for host cache not needed,
+ * it will be done by curl_easy_perform */
+ }
+ break;
+
+ case CURLOPT_PRIVATE:
+ /*
+ * Set private data pointer.
+ */
+ data->set.private_data = va_arg(param, void *);
+ break;
+
+ case CURLOPT_MAXFILESIZE:
+ /*
+ * Set the maximum size of a file to download.
+ */
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.max_filesize = arg;
+ break;
+
+#ifdef USE_SSL
+ case CURLOPT_USE_SSL:
+ /*
+ * Make transfers attempt to use SSL/TLS.
+ */
+ arg = va_arg(param, long);
+ if((arg < CURLUSESSL_NONE) || (arg > CURLUSESSL_ALL))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.use_ssl = (curl_usessl)arg;
+ break;
+
+ case CURLOPT_SSL_OPTIONS:
+ arg = va_arg(param, long);
+ data->set.ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE;
+ data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
+ break;
+
+ case CURLOPT_PROXY_SSL_OPTIONS:
+ arg = va_arg(param, long);
+ data->set.proxy_ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE;
+ data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
+ break;
+
+#endif
+ case CURLOPT_FTPSSLAUTH:
+ /*
+ * Set a specific auth for FTP-SSL transfers.
+ */
+ arg = va_arg(param, long);
+ if((arg < CURLFTPAUTH_DEFAULT) || (arg > CURLFTPAUTH_TLS))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.ftpsslauth = (curl_ftpauth)arg;
+ break;
+
+ case CURLOPT_IPRESOLVE:
+ arg = va_arg(param, long);
+ if((arg < CURL_IPRESOLVE_WHATEVER) || (arg > CURL_IPRESOLVE_V6))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.ipver = arg;
+ break;
+
+ case CURLOPT_MAXFILESIZE_LARGE:
+ /*
+ * Set the maximum size of a file to download.
+ */
+ bigsize = va_arg(param, curl_off_t);
+ if(bigsize < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.max_filesize = bigsize;
+ break;
+
+ case CURLOPT_TCP_NODELAY:
+ /*
+ * Enable or disable TCP_NODELAY, which will disable/enable the Nagle
+ * algorithm
+ */
+ data->set.tcp_nodelay = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_FTP_ACCOUNT:
+ result = Curl_setstropt(&data->set.str[STRING_FTP_ACCOUNT],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_IGNORE_CONTENT_LENGTH:
+ data->set.ignorecl = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_CONNECT_ONLY:
+ /*
+ * No data transfer, set up connection and let application use the socket
+ */
+ data->set.connect_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_FTP_ALTERNATIVE_TO_USER:
+ result = Curl_setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_SOCKOPTFUNCTION:
+ /*
+ * socket callback function: called after socket() but before connect()
+ */
+ data->set.fsockopt = va_arg(param, curl_sockopt_callback);
+ break;
+
+ case CURLOPT_SOCKOPTDATA:
+ /*
+ * socket callback data pointer. Might be NULL.
+ */
+ data->set.sockopt_client = va_arg(param, void *);
+ break;
+
+ case CURLOPT_OPENSOCKETFUNCTION:
+ /*
+ * open/create socket callback function: called instead of socket(),
+ * before connect()
+ */
+ data->set.fopensocket = va_arg(param, curl_opensocket_callback);
+ break;
+
+ case CURLOPT_OPENSOCKETDATA:
+ /*
+ * socket callback data pointer. Might be NULL.
+ */
+ data->set.opensocket_client = va_arg(param, void *);
+ break;
+
+ case CURLOPT_CLOSESOCKETFUNCTION:
+ /*
+ * close socket callback function: called instead of close()
+ * when shutting down a connection
+ */
+ data->set.fclosesocket = va_arg(param, curl_closesocket_callback);
+ break;
+
+ case CURLOPT_CLOSESOCKETDATA:
+ /*
+ * socket callback data pointer. Might be NULL.
+ */
+ data->set.closesocket_client = va_arg(param, void *);
+ break;
+
+ case CURLOPT_SSL_SESSIONID_CACHE:
+ data->set.ssl.primary.sessionid = (0 != va_arg(param, long)) ?
+ TRUE : FALSE;
+ data->set.proxy_ssl.primary.sessionid = data->set.ssl.primary.sessionid;
+ break;
+
+#ifdef USE_LIBSSH2
+ /* we only include SSH options if explicitly built to support SSH */
+ case CURLOPT_SSH_AUTH_TYPES:
+ data->set.ssh_auth_types = va_arg(param, long);
+ break;
+
+ case CURLOPT_SSH_PUBLIC_KEYFILE:
+ /*
+ * Use this file instead of the $HOME/.ssh/id_dsa.pub file
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSH_PUBLIC_KEY],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_SSH_PRIVATE_KEYFILE:
+ /*
+ * Use this file instead of the $HOME/.ssh/id_dsa file
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSH_PRIVATE_KEY],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:
+ /*
+ * Option to allow for the MD5 of the host public key to be checked
+ * for validation purposes.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5],
+ va_arg(param, char *));
+ break;
+#ifdef HAVE_LIBSSH2_KNOWNHOST_API
+ case CURLOPT_SSH_KNOWNHOSTS:
+ /*
+ * Store the file name to read known hosts from.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSH_KNOWNHOSTS],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_SSH_KEYFUNCTION:
+ /* setting to NULL is fine since the ssh.c functions themselves will
+ then rever to use the internal default */
+ data->set.ssh_keyfunc = va_arg(param, curl_sshkeycallback);
+ break;
+
+ case CURLOPT_SSH_KEYDATA:
+ /*
+ * Custom client data to pass to the SSH keyfunc callback
+ */
+ data->set.ssh_keyfunc_userp = va_arg(param, void *);
+ break;
+#endif /* HAVE_LIBSSH2_KNOWNHOST_API */
+
+#endif /* USE_LIBSSH2 */
+
+ case CURLOPT_HTTP_TRANSFER_DECODING:
+ /*
+ * disable libcurl transfer encoding is used
+ */
+ data->set.http_te_skip = (0 == va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_HTTP_CONTENT_DECODING:
+ /*
+ * raw data passed to the application when content encoding is used
+ */
+ data->set.http_ce_skip = (0 == va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_NEW_FILE_PERMS:
+ /*
+ * Uses these permissions instead of 0644
+ */
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 0777))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.new_file_perms = arg;
+ break;
+
+ case CURLOPT_NEW_DIRECTORY_PERMS:
+ /*
+ * Uses these permissions instead of 0755
+ */
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 0777))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.new_directory_perms = arg;
+ break;
+
+ case CURLOPT_ADDRESS_SCOPE:
+ /*
+ * We always get longs when passed plain numericals, but for this value we
+ * know that an unsigned int will always hold the value so we blindly
+ * typecast to this type
+ */
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 0xf))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.scope_id = curlx_sltoui(arg);
+ break;
+
+ case CURLOPT_PROTOCOLS:
+ /* set the bitmask for the protocols that are allowed to be used for the
+ transfer, which thus helps the app which takes URLs from users or other
+ external inputs and want to restrict what protocol(s) to deal
+ with. Defaults to CURLPROTO_ALL. */
+ data->set.allowed_protocols = va_arg(param, long);
+ break;
+
+ case CURLOPT_REDIR_PROTOCOLS:
+ /* set the bitmask for the protocols that libcurl is allowed to follow to,
+ as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
+ to be set in both bitmasks to be allowed to get redirected to. Defaults
+ to all protocols except FILE and SCP. */
+ data->set.redir_protocols = va_arg(param, long);
+ break;
+
+ case CURLOPT_DEFAULT_PROTOCOL:
+ /* Set the protocol to use when the URL doesn't include any protocol */
+ result = Curl_setstropt(&data->set.str[STRING_DEFAULT_PROTOCOL],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_MAIL_FROM:
+ /* Set the SMTP mail originator */
+ result = Curl_setstropt(&data->set.str[STRING_MAIL_FROM],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_MAIL_AUTH:
+ /* Set the SMTP auth originator */
+ result = Curl_setstropt(&data->set.str[STRING_MAIL_AUTH],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_MAIL_RCPT:
+ /* Set the list of mail recipients */
+ data->set.mail_rcpt = va_arg(param, struct curl_slist *);
+ break;
+
+ case CURLOPT_SASL_IR:
+ /* Enable/disable SASL initial response */
+ data->set.sasl_ir = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_RTSP_REQUEST:
+ {
+ /*
+ * Set the RTSP request method (OPTIONS, SETUP, PLAY, etc...)
+ * Would this be better if the RTSPREQ_* were just moved into here?
+ */
+ long curl_rtspreq = va_arg(param, long);
+ Curl_RtspReq rtspreq = RTSPREQ_NONE;
+ switch(curl_rtspreq) {
+ case CURL_RTSPREQ_OPTIONS:
+ rtspreq = RTSPREQ_OPTIONS;
+ break;
+
+ case CURL_RTSPREQ_DESCRIBE:
+ rtspreq = RTSPREQ_DESCRIBE;
+ break;
+
+ case CURL_RTSPREQ_ANNOUNCE:
+ rtspreq = RTSPREQ_ANNOUNCE;
+ break;
+
+ case CURL_RTSPREQ_SETUP:
+ rtspreq = RTSPREQ_SETUP;
+ break;
+
+ case CURL_RTSPREQ_PLAY:
+ rtspreq = RTSPREQ_PLAY;
+ break;
+
+ case CURL_RTSPREQ_PAUSE:
+ rtspreq = RTSPREQ_PAUSE;
+ break;
+
+ case CURL_RTSPREQ_TEARDOWN:
+ rtspreq = RTSPREQ_TEARDOWN;
+ break;
+
+ case CURL_RTSPREQ_GET_PARAMETER:
+ rtspreq = RTSPREQ_GET_PARAMETER;
+ break;
+
+ case CURL_RTSPREQ_SET_PARAMETER:
+ rtspreq = RTSPREQ_SET_PARAMETER;
+ break;
+
+ case CURL_RTSPREQ_RECORD:
+ rtspreq = RTSPREQ_RECORD;
+ break;
+
+ case CURL_RTSPREQ_RECEIVE:
+ rtspreq = RTSPREQ_RECEIVE;
+ break;
+ default:
+ rtspreq = RTSPREQ_NONE;
+ }
+
+ data->set.rtspreq = rtspreq;
+ break;
+ }
+
+
+ case CURLOPT_RTSP_SESSION_ID:
+ /*
+ * Set the RTSP Session ID manually. Useful if the application is
+ * resuming a previously established RTSP session
+ */
+ result = Curl_setstropt(&data->set.str[STRING_RTSP_SESSION_ID],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_RTSP_STREAM_URI:
+ /*
+ * Set the Stream URI for the RTSP request. Unless the request is
+ * for generic server options, the application will need to set this.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_RTSP_STREAM_URI],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_RTSP_TRANSPORT:
+ /*
+ * The content of the Transport: header for the RTSP request
+ */
+ result = Curl_setstropt(&data->set.str[STRING_RTSP_TRANSPORT],
+ va_arg(param, char *));
+ break;
+
+ case CURLOPT_RTSP_CLIENT_CSEQ:
+ /*
+ * Set the CSEQ number to issue for the next RTSP request. Useful if the
+ * application is resuming a previously broken connection. The CSEQ
+ * will increment from this new number henceforth.
+ */
+ data->state.rtsp_next_client_CSeq = va_arg(param, long);
+ break;
+
+ case CURLOPT_RTSP_SERVER_CSEQ:
+ /* Same as the above, but for server-initiated requests */
+ data->state.rtsp_next_client_CSeq = va_arg(param, long);
+ break;
+
+ case CURLOPT_INTERLEAVEDATA:
+ data->set.rtp_out = va_arg(param, void *);
+ break;
+ case CURLOPT_INTERLEAVEFUNCTION:
+ /* Set the user defined RTP write function */
+ data->set.fwrite_rtp = va_arg(param, curl_write_callback);
+ break;
+
+ case CURLOPT_WILDCARDMATCH:
+ data->set.wildcard_enabled = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_CHUNK_BGN_FUNCTION:
+ data->set.chunk_bgn = va_arg(param, curl_chunk_bgn_callback);
+ break;
+ case CURLOPT_CHUNK_END_FUNCTION:
+ data->set.chunk_end = va_arg(param, curl_chunk_end_callback);
+ break;
+ case CURLOPT_FNMATCH_FUNCTION:
+ data->set.fnmatch = va_arg(param, curl_fnmatch_callback);
+ break;
+ case CURLOPT_CHUNK_DATA:
+ data->wildcard.customptr = va_arg(param, void *);
+ break;
+ case CURLOPT_FNMATCH_DATA:
+ data->set.fnmatch_data = va_arg(param, void *);
+ break;
+#ifdef USE_TLS_SRP
+ case CURLOPT_TLSAUTH_USERNAME:
+ result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_ORIG],
+ va_arg(param, char *));
+ if(data->set.str[STRING_TLSAUTH_USERNAME_ORIG] && !data->set.ssl.authtype)
+ data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
+ break;
+ case CURLOPT_PROXY_TLSAUTH_USERNAME:
+ result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_PROXY],
+ va_arg(param, char *));
+ if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
+ !data->set.proxy_ssl.authtype)
+ data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
+ break;
+ case CURLOPT_TLSAUTH_PASSWORD:
+ result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_ORIG],
+ va_arg(param, char *));
+ if(data->set.str[STRING_TLSAUTH_USERNAME_ORIG] && !data->set.ssl.authtype)
+ data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
+ break;
+ case CURLOPT_PROXY_TLSAUTH_PASSWORD:
+ result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_PROXY],
+ va_arg(param, char *));
+ if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
+ !data->set.proxy_ssl.authtype)
+ data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
+ break;
+ case CURLOPT_TLSAUTH_TYPE:
+ argptr = va_arg(param, char *);
+ if(!argptr ||
+ strncasecompare(argptr, "SRP", strlen("SRP")))
+ data->set.ssl.authtype = CURL_TLSAUTH_SRP;
+ else
+ data->set.ssl.authtype = CURL_TLSAUTH_NONE;
+ break;
+ case CURLOPT_PROXY_TLSAUTH_TYPE:
+ argptr = va_arg(param, char *);
+ if(!argptr ||
+ strncasecompare(argptr, "SRP", strlen("SRP")))
+ data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP;
+ else
+ data->set.proxy_ssl.authtype = CURL_TLSAUTH_NONE;
+ break;
+#endif
+ case CURLOPT_DNS_SERVERS:
+ result = Curl_set_dns_servers(data, va_arg(param, char *));
+ break;
+ case CURLOPT_DNS_INTERFACE:
+ result = Curl_set_dns_interface(data, va_arg(param, char *));
+ break;
+ case CURLOPT_DNS_LOCAL_IP4:
+ result = Curl_set_dns_local_ip4(data, va_arg(param, char *));
+ break;
+ case CURLOPT_DNS_LOCAL_IP6:
+ result = Curl_set_dns_local_ip6(data, va_arg(param, char *));
+ break;
+
+ case CURLOPT_TCP_KEEPALIVE:
+ data->set.tcp_keepalive = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_TCP_KEEPIDLE:
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.tcp_keepidle = arg;
+ break;
+ case CURLOPT_TCP_KEEPINTVL:
+ arg = va_arg(param, long);
+ if(arg < 0)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.tcp_keepintvl = arg;
+ break;
+ case CURLOPT_TCP_FASTOPEN:
+#if defined(CONNECT_DATA_IDEMPOTENT) || defined(MSG_FASTOPEN) || \
+ defined(TCP_FASTOPEN_CONNECT)
+ data->set.tcp_fastopen = (0 != va_arg(param, long))?TRUE:FALSE;
+#else
+ result = CURLE_NOT_BUILT_IN;
+#endif
+ break;
+ case CURLOPT_SSL_ENABLE_NPN:
+ data->set.ssl_enable_npn = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_SSL_ENABLE_ALPN:
+ data->set.ssl_enable_alpn = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+#ifdef USE_UNIX_SOCKETS
+ case CURLOPT_UNIX_SOCKET_PATH:
+ data->set.abstract_unix_socket = FALSE;
+ result = Curl_setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_ABSTRACT_UNIX_SOCKET:
+ data->set.abstract_unix_socket = TRUE;
+ result = Curl_setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH],
+ va_arg(param, char *));
+ break;
+#endif
+
+ case CURLOPT_PATH_AS_IS:
+ data->set.path_as_is = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_PIPEWAIT:
+ data->set.pipewait = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_STREAM_WEIGHT:
+#ifndef USE_NGHTTP2
+ return CURLE_NOT_BUILT_IN;
+#else
+ arg = va_arg(param, long);
+ if((arg >= 1) && (arg <= 256))
+ data->set.stream_weight = (int)arg;
+ break;
+#endif
+ case CURLOPT_STREAM_DEPENDS:
+ case CURLOPT_STREAM_DEPENDS_E:
+ {
+#ifndef USE_NGHTTP2
+ return CURLE_NOT_BUILT_IN;
+#else
+ struct Curl_easy *dep = va_arg(param, struct Curl_easy *);
+ if(!dep || GOOD_EASY_HANDLE(dep)) {
+ if(data->set.stream_depends_on) {
+ Curl_http2_remove_child(data->set.stream_depends_on, data);
+ }
+ Curl_http2_add_child(dep, data, (option == CURLOPT_STREAM_DEPENDS_E));
+ }
+ break;
+#endif
+ }
+ case CURLOPT_CONNECT_TO:
+ data->set.connect_to = va_arg(param, struct curl_slist *);
+ break;
+ case CURLOPT_SUPPRESS_CONNECT_HEADERS:
+ data->set.suppress_connect_headers = (0 != va_arg(param, long))?TRUE:FALSE;
+ break;
+ case CURLOPT_SSH_COMPRESSION:
+ data->set.ssh_compression = (0 != va_arg(param, long))?TRUE:FALSE;
+ break;
+ default:
+ /* unknown tag and its companion, just ignore: */
+ result = CURLE_UNKNOWN_OPTION;
+ break;
+ }
+
+ return result;
+}
+
+/*
+ * curl_easy_setopt() is the external interface for setting options on an
+ * easy handle.
+ */
+
+#undef curl_easy_setopt
+CURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag, ...)
+{
+ va_list arg;
+ CURLcode result;
+
+ if(!data)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ va_start(arg, tag);
+
+ result = setopt(data, tag, arg);
+
+ va_end(arg);
+ return result;
+}
+
diff --git a/src/tool_mfiles.h b/lib/setopt.h
index 827f400..3576944 100644
--- a/src/tool_mfiles.h
+++ b/lib/setopt.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_TOOL_MFILES_H
-#define HEADER_CURL_TOOL_MFILES_H
+#ifndef HEADER_CURL_SETOPT_H
+#define HEADER_CURL_SETOPT_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,26 +21,7 @@
* KIND, either express or implied.
*
***************************************************************************/
-#include "tool_setup.h"
-/*
- * Structure for storing the information needed to build
- * a multiple files section.
- */
-
-struct multi_files {
- struct curl_forms form;
- struct multi_files *next;
-};
-
-struct multi_files *AddMultiFiles(const char *file_name,
- const char *type_name,
- const char *show_filename,
- struct multi_files **multi_first,
- struct multi_files **multi_last);
-
-void FreeMultiInfo(struct multi_files **multi_first,
- struct multi_files **multi_last);
-
-#endif /* HEADER_CURL_TOOL_MFILES_H */
+CURLcode Curl_setstropt(char **charp, const char *s);
+#endif /* HEADER_CURL_SETOPT_H */
diff --git a/lib/sha256.c b/lib/sha256.c
new file mode 100644
index 0000000..cd81c02
--- /dev/null
+++ b/lib/sha256.c
@@ -0,0 +1,262 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Florin Petriuc, <petriuc.florin@gmail.com>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifndef CURL_DISABLE_CRYPTO_AUTH
+
+#include "warnless.h"
+#include "curl_sha256.h"
+
+#if defined(USE_OPENSSL)
+
+/* When OpenSSL is available we use the SHA256-function from OpenSSL */
+#include <openssl/sha.h>
+
+#else
+
+/* When no other crypto library is available we use this code segment */
+
+/* ===== start - public domain SHA256 implementation ===== */
+/* This is based on SHA256 implementation in LibTomCrypt that was released into
+ * public domain by Tom St Denis. */
+
+#define WPA_GET_BE32(a) ((((unsigned long)(a)[0]) << 24) | \
+ (((unsigned long)(a)[1]) << 16) | \
+ (((unsigned long)(a)[2]) << 8) | \
+ ((unsigned long)(a)[3]))
+#define WPA_PUT_BE32(a, val) \
+do { \
+ (a)[0] = (unsigned char)((((unsigned long) (val)) >> 24) & 0xff); \
+ (a)[1] = (unsigned char)((((unsigned long) (val)) >> 16) & 0xff); \
+ (a)[2] = (unsigned char)((((unsigned long) (val)) >> 8) & 0xff); \
+ (a)[3] = (unsigned char)(((unsigned long) (val)) & 0xff); \
+} while(0)
+
+#ifdef HAVE_LONGLONG
+#define WPA_PUT_BE64(a, val) \
+do { \
+ (a)[0] = (unsigned char)(((unsigned long long)(val)) >> 56); \
+ (a)[1] = (unsigned char)(((unsigned long long)(val)) >> 48); \
+ (a)[2] = (unsigned char)(((unsigned long long)(val)) >> 40); \
+ (a)[3] = (unsigned char)(((unsigned long long)(val)) >> 32); \
+ (a)[4] = (unsigned char)(((unsigned long long)(val)) >> 24); \
+ (a)[5] = (unsigned char)(((unsigned long long)(val)) >> 16); \
+ (a)[6] = (unsigned char)(((unsigned long long)(val)) >> 8); \
+ (a)[7] = (unsigned char)(((unsigned long long)(val)) & 0xff); \
+} while(0)
+#else
+#define WPA_PUT_BE64(a, val) \
+do { \
+ (a)[0] = (unsigned char)(((unsigned __int64)(val)) >> 56); \
+ (a)[1] = (unsigned char)(((unsigned __int64)(val)) >> 48); \
+ (a)[2] = (unsigned char)(((unsigned __int64)(val)) >> 40); \
+ (a)[3] = (unsigned char)(((unsigned __int64)(val)) >> 32); \
+ (a)[4] = (unsigned char)(((unsigned __int64)(val)) >> 24); \
+ (a)[5] = (unsigned char)(((unsigned __int64)(val)) >> 16); \
+ (a)[6] = (unsigned char)(((unsigned __int64)(val)) >> 8); \
+ (a)[7] = (unsigned char)(((unsigned __int64)(val)) & 0xff); \
+} while(0)
+#endif
+
+typedef struct sha256_state {
+#ifdef HAVE_LONGLONG
+ unsigned long long length;
+#else
+ unsigned __int64 length;
+#endif
+ unsigned long state[8], curlen;
+ unsigned char buf[64];
+} SHA256_CTX;
+/* the K array */
+static const unsigned long K[64] = {
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
+ 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
+ 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
+ 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
+ 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
+ 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
+ 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
+ 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
+ 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
+ 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
+};
+/* Various logical functions */
+#define RORc(x, y) \
+(((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long)((y) & 31)) | \
+ ((unsigned long)(x) << (unsigned long)(32 - ((y) & 31)))) & 0xFFFFFFFFUL)
+#define Ch(x,y,z) (z ^ (x & (y ^ z)))
+#define Maj(x,y,z) (((x | y) & z) | (x & y))
+#define S(x, n) RORc((x), (n))
+#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
+#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))
+#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
+#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
+#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
+#ifndef MIN
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
+#endif
+/* compress 512-bits */
+static int sha256_compress(struct sha256_state *md,
+ unsigned char *buf)
+{
+ unsigned long S[8], W[64], t0, t1;
+ unsigned long t;
+ int i;
+ /* copy state into S */
+ for(i = 0; i < 8; i++) {
+ S[i] = md->state[i];
+ }
+ /* copy the state into 512-bits into W[0..15] */
+ for(i = 0; i < 16; i++)
+ W[i] = WPA_GET_BE32(buf + (4 * i));
+ /* fill W[16..63] */
+ for(i = 16; i < 64; i++) {
+ W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +
+ W[i - 16];
+ }
+ /* Compress */
+#define RND(a,b,c,d,e,f,g,h,i) \
+ t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
+ t1 = Sigma0(a) + Maj(a, b, c); \
+ d += t0; \
+ h = t0 + t1;
+ for(i = 0; i < 64; ++i) {
+ RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i);
+ t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4];
+ S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;
+ }
+ /* feedback */
+ for(i = 0; i < 8; i++) {
+ md->state[i] = md->state[i] + S[i];
+ }
+ return 0;
+}
+/* Initialize the hash state */
+static void SHA256_Init(struct sha256_state *md)
+{
+ md->curlen = 0;
+ md->length = 0;
+ md->state[0] = 0x6A09E667UL;
+ md->state[1] = 0xBB67AE85UL;
+ md->state[2] = 0x3C6EF372UL;
+ md->state[3] = 0xA54FF53AUL;
+ md->state[4] = 0x510E527FUL;
+ md->state[5] = 0x9B05688CUL;
+ md->state[6] = 0x1F83D9ABUL;
+ md->state[7] = 0x5BE0CD19UL;
+}
+/**
+ Process a block of memory though the hash
+ @param md The hash state
+ @param in The data to hash
+ @param inlen The length of the data (octets)
+ @return CRYPT_OK if successful
+*/
+static int SHA256_Update(struct sha256_state *md,
+ const unsigned char *in,
+ unsigned long inlen)
+{
+ unsigned long n;
+#define block_size 64
+ if(md->curlen > sizeof(md->buf))
+ return -1;
+ while(inlen > 0) {
+ if(md->curlen == 0 && inlen >= block_size) {
+ if(sha256_compress(md, (unsigned char *)in) < 0)
+ return -1;
+ md->length += block_size * 8;
+ in += block_size;
+ inlen -= block_size;
+ }
+ else {
+ n = MIN(inlen, (block_size - md->curlen));
+ memcpy(md->buf + md->curlen, in, n);
+ md->curlen += n;
+ in += n;
+ inlen -= n;
+ if(md->curlen == block_size) {
+ if(sha256_compress(md, md->buf) < 0)
+ return -1;
+ md->length += 8 * block_size;
+ md->curlen = 0;
+ }
+ }
+ }
+ return 0;
+}
+/**
+ Terminate the hash to get the digest
+ @param md The hash state
+ @param out [out] The destination of the hash (32 bytes)
+ @return CRYPT_OK if successful
+*/
+static int SHA256_Final(unsigned char *out,
+ struct sha256_state *md)
+{
+ int i;
+ if(md->curlen >= sizeof(md->buf))
+ return -1;
+ /* increase the length of the message */
+ md->length += md->curlen * 8;
+ /* append the '1' bit */
+ md->buf[md->curlen++] = (unsigned char)0x80;
+ /* if the length is currently above 56 bytes we append zeros
+ * then compress. Then we can fall back to padding zeros and length
+ * encoding like normal.
+ */
+ if(md->curlen > 56) {
+ while(md->curlen < 64) {
+ md->buf[md->curlen++] = (unsigned char)0;
+ }
+ sha256_compress(md, md->buf);
+ md->curlen = 0;
+ }
+ /* pad upto 56 bytes of zeroes */
+ while(md->curlen < 56) {
+ md->buf[md->curlen++] = (unsigned char)0;
+ }
+ /* store length */
+ WPA_PUT_BE64(md->buf + 56, md->length);
+ sha256_compress(md, md->buf);
+ /* copy output */
+ for(i = 0; i < 8; i++)
+ WPA_PUT_BE32(out + (4 * i), md->state[i]);
+ return 0;
+}
+/* ===== end - public domain SHA256 implementation ===== */
+
+#endif
+
+void Curl_sha256it(unsigned char *outbuffer, /* 32 unsigned chars */
+ const unsigned char *input)
+{
+ SHA256_CTX ctx;
+ SHA256_Init(&ctx);
+ SHA256_Update(&ctx, input, curlx_uztoui(strlen((char *)input)));
+ SHA256_Final(outbuffer, &ctx);
+}
+
+#endif /* CURL_DISABLE_CRYPTO_AUTH */
diff --git a/lib/share.c b/lib/share.c
index 5b3957f..870b191 100644
--- a/lib/share.c
+++ b/lib/share.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -102,6 +102,8 @@ curl_share_setopt(struct Curl_share *share, CURLSHoption option, ...)
break;
case CURL_LOCK_DATA_CONNECT: /* not supported (yet) */
+ if(Curl_conncache_init(&share->conn_cache, 103))
+ res = CURLSHE_NOMEM;
break;
default:
@@ -186,6 +188,8 @@ curl_share_cleanup(struct Curl_share *share)
return CURLSHE_IN_USE;
}
+ Curl_conncache_close_all_connections(&share->conn_cache);
+ Curl_conncache_destroy(&share->conn_cache);
Curl_hash_destroy(&share->hostcache);
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
diff --git a/lib/share.h b/lib/share.h
index c039a16..4b13406 100644
--- a/lib/share.h
+++ b/lib/share.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,7 @@
#include <curl/curl.h>
#include "cookie.h"
#include "urldata.h"
+#include "conncache.h"
/* SalfordC says "A structure member may not be volatile". Hence:
*/
@@ -43,7 +44,7 @@ struct Curl_share {
curl_lock_function lockfunc;
curl_unlock_function unlockfunc;
void *clientdata;
-
+ struct conncache conn_cache;
struct curl_hash hostcache;
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
struct CookieInfo *cookies;
diff --git a/lib/smb.c b/lib/smb.c
index 13dfd51..efcfd2d 100644
--- a/lib/smb.c
+++ b/lib/smb.c
@@ -648,7 +648,7 @@ static CURLcode smb_connection_state(struct connectdata *conn, bool *done)
if(smbc->state == SMB_CONNECTING) {
#ifdef USE_SSL
if((conn->handler->flags & PROTOPT_SSL)) {
- bool ssl_done;
+ bool ssl_done = FALSE;
result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &ssl_done);
if(result && result != CURLE_AGAIN)
return result;
diff --git a/lib/smtp.c b/lib/smtp.c
index 4e2c336..44ee2e9 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -67,6 +67,7 @@
#include "transfer.h"
#include "escape.h"
#include "http.h" /* for HTTP proxy tunnel stuff */
+#include "mime.h"
#include "socks.h"
#include "smtp.h"
#include "strtoofft.h"
@@ -530,8 +531,40 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
}
}
+ /* Prepare the mime data if some. */
+ if(data->set.mimepost.kind != MIMEKIND_NONE) {
+ /* Use the whole structure as data. */
+ data->set.mimepost.flags &= ~MIME_BODY_ONLY;
+
+ /* Add external headers and mime version. */
+ curl_mime_headers(&data->set.mimepost, data->set.headers, 0);
+ result = Curl_mime_prepare_headers(&data->set.mimepost, NULL,
+ NULL, MIMESTRATEGY_MAIL);
+
+ if(!result)
+ if(!Curl_checkheaders(conn, "Mime-Version"))
+ result = Curl_mime_add_header(&data->set.mimepost.curlheaders,
+ "Mime-Version: 1.0");
+
+ /* Make sure we will read the entire mime structure. */
+ if(!result)
+ result = Curl_mime_rewind(&data->set.mimepost);
+
+ if(result) {
+ free(from);
+ free(auth);
+ return result;
+ }
+
+ data->state.infilesize = Curl_mime_size(&data->set.mimepost);
+
+ /* Read from mime structure. */
+ data->state.fread_func = (curl_read_callback) Curl_mime_read;
+ data->state.in = (void *) &data->set.mimepost;
+ }
+
/* Calculate the optional SIZE parameter */
- if(conn->proto.smtpc.size_supported && conn->data->state.infilesize > 0) {
+ if(conn->proto.smtpc.size_supported && data->state.infilesize > 0) {
size = aprintf("%" CURL_FORMAT_CURL_OFF_T, data->state.infilesize);
if(!size) {
@@ -1155,11 +1188,15 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
if(!smtp || !pp->conn)
return CURLE_OK;
+ /* Cleanup our per-request based variables */
+ Curl_safefree(smtp->custom);
+
if(status) {
connclose(conn, "SMTP done with bad status"); /* marked for closure */
result = status; /* use the already set error code */
}
- else if(!data->set.connect_only && data->set.upload && data->set.mail_rcpt) {
+ else if(!data->set.connect_only && data->set.mail_rcpt &&
+ (data->set.upload || data->set.mimepost.kind)) {
/* Calculate the EOB taking into account any terminating CRLF from the
previous line of the email or the CRLF of the DATA command when there
is "no mail data". RFC-5321, sect. 4.1.1.4.
@@ -1196,7 +1233,7 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
}
else {
/* Successfully sent so adjust the response timeout relative to now */
- pp->response = Curl_tvnow();
+ pp->response = Curl_now();
free(eob);
}
@@ -1212,9 +1249,6 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
result = smtp_block_statemach(conn);
}
- /* Cleanup our per-request based variables */
- Curl_safefree(smtp->custom);
-
/* Clear the transfer mode for the next request */
smtp->transfer = FTPTRANSFER_BODY;
@@ -1249,7 +1283,7 @@ static CURLcode smtp_perform(struct connectdata *conn, bool *connected,
smtp->rcpt = data->set.mail_rcpt;
/* Start the first command in the DO phase */
- if(data->set.upload && data->set.mail_rcpt)
+ if((data->set.upload || data->set.mimepost.kind) && data->set.mail_rcpt)
/* MAIL transfer */
result = smtp_perform_mail(conn);
else
diff --git a/lib/socks.c b/lib/socks.c
index 000cd9c..ac4270e 100644
--- a/lib/socks.c
+++ b/lib/socks.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -57,7 +57,7 @@ int Curl_blockread_all(struct connectdata *conn, /* connection data */
ssize_t nread;
ssize_t allread = 0;
int result;
- time_t timeleft;
+ timediff_t timeleft;
*n = 0;
for(;;) {
timeleft = Curl_timeleft(conn->data, NULL, TRUE);
@@ -154,7 +154,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
/* DNS resolve only for SOCKS4, not SOCKS4a */
if(!protocol4a) {
struct Curl_dns_entry *dns;
- Curl_addrinfo *hp=NULL;
+ Curl_addrinfo *hp = NULL;
int rc;
rc = Curl_resolv(conn, hostname, remote_port, &dns);
@@ -171,7 +171,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
* returns a Curl_addrinfo pointer that may not always look the same.
*/
if(dns)
- hp=dns->addr;
+ hp = dns->addr;
if(hp) {
char buf[64];
Curl_printable_address(hp, buf, sizeof(buf));
@@ -213,7 +213,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
return CURLE_COULDNT_CONNECT;
}
/* copy the proxy name WITH trailing zero */
- memcpy(socksreq + 8, proxy_user, plen+1);
+ memcpy(socksreq + 8, proxy_user, plen + 1);
}
/*
@@ -306,7 +306,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
", request rejected or failed.",
(unsigned char)socksreq[4], (unsigned char)socksreq[5],
(unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[8] << 8) | (unsigned char)socksreq[9]),
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
(unsigned char)socksreq[1]);
return CURLE_COULDNT_CONNECT;
case 92:
@@ -316,7 +316,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
"identd on the client.",
(unsigned char)socksreq[4], (unsigned char)socksreq[5],
(unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[8] << 8) | (unsigned char)socksreq[9]),
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
(unsigned char)socksreq[1]);
return CURLE_COULDNT_CONNECT;
case 93:
@@ -326,7 +326,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
"report different user-ids.",
(unsigned char)socksreq[4], (unsigned char)socksreq[5],
(unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[8] << 8) | (unsigned char)socksreq[9]),
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
(unsigned char)socksreq[1]);
return CURLE_COULDNT_CONNECT;
default:
@@ -335,7 +335,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
", Unknown.",
(unsigned char)socksreq[4], (unsigned char)socksreq[5],
(unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[8] << 8) | (unsigned char)socksreq[9]),
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
(unsigned char)socksreq[1]);
return CURLE_COULDNT_CONNECT;
}
@@ -382,7 +382,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
CURLcode code;
curl_socket_t sock = conn->sock[sockindex];
struct Curl_easy *data = conn->data;
- time_t timeout;
+ timediff_t timeout;
bool socks5_resolve_local =
(conn->socks_proxy.proxytype == CURLPROXY_SOCKS5) ? TRUE : FALSE;
const size_t hostname_len = strlen(hostname);
@@ -483,7 +483,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
(void)curlx_nonblock(sock, FALSE);
- result=Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread);
+ result = Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread);
if(result || (actualread != 2)) {
failf(data, "Unable to receive initial SOCKS5 response.");
return CURLE_COULDNT_CONNECT;
@@ -542,7 +542,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
return CURLE_COULDNT_CONNECT;
}
- result=Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread);
+ result = Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread);
if(result || (actualread != 2)) {
failf(data, "Unable to receive SOCKS5 sub-negotiation response.");
return CURLE_COULDNT_CONNECT;
@@ -615,7 +615,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
* returns a Curl_addrinfo pointer that may not always look the same.
*/
if(dns)
- hp=dns->addr;
+ hp = dns->addr;
if(hp) {
int i;
char buf[64];
diff --git a/lib/socks_gssapi.c b/lib/socks_gssapi.c
index 54d0635..96948ac 100644
--- a/lib/socks_gssapi.c
+++ b/lib/socks_gssapi.c
@@ -5,8 +5,8 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009, 2011, Markus Moeller, <markus_moeller@compuserve.com>
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009, Markus Moeller, <markus_moeller@compuserve.com>
+ * Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -65,7 +65,7 @@ static int check_gss_err(struct Curl_easy *data,
&msg_ctx, &status_string);
if(maj_stat == GSS_S_COMPLETE) {
if(sizeof(buf) > len + status_string.length + 1) {
- strcpy(buf+len, (char *) status_string.value);
+ strcpy(buf + len, (char *) status_string.value);
len += status_string.length;
}
gss_release_buffer(&min_stat, &status_string);
@@ -74,7 +74,7 @@ static int check_gss_err(struct Curl_easy *data,
gss_release_buffer(&min_stat, &status_string);
}
if(sizeof(buf) > len + 3) {
- strcpy(buf+len, ".\n");
+ strcpy(buf + len, ".\n");
len += 2;
}
msg_ctx = 0;
@@ -86,7 +86,7 @@ static int check_gss_err(struct Curl_easy *data,
&msg_ctx, &status_string);
if(maj_stat == GSS_S_COMPLETE) {
if(sizeof(buf) > len + status_string.length)
- strcpy(buf+len, (char *) status_string.value);
+ strcpy(buf + len, (char *) status_string.value);
gss_release_buffer(&min_stat, &status_string);
break;
}
@@ -119,7 +119,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_name_t server = GSS_C_NO_NAME;
gss_name_t gss_client_name = GSS_C_NO_NAME;
unsigned short us_length;
- char *user=NULL;
+ char *user = NULL;
unsigned char socksreq[4]; /* room for GSS-API exchange header only */
const char *serviceptr = data->set.str[STRING_PROXY_SERVICE_NAME] ?
data->set.str[STRING_PROXY_SERVICE_NAME] : "rcmd";
@@ -146,11 +146,12 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
}
else {
service.value = malloc(serviceptr_length +
- strlen(conn->socks_proxy.host.name)+2);
+ strlen(conn->socks_proxy.host.name) + 2);
if(!service.value)
return CURLE_OUT_OF_MEMORY;
- service.length = serviceptr_length + strlen(conn->socks_proxy.host.name)+1;
- snprintf(service.value, service.length+1, "%s@%s",
+ service.length = serviceptr_length +
+ strlen(conn->socks_proxy.host.name) + 1;
+ snprintf(service.value, service.length + 1, "%s@%s",
serviceptr, conn->socks_proxy.host.name);
gss_major_status = gss_import_name(&gss_minor_status, &service,
@@ -196,7 +197,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
socksreq[0] = 1; /* GSS-API subnegotiation version */
socksreq[1] = 1; /* authentication message type */
us_length = htons((short)gss_send_token.length);
- memcpy(socksreq+2, &us_length, sizeof(short));
+ memcpy(socksreq + 2, &us_length, sizeof(short));
code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written);
if(code || (4 != written)) {
@@ -236,7 +237,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
* +----+------+-----+----------------+
*/
- result=Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread);
+ result = Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread);
if(result || (actualread != 4)) {
failf(data, "Failed to receive GSS-API authentication response.");
gss_release_name(&gss_status, &server);
@@ -261,11 +262,11 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
return CURLE_COULDNT_CONNECT;
}
- memcpy(&us_length, socksreq+2, sizeof(short));
+ memcpy(&us_length, socksreq + 2, sizeof(short));
us_length = ntohs(us_length);
- gss_recv_token.length=us_length;
- gss_recv_token.value=malloc(us_length);
+ gss_recv_token.length = us_length;
+ gss_recv_token.value = malloc(us_length);
if(!gss_recv_token.value) {
failf(data,
"Could not allocate memory for GSS-API authentication "
@@ -275,8 +276,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
return CURLE_OUT_OF_MEMORY;
}
- result=Curl_blockread_all(conn, sock, (char *)gss_recv_token.value,
- gss_recv_token.length, &actualread);
+ result = Curl_blockread_all(conn, sock, (char *)gss_recv_token.value,
+ gss_recv_token.length, &actualread);
if(result || (actualread != us_length)) {
failf(data, "Failed to receive GSS-API authentication token.");
@@ -312,7 +313,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
failf(data, "Failed to determine user name.");
return CURLE_COULDNT_CONNECT;
}
- user=malloc(gss_send_token.length+1);
+ user = malloc(gss_send_token.length + 1);
if(!user) {
gss_delete_sec_context(&gss_status, &gss_context, NULL);
gss_release_name(&gss_status, &gss_client_name);
@@ -326,7 +327,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_release_buffer(&gss_status, &gss_send_token);
infof(data, "SOCKS5 server authencticated user %s with GSS-API.\n",user);
free(user);
- user=NULL;
+ user = NULL;
/* Do encryption */
socksreq[0] = 1; /* GSS-API subnegotiation version */
@@ -341,7 +342,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_enc = 1;
infof(data, "SOCKS5 server supports GSS-API %s data protection.\n",
- (gss_enc==0)?"no":((gss_enc==1)?"integrity":"confidentiality"));
+ (gss_enc == 0)?"no":((gss_enc==1)?"integrity":"confidentiality"));
/* force for the moment to no data protection */
gss_enc = 0;
/*
@@ -376,7 +377,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
*/
if(data->set.socks5_gssapi_nec) {
us_length = htons((short)1);
- memcpy(socksreq+2, &us_length, sizeof(short));
+ memcpy(socksreq + 2, &us_length, sizeof(short));
}
else {
gss_send_token.length = 1;
@@ -401,7 +402,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_release_buffer(&gss_status, &gss_send_token);
us_length = htons((short)gss_w_token.length);
- memcpy(socksreq+2, &us_length, sizeof(short));
+ memcpy(socksreq + 2, &us_length, sizeof(short));
}
code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written);
@@ -433,7 +434,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_release_buffer(&gss_status, &gss_w_token);
}
- result=Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread);
+ result = Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread);
if(result || (actualread != 4)) {
failf(data, "Failed to receive GSS-API encryption response.");
gss_delete_sec_context(&gss_status, &gss_context, NULL);
@@ -455,17 +456,17 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
return CURLE_COULDNT_CONNECT;
}
- memcpy(&us_length, socksreq+2, sizeof(short));
+ memcpy(&us_length, socksreq + 2, sizeof(short));
us_length = ntohs(us_length);
- gss_recv_token.length= us_length;
- gss_recv_token.value=malloc(gss_recv_token.length);
+ gss_recv_token.length = us_length;
+ gss_recv_token.value = malloc(gss_recv_token.length);
if(!gss_recv_token.value) {
gss_delete_sec_context(&gss_status, &gss_context, NULL);
return CURLE_OUT_OF_MEMORY;
}
- result=Curl_blockread_all(conn, sock, (char *)gss_recv_token.value,
- gss_recv_token.length, &actualread);
+ result = Curl_blockread_all(conn, sock, (char *)gss_recv_token.value,
+ gss_recv_token.length, &actualread);
if(result || (actualread != us_length)) {
failf(data, "Failed to receive GSS-API encryptrion type.");
@@ -513,8 +514,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
}
infof(data, "SOCKS5 access with%s protection granted.\n",
- (socksreq[0]==0)?"out GSS-API data":
- ((socksreq[0]==1)?" GSS-API integrity":" GSS-API confidentiality"));
+ (socksreq[0] == 0)?"out GSS-API data":
+ ((socksreq[0] == 1)?" GSS-API integrity":" GSS-API confidentiality"));
conn->socks5_gssapi_enctype = socksreq[0];
if(socksreq[0] == 0)
diff --git a/lib/socks_sspi.c b/lib/socks_sspi.c
index edc73ad..34699d3 100644
--- a/lib/socks_sspi.c
+++ b/lib/socks_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2009, 2011, Markus Moeller, <markus_moeller@compuserve.com>
*
* This software is licensed as described in the file COPYING, which
@@ -108,7 +108,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
if(!service_name)
return CURLE_OUT_OF_MEMORY;
snprintf(service_name, service_length +
- strlen(conn->socks_proxy.host.name)+2, "%s/%s",
+ strlen(conn->socks_proxy.host.name) + 2, "%s/%s",
service, conn->socks_proxy.host.name);
}
@@ -199,7 +199,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
socksreq[0] = 1; /* GSS-API subnegotiation version */
socksreq[1] = 1; /* authentication message type */
us_length = htons((short)sspi_send_token.cbBuffer);
- memcpy(socksreq+2, &us_length, sizeof(short));
+ memcpy(socksreq + 2, &us_length, sizeof(short));
code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written);
if(code || (4 != written)) {
@@ -283,7 +283,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
return CURLE_COULDNT_CONNECT;
}
- memcpy(&us_length, socksreq+2, sizeof(short));
+ memcpy(&us_length, socksreq + 2, sizeof(short));
us_length = ntohs(us_length);
sspi_recv_token.cbBuffer = us_length;
@@ -341,7 +341,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_enc = 1;
infof(data, "SOCKS5 server supports GSS-API %s data protection.\n",
- (gss_enc==0)?"no":((gss_enc==1)?"integrity":"confidentiality") );
+ (gss_enc == 0)?"no":((gss_enc == 1)?"integrity":"confidentiality") );
/* force to no data protection, avoid encryption/decryption for now */
gss_enc = 0;
/*
@@ -377,7 +377,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
if(data->set.socks5_gssapi_nec) {
us_length = htons((short)1);
- memcpy(socksreq+2, &us_length, sizeof(short));
+ memcpy(socksreq + 2, &us_length, sizeof(short));
}
else {
status = s_pSecFn->QueryContextAttributes(&sspi_context,
@@ -445,8 +445,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
memcpy((PUCHAR) sspi_send_token.pvBuffer +(int)sspi_w_token[0].cbBuffer,
sspi_w_token[1].pvBuffer, sspi_w_token[1].cbBuffer);
memcpy((PUCHAR) sspi_send_token.pvBuffer
- +sspi_w_token[0].cbBuffer
- +sspi_w_token[1].cbBuffer,
+ + sspi_w_token[0].cbBuffer
+ + sspi_w_token[1].cbBuffer,
sspi_w_token[2].pvBuffer, sspi_w_token[2].cbBuffer);
s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer);
@@ -460,7 +460,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
sspi_w_token[2].cbBuffer = 0;
us_length = htons((short)sspi_send_token.cbBuffer);
- memcpy(socksreq+2, &us_length, sizeof(short));
+ memcpy(socksreq + 2, &us_length, sizeof(short));
}
code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written);
@@ -517,7 +517,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
return CURLE_COULDNT_CONNECT;
}
- memcpy(&us_length, socksreq+2, sizeof(short));
+ memcpy(&us_length, socksreq + 2, sizeof(short));
us_length = ntohs(us_length);
sspi_w_token[0].cbBuffer = us_length;
@@ -588,8 +588,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
}
infof(data, "SOCKS5 access with%s protection granted.\n",
- (socksreq[0]==0)?"out GSS-API data":
- ((socksreq[0]==1)?" GSS-API integrity":" GSS-API confidentiality"));
+ (socksreq[0] == 0)?"out GSS-API data":
+ ((socksreq[0] == 1)?" GSS-API integrity":" GSS-API confidentiality"));
/* For later use if encryption is required
conn->socks5_gssapi_enctype = socksreq[0];
diff --git a/lib/speedcheck.c b/lib/speedcheck.c
index fe669f1..3aeea91 100644
--- a/lib/speedcheck.c
+++ b/lib/speedcheck.c
@@ -46,7 +46,7 @@ CURLcode Curl_speedcheck(struct Curl_easy *data,
data->state.keeps_speed = now;
else {
/* how long has it been under the limit */
- time_t howlong = Curl_tvdiff(now, data->state.keeps_speed);
+ timediff_t howlong = Curl_timediff(now, data->state.keeps_speed);
if(howlong >= data->set.low_speed_time * 1000) {
/* too long */
diff --git a/lib/splay.c b/lib/splay.c
index 68ff9c5..69af446 100644
--- a/lib/splay.c
+++ b/lib/splay.c
@@ -110,7 +110,7 @@ struct Curl_tree *Curl_splayinsert(struct curltime i,
if(t != NULL) {
t = Curl_splay(i, t);
- if(compare(i, t->key)==0) {
+ if(compare(i, t->key) == 0) {
/* There already exists a node in the tree with the very same key. Build
a doubly-linked circular list of nodes. We add the new 'node' struct
to the end of this list. */
diff --git a/lib/splay.h b/lib/splay.h
index 0273bad..4612ec2 100644
--- a/lib/splay.h
+++ b/lib/splay.h
@@ -54,8 +54,8 @@ int Curl_splayremovebyaddr(struct Curl_tree *t,
struct Curl_tree *removenode,
struct Curl_tree **newroot);
-#define Curl_splaycomparekeys(i,j) ( ((i.tv_sec) < (j.tv_sec)) ? -1 : \
- ( ((i.tv_sec) > (j.tv_sec)) ? 1 : \
+#define Curl_splaycomparekeys(i,j) ( ((i.tv_sec) < (j.tv_sec)) ? -1 : \
+ ( ((i.tv_sec) > (j.tv_sec)) ? 1 : \
( ((i.tv_usec) < (j.tv_usec)) ? -1 : \
( ((i.tv_usec) > (j.tv_usec)) ? 1 : 0))))
diff --git a/lib/ssh.c b/lib/ssh.c
index 9443e24..2496e7c 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -428,14 +428,14 @@ static CURLcode ssh_getworkingpath(struct connectdata *conn,
/* Check for /~/, indicating relative to the user's home directory */
if(conn->handler->protocol & CURLPROTO_SCP) {
- real_path = malloc(working_path_len+1);
+ real_path = malloc(working_path_len + 1);
if(real_path == NULL) {
free(working_path);
return CURLE_OUT_OF_MEMORY;
}
if((working_path_len > 3) && (!memcmp(working_path, "/~/", 3)))
/* It is referenced to the home directory, so strip the leading '/~/' */
- memcpy(real_path, working_path+3, 4 + working_path_len-3);
+ memcpy(real_path, working_path + 3, 4 + working_path_len-3);
else
memcpy(real_path, working_path, 1 + working_path_len);
}
@@ -451,19 +451,19 @@ static CURLcode ssh_getworkingpath(struct connectdata *conn,
leading '/' */
memcpy(real_path, homedir, homelen);
real_path[homelen] = '/';
- real_path[homelen+1] = '\0';
+ real_path[homelen + 1] = '\0';
if(working_path_len > 3) {
- memcpy(real_path+homelen+1, working_path + 3,
+ memcpy(real_path + homelen + 1, working_path + 3,
1 + working_path_len -3);
}
}
else {
- real_path = malloc(working_path_len+1);
+ real_path = malloc(working_path_len + 1);
if(real_path == NULL) {
free(working_path);
return CURLE_OUT_OF_MEMORY;
}
- memcpy(real_path, working_path, 1+working_path_len);
+ memcpy(real_path, working_path, 1 + working_path_len);
}
}
@@ -1813,7 +1813,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
zero even though libssh2_sftp_open() failed previously! We need
to work around that! */
sshc->actualcode = CURLE_SSH;
- err=-1;
+ err = -1;
}
failf(data, "Upload failed: %s (%d/%d)",
err>= LIBSSH2_FX_OK?sftp_libssh2_strerror(err):"ssh error",
@@ -1831,7 +1831,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
if(seekerr != CURL_SEEKFUNC_OK) {
- curl_off_t passed=0;
+ curl_off_t passed = 0;
if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
failf(data, "Could not seek stream");
@@ -1983,13 +1983,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
sshc->actualcode = result?result:CURLE_SSH;
break;
}
- sshc->readdir_filename = malloc(PATH_MAX+1);
+ sshc->readdir_filename = malloc(PATH_MAX + 1);
if(!sshc->readdir_filename) {
state(conn, SSH_SFTP_CLOSE);
sshc->actualcode = CURLE_OUT_OF_MEMORY;
break;
}
- sshc->readdir_longentry = malloc(PATH_MAX+1);
+ sshc->readdir_longentry = malloc(PATH_MAX + 1);
if(!sshc->readdir_longentry) {
Curl_safefree(sshc->readdir_filename);
state(conn, SSH_SFTP_CLOSE);
@@ -2023,7 +2023,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
result = Curl_client_write(conn, CLIENTWRITE_BODY,
- tmpLine, sshc->readdir_len+1);
+ tmpLine, sshc->readdir_len + 1);
free(tmpLine);
if(result) {
@@ -2032,7 +2032,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
/* since this counts what we send to the client, we include the
newline in this counter */
- data->req.bytecount += sshc->readdir_len+1;
+ data->req.bytecount += sshc->readdir_len + 1;
/* output debug output if that is requested */
if(data->set.verbose) {
@@ -2233,18 +2233,25 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
curl_off_t from, to;
char *ptr;
char *ptr2;
+ CURLofft to_t;
+ CURLofft from_t;
- from=curlx_strtoofft(conn->data->state.range, &ptr, 0);
- while(*ptr && (ISSPACE(*ptr) || (*ptr=='-')))
+ from_t = curlx_strtoofft(conn->data->state.range, &ptr, 0, &from);
+ if(from_t == CURL_OFFT_FLOW)
+ return CURLE_RANGE_ERROR;
+ while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
ptr++;
- to=curlx_strtoofft(ptr, &ptr2, 0);
- if((ptr == ptr2) /* no "to" value given */
+ to_t = curlx_strtoofft(ptr, &ptr2, 0, &to);
+ if(to_t == CURL_OFFT_FLOW)
+ return CURLE_RANGE_ERROR;
+ if((to_t == CURL_OFFT_INVAL) /* no "to" value given */
|| (to >= size)) {
to = size - 1;
}
- if(from < 0) {
+ if(from_t) {
/* from is relative to end of file */
- from += size;
+ from = size - to;
+ to = size - 1;
}
if(from > size) {
failf(data, "Offset (%"
@@ -2340,8 +2347,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
sshc->sftp_handle = NULL;
}
- if(sftp_scp)
- Curl_safefree(sftp_scp->path);
+
+ Curl_safefree(sftp_scp->path);
DEBUGF(infof(data, "SFTP DONE done\n"));
@@ -2826,8 +2833,8 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
while((sshc->state != SSH_STOP) && !result) {
bool block;
- time_t left = 1000;
- struct curltime now = Curl_tvnow();
+ timediff_t left = 1000;
+ struct curltime now = Curl_now();
result = ssh_statemach_act(conn, &block);
if(result)
@@ -2935,6 +2942,13 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done)
return CURLE_FAILED_INIT;
}
+ if(data->set.ssh_compression) {
+#if LIBSSH2_VERSION_NUM >= 0x010208
+ if(libssh2_session_flag(ssh->ssh_session, LIBSSH2_FLAG_COMPRESS, 1) < 0)
+#endif
+ infof(data, "Failed to enable compression for ssh session\n");
+ }
+
#ifdef HAVE_LIBSSH2_KNOWNHOST_API
if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
int rc;
@@ -3031,8 +3045,8 @@ static CURLcode ssh_do(struct connectdata *conn, bool *done)
data->req.size = -1; /* make sure this is unknown at this point */
sshc->actualcode = CURLE_OK; /* reset error code */
- sshc->secondCreateDirs =0; /* reset the create dir attempt state
- variable */
+ sshc->secondCreateDirs = 0; /* reset the create dir attempt state
+ variable */
Curl_pgrsSetUploadCounter(data, 0);
Curl_pgrsSetDownloadCounter(data, 0);
diff --git a/lib/strcase.c b/lib/strcase.c
index a74a4be..24bcca9 100644
--- a/lib/strcase.c
+++ b/lib/strcase.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -94,10 +94,11 @@ char Curl_raw_toupper(char in)
}
/*
- * Curl_raw_equal() is for doing "raw" case insensitive strings. This is meant
- * to be locale independent and only compare strings we know are safe for
- * this. See https://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for
- * some further explanation to why this function is necessary.
+ * Curl_strcasecompare() is for doing "raw" case insensitive strings. This is
+ * meant to be locale independent and only compare strings we know are safe
+ * for this. See
+ * https://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for some
+ * further explanation to why this function is necessary.
*
* The function is capable of comparing a-z case insensitively even for
* non-ascii.
diff --git a/lib/strdup.c b/lib/strdup.c
index 136b693..19cb044 100644
--- a/lib/strdup.c
+++ b/lib/strdup.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,11 +44,11 @@ char *curlx_strdup(const char *str)
if(len >= ((size_t)-1) / sizeof(char))
return (char *)NULL;
- newstr = malloc((len+1)*sizeof(char));
+ newstr = malloc((len + 1)*sizeof(char));
if(!newstr)
return (char *)NULL;
- memcpy(newstr, str, (len+1)*sizeof(char));
+ memcpy(newstr, str, (len + 1)*sizeof(char));
return newstr;
diff --git a/lib/strtoofft.c b/lib/strtoofft.c
index c2adc72..3636477 100644
--- a/lib/strtoofft.c
+++ b/lib/strtoofft.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -20,6 +20,7 @@
*
***************************************************************************/
+#include <errno.h>
#include "curl_setup.h"
#include "strtoofft.h"
@@ -32,7 +33,29 @@
* https://www.opengroup.org/onlinepubs/009695399/functions/strtoimax.html
*/
-#ifdef NEED_CURL_STRTOLL
+#if (SIZEOF_CURL_OFF_T > SIZEOF_LONG)
+# ifdef HAVE_STRTOLL
+# define strtooff strtoll
+# else
+# if defined(_MSC_VER) && (_MSC_VER >= 1300) && (_INTEGRAL_MAX_BITS >= 64)
+# if defined(_SAL_VERSION)
+ _Check_return_ _CRTIMP __int64 __cdecl _strtoi64(
+ _In_z_ const char *_String,
+ _Out_opt_ _Deref_post_z_ char **_EndPtr, _In_ int _Radix);
+# else
+ _CRTIMP __int64 __cdecl _strtoi64(const char *_String,
+ char **_EndPtr, int _Radix);
+# endif
+# define strtooff _strtoi64
+# else
+# define PRIVATE_STRTOOFF 1
+# endif
+# endif
+#else
+# define strtooff strtol
+#endif
+
+#ifdef PRIVATE_STRTOOFF
/* Range tests can be used for alphanum decoding if characters are consecutive,
like in ASCII. Else an array is scanned. Determine this condition now. */
@@ -48,11 +71,10 @@ static const char valchars[] =
static int get_char(char c, int base);
/**
- * Emulated version of the strtoll function. This extracts a long long
+ * Custom version of the strtooff function. This extracts a curl_off_t
* value from the given input string and returns it.
*/
-curl_off_t
-curlx_strtoll(const char *nptr, char **endptr, int base)
+static curl_off_t strtooff(const char *nptr, char **endptr, int base)
{
char *end;
int is_negative = 0;
@@ -186,3 +208,37 @@ static int get_char(char c, int base)
return value;
}
#endif /* Only present if we need strtoll, but don't have it. */
+
+/*
+ * Parse a *positive* up to 64 bit number written in ascii.
+ */
+CURLofft curlx_strtoofft(const char *str, char **endp, int base,
+ curl_off_t *num)
+{
+ char *end;
+ curl_off_t number;
+ errno = 0;
+ *num = 0; /* clear by default */
+
+ DEBUGASSERT(str);
+
+ while(*str && ISSPACE(*str))
+ str++;
+ if('-' == *str) {
+ if(endp)
+ *endp = (char *)str; /* didn't actually move */
+ return CURL_OFFT_INVAL; /* nothing parsed */
+ }
+ number = strtooff(str, &end, base);
+ if(endp)
+ *endp = end;
+ if(errno == ERANGE)
+ /* overflow/underflow */
+ return CURL_OFFT_FLOW;
+ else if(str == end)
+ /* nothing parsed */
+ return CURL_OFFT_INVAL;
+
+ *num = number;
+ return CURL_OFFT_OK;
+}
diff --git a/lib/strtoofft.h b/lib/strtoofft.h
index f4039f3..244411a 100644
--- a/lib/strtoofft.h
+++ b/lib/strtoofft.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,31 +40,7 @@
* of 'long' the conversion function to use is strtol().
*/
-#if (CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG)
-# ifdef HAVE_STRTOLL
-# define curlx_strtoofft strtoll
-# else
-# if defined(_MSC_VER) && (_MSC_VER >= 1300) && (_INTEGRAL_MAX_BITS >= 64)
-# if defined(_SAL_VERSION)
- _Check_return_ _CRTIMP __int64 __cdecl _strtoi64(
- _In_z_ const char *_String,
- _Out_opt_ _Deref_post_z_ char **_EndPtr, _In_ int _Radix);
-# else
- _CRTIMP __int64 __cdecl _strtoi64(const char *_String,
- char **_EndPtr, int _Radix);
-# endif
-# define curlx_strtoofft _strtoi64
-# else
- curl_off_t curlx_strtoll(const char *nptr, char **endptr, int base);
-# define curlx_strtoofft curlx_strtoll
-# define NEED_CURL_STRTOLL 1
-# endif
-# endif
-#else
-# define curlx_strtoofft strtol
-#endif
-
-#if (CURL_SIZEOF_CURL_OFF_T == 4)
+#if (SIZEOF_CURL_OFF_T == 4)
# define CURL_OFF_T_MAX CURL_OFF_T_C(0x7FFFFFFF)
#else
/* assume CURL_SIZEOF_CURL_OFF_T == 8 */
@@ -72,4 +48,13 @@
#endif
#define CURL_OFF_T_MIN (-CURL_OFF_T_MAX - CURL_OFF_T_C(1))
+typedef enum {
+ CURL_OFFT_OK, /* parsed fine */
+ CURL_OFFT_FLOW, /* over or underflow */
+ CURL_OFFT_INVAL /* nothing was parsed */
+} CURLofft;
+
+CURLofft curlx_strtoofft(const char *str, char **endp, int base,
+ curl_off_t *num);
+
#endif /* HEADER_CURL_STRTOOFFT_H */
diff --git a/lib/telnet.c b/lib/telnet.c
index 3dec959..48b134e 100644
--- a/lib/telnet.c
+++ b/lib/telnet.c
@@ -76,7 +76,7 @@
} WHILE_FALSE
#define CURL_SB_ACCUM(x,c) \
do { \
- if(x->subpointer < (x->subbuffer+sizeof x->subbuffer)) \
+ if(x->subpointer < (x->subbuffer + sizeof x->subbuffer)) \
*x->subpointer++ = (c); \
} WHILE_FALSE
@@ -295,8 +295,8 @@ static void negotiate(struct connectdata *conn)
int i;
struct TELNET *tn = (struct TELNET *) conn->data->req.protop;
- for(i = 0;i < CURL_NTELOPTS;i++) {
- if(i==CURL_TELOPT_ECHO)
+ for(i = 0; i < CURL_NTELOPTS; i++) {
+ if(i == CURL_TELOPT_ECHO)
continue;
if(tn->us_preferred[i] == CURL_YES)
@@ -792,7 +792,7 @@ static void printsub(struct Curl_easy *data,
case CURL_TELOPT_NEW_ENVIRON:
if(pointer[1] == CURL_TELQUAL_IS) {
infof(data, " ");
- for(i = 3;i < length;i++) {
+ for(i = 3; i < length; i++) {
switch(pointer[i]) {
case CURL_NEW_ENV_VAR:
infof(data, ", ");
@@ -843,7 +843,7 @@ static CURLcode check_telnet_options(struct connectdata *conn)
tn->us_preferred[CURL_TELOPT_NEW_ENVIRON] = CURL_YES;
}
- for(head = data->set.telnet_options; head; head=head->next) {
+ for(head = data->set.telnet_options; head; head = head->next) {
if(sscanf(head->data, "%127[^= ]%*[ =]%255s",
option_keyword, option_arg) == 2) {
@@ -890,8 +890,8 @@ static CURLcode check_telnet_options(struct connectdata *conn)
/* To take care or not of the 8th bit in data exchange */
if(strcasecompare(option_keyword, "BINARY")) {
- binary_option=atoi(option_arg);
- if(binary_option!=1) {
+ binary_option = atoi(option_arg);
+ if(binary_option != 1) {
tn->us_preferred[CURL_TELOPT_BINARY] = CURL_NO;
tn->him_preferred[CURL_TELOPT_BINARY] = CURL_NO;
}
@@ -935,7 +935,7 @@ static void suboption(struct connectdata *conn)
struct Curl_easy *data = conn->data;
struct TELNET *tn = (struct TELNET *)data->req.protop;
- printsub(data, '<', (unsigned char *)tn->subbuffer, CURL_SB_LEN(tn)+2);
+ printsub(data, '<', (unsigned char *)tn->subbuffer, CURL_SB_LEN(tn) + 2);
switch(CURL_SB_GET(tn)) {
case CURL_TELOPT_TTYPE:
len = strlen(tn->subopt_ttype) + 4 + 2;
@@ -967,7 +967,7 @@ static void suboption(struct connectdata *conn)
CURL_TELQUAL_IS);
len = 4;
- for(v = tn->telnet_vars;v;v = v->next) {
+ for(v = tn->telnet_vars; v; v = v->next) {
tmplen = (strlen(v->data) + 1);
/* Add the variable only if it fits */
if(len + tmplen < (int)sizeof(temp)-6) {
@@ -1019,8 +1019,8 @@ static void sendsuboption(struct connectdata *conn, int option)
CURL_SB_ACCUM(tn, CURL_TELOPT_NAWS);
/* We must deal either with litte or big endian processors */
/* Window size must be sent according to the 'network order' */
- x=htons(tn->subopt_wsx);
- y=htons(tn->subopt_wsy);
+ x = htons(tn->subopt_wsx);
+ y = htons(tn->subopt_wsy);
uc1 = (unsigned char *)&x;
uc2 = (unsigned char *)&y;
CURL_SB_ACCUM(tn, uc1[0]);
@@ -1033,7 +1033,7 @@ static void sendsuboption(struct connectdata *conn, int option)
CURL_SB_TERM(tn);
/* data suboption is now ready */
- printsub(data, '>', (unsigned char *)tn->subbuffer+2,
+ printsub(data, '>', (unsigned char *)tn->subbuffer + 2,
CURL_SB_LEN(tn)-2);
/* we send the header of the suboption... */
@@ -1044,9 +1044,9 @@ static void sendsuboption(struct connectdata *conn, int option)
}
/* ... then the window size with the send_telnet_data() function
to deal with 0xFF cases ... */
- send_telnet_data(conn, (char *)tn->subbuffer+3, 4);
+ send_telnet_data(conn, (char *)tn->subbuffer + 3, 4);
/* ... and the footer */
- bytes_written = swrite(conn->sock[FIRSTSOCKET], tn->subbuffer+7, 2);
+ bytes_written = swrite(conn->sock[FIRSTSOCKET], tn->subbuffer + 7, 2);
if(bytes_written < 0) {
err = SOCKERRNO;
failf(data, "Sending data failed (%d)", err);
@@ -1064,7 +1064,7 @@ CURLcode telrcv(struct connectdata *conn,
unsigned char c;
CURLcode result;
int in = 0;
- int startwrite=-1;
+ int startwrite = -1;
struct Curl_easy *data = conn->data;
struct TELNET *tn = (struct TELNET *)data->req.protop;
@@ -1560,8 +1560,8 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
}
if(data->set.timeout) {
- now = Curl_tvnow();
- if(Curl_tvdiff(now, conn->created) >= data->set.timeout) {
+ now = Curl_now();
+ if(Curl_timediff(now, conn->created) >= data->set.timeout) {
failf(data, "Time-out");
result = CURLE_OPERATION_TIMEDOUT;
keepon = FALSE;
@@ -1678,8 +1678,8 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
} /* poll switch statement */
if(data->set.timeout) {
- now = Curl_tvnow();
- if(Curl_tvdiff(now, conn->created) >= data->set.timeout) {
+ now = Curl_now();
+ if(Curl_timediff(now, conn->created) >= data->set.timeout) {
failf(data, "Time-out");
result = CURLE_OPERATION_TIMEDOUT;
keepon = FALSE;
diff --git a/lib/tftp.c b/lib/tftp.c
index f6f4bce..20dc600 100644
--- a/lib/tftp.c
+++ b/lib/tftp.c
@@ -76,12 +76,12 @@
#define TFTP_OPTION_INTERVAL "timeout"
typedef enum {
- TFTP_MODE_NETASCII=0,
+ TFTP_MODE_NETASCII = 0,
TFTP_MODE_OCTET
} tftp_mode_t;
typedef enum {
- TFTP_STATE_START=0,
+ TFTP_STATE_START = 0,
TFTP_STATE_RX,
TFTP_STATE_TX,
TFTP_STATE_FIN
@@ -100,7 +100,7 @@ typedef enum {
} tftp_event_t;
typedef enum {
- TFTP_ERR_UNDEF=0,
+ TFTP_ERR_UNDEF = 0,
TFTP_ERR_NOTFOUND,
TFTP_ERR_PERM,
TFTP_ERR_DISKFULL,
@@ -200,7 +200,7 @@ const struct Curl_handler Curl_handler_tftp = {
static CURLcode tftp_set_timeouts(tftp_state_data_t *state)
{
time_t maxtime, timeout;
- time_t timeout_ms;
+ timediff_t timeout_ms;
bool start = (state->state == TFTP_STATE_START) ? TRUE : FALSE;
time(&state->start_time);
@@ -217,7 +217,7 @@ static CURLcode tftp_set_timeouts(tftp_state_data_t *state)
if(start) {
maxtime = (time_t)(timeout_ms + 500) / 1000;
- state->max_time = state->start_time+maxtime;
+ state->max_time = state->start_time + maxtime;
/* Set per-block timeout to total */
timeout = maxtime;
@@ -232,7 +232,7 @@ static CURLcode tftp_set_timeouts(tftp_state_data_t *state)
/* Compute the re-start interval to suit the timeout */
state->retry_time = (int)timeout/state->retry_max;
if(state->retry_time<1)
- state->retry_time=1;
+ state->retry_time = 1;
}
else {
@@ -241,7 +241,7 @@ static CURLcode tftp_set_timeouts(tftp_state_data_t *state)
else
maxtime = 3600;
- state->max_time = state->start_time+maxtime;
+ state->max_time = state->start_time + maxtime;
/* Set per-block timeout to total */
timeout = maxtime;
@@ -251,15 +251,15 @@ static CURLcode tftp_set_timeouts(tftp_state_data_t *state)
}
/* But bound the total number */
if(state->retry_max<3)
- state->retry_max=3;
+ state->retry_max = 3;
if(state->retry_max>50)
- state->retry_max=50;
+ state->retry_max = 50;
/* Compute the re-ACK interval to suit the timeout */
state->retry_time = (int)(timeout/state->retry_max);
if(state->retry_time<1)
- state->retry_time=1;
+ state->retry_time = 1;
infof(state->conn->data,
"set timeouts for state %d; Total %ld, retry %d maxtry %d\n",
@@ -321,7 +321,7 @@ static const char *tftp_option_get(const char *buf, size_t len,
return NULL;
*option = buf;
- loc += Curl_strnlen(buf+loc, len-loc);
+ loc += Curl_strnlen(buf + loc, len-loc);
loc++; /* NULL term */
if(loc > len)
@@ -475,7 +475,7 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
/* If we are uploading, send an WRQ */
setpacketevent(&state->spacket, TFTP_EVENT_WRQ);
state->conn->data->req.upload_fromhere =
- (char *)state->spacket.data+4;
+ (char *)state->spacket.data + 4;
if(data->state.infilesize != -1)
Curl_pgrsSetUploadSize(data, data->state.infilesize);
}
@@ -493,10 +493,11 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
if(strlen(filename) > (state->blksize - strlen(mode) - 4)) {
failf(data, "TFTP file name too long\n");
+ free(filename);
return CURLE_TFTP_ILLEGAL; /* too long file name field */
}
- snprintf((char *)state->spacket.data+2,
+ snprintf((char *)state->spacket.data + 2,
state->blksize,
"%s%c%s%c", filename, '\0', mode, '\0');
sbytes = 4 + strlen(filename) + strlen(mode);
@@ -511,25 +512,25 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
strcpy(buf, "0"); /* the destination is large enough */
sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data+sbytes,
+ (char *)state->spacket.data + sbytes,
TFTP_OPTION_TSIZE);
sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data+sbytes, buf);
+ (char *)state->spacket.data + sbytes, buf);
/* add blksize option */
snprintf(buf, sizeof(buf), "%d", state->requested_blksize);
sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data+sbytes,
+ (char *)state->spacket.data + sbytes,
TFTP_OPTION_BLKSIZE);
sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data+sbytes, buf);
+ (char *)state->spacket.data + sbytes, buf);
/* add timeout option */
snprintf(buf, sizeof(buf), "%d", state->retry_time);
sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data+sbytes,
+ (char *)state->spacket.data + sbytes,
TFTP_OPTION_INTERVAL);
sbytes += tftp_option_add(state, sbytes,
- (char *)state->spacket.data+sbytes, buf);
+ (char *)state->spacket.data + sbytes, buf);
}
/* the typecase for the 3rd argument is mostly for systems that do
@@ -575,7 +576,7 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
/* the next blocknum is x + 1 but it needs to wrap at an unsigned 16bit
boundary */
-#define NEXT_BLOCKNUM(x) (((x)+1)&0xffff)
+#define NEXT_BLOCKNUM(x) (((x) + 1)&0xffff)
/**********************************************************
*
@@ -626,7 +627,7 @@ static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event)
}
/* Check if completed (That is, a less than full packet is received) */
- if(state->rbytes < (ssize_t)state->blksize+4) {
+ if(state->rbytes < (ssize_t)state->blksize + 4) {
state->state = TFTP_STATE_FIN;
}
else {
@@ -742,7 +743,7 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
else {
/* Re-send the data packet */
sbytes = sendto(state->sockfd, (void *)state->spacket.data,
- 4+state->sbytes, SEND_4TH_ARG,
+ 4 + state->sbytes, SEND_4TH_ARG,
(struct sockaddr *)&state->remote_addr,
state->remote_addrlen);
/* Check all sbytes were sent */
@@ -775,7 +776,7 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
* data block.
* */
state->sbytes = 0;
- state->conn->data->req.upload_fromhere = (char *)state->spacket.data+4;
+ state->conn->data->req.upload_fromhere = (char *)state->spacket.data + 4;
do {
result = Curl_fillreadbuffer(state->conn, state->blksize - state->sbytes,
&cb);
@@ -812,7 +813,7 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
else {
/* Re-send the data packet */
sbytes = sendto(state->sockfd, (void *)state->spacket.data,
- 4+state->sbytes, SEND_4TH_ARG,
+ 4 + state->sbytes, SEND_4TH_ARG,
(struct sockaddr *)&state->remote_addr,
state->remote_addrlen);
/* Check all sbytes were sent */
@@ -1108,11 +1109,11 @@ static CURLcode tftp_receive_packet(struct connectdata *conn)
fromlen = sizeof(fromaddr);
state->rbytes = (int)recvfrom(state->sockfd,
(void *)state->rpacket.data,
- state->blksize+4,
+ state->blksize + 4,
0,
(struct sockaddr *)&fromaddr,
&fromlen);
- if(state->remote_addrlen==0) {
+ if(state->remote_addrlen == 0) {
memcpy(&state->remote_addr, &fromaddr, fromlen);
state->remote_addrlen = fromlen;
}
@@ -1134,7 +1135,7 @@ static CURLcode tftp_receive_packet(struct connectdata *conn)
if(state->rbytes > 4 &&
(NEXT_BLOCKNUM(state->block) == getrpacketblock(&state->rpacket))) {
result = Curl_client_write(conn, CLIENTWRITE_BODY,
- (char *)state->rpacket.data+4,
+ (char *)state->rpacket.data + 4,
state->rbytes-4);
if(result) {
tftp_state_machine(state, TFTP_EVENT_ERROR);
@@ -1148,14 +1149,14 @@ static CURLcode tftp_receive_packet(struct connectdata *conn)
{
unsigned short error = getrpacketblock(&state->rpacket);
state->error = (tftp_error_t)error;
- infof(data, "%s\n", (const char *)state->rpacket.data+4);
+ infof(data, "%s\n", (const char *)state->rpacket.data + 4);
break;
}
case TFTP_EVENT_ACK:
break;
case TFTP_EVENT_OACK:
result = tftp_parse_option_ack(state,
- (const char *)state->rpacket.data+2,
+ (const char *)state->rpacket.data + 2,
state->rbytes-2);
if(result)
return result;
@@ -1199,7 +1200,7 @@ static long tftp_state_timeout(struct connectdata *conn, tftp_event_t *event)
state->state = TFTP_STATE_FIN;
return 0;
}
- if(current > state->rx_time+state->retry_time) {
+ if(current > state->rx_time + state->retry_time) {
if(event)
*event = TFTP_EVENT_TIMEOUT;
time(&state->rx_time); /* update even though we received nothing */
@@ -1292,7 +1293,7 @@ static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done)
if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
else
- result = Curl_speedcheck(conn->data, Curl_tvnow());
+ result = Curl_speedcheck(conn->data, Curl_now());
}
return result;
}
diff --git a/lib/timeval.c b/lib/timeval.c
index d7207b3..66f923a 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -24,7 +24,7 @@
#if defined(WIN32) && !defined(MSDOS)
-struct curltime curlx_tvnow(void)
+struct curltime Curl_now(void)
{
/*
** GetTickCount() is available on _all_ Windows versions from W95 up
@@ -48,7 +48,7 @@ struct curltime curlx_tvnow(void)
#elif defined(HAVE_CLOCK_GETTIME_MONOTONIC)
-struct curltime curlx_tvnow(void)
+struct curltime Curl_now(void)
{
/*
** clock_gettime() is granted to be increased monotonically when the
@@ -84,9 +84,40 @@ struct curltime curlx_tvnow(void)
return cnow;
}
+#elif defined(HAVE_MACH_ABSOLUTE_TIME)
+
+#include <stdint.h>
+#include <mach/mach_time.h>
+
+struct curltime Curl_now(void)
+{
+ /*
+ ** Monotonic timer on Mac OS is provided by mach_absolute_time(), which
+ ** returns time in Mach "absolute time units," which are platform-dependent.
+ ** To convert to nanoseconds, one must use conversion factors specified by
+ ** mach_timebase_info().
+ */
+ static mach_timebase_info_data_t timebase;
+ struct curltime cnow;
+ uint64_t usecs;
+
+ if(0 == timebase.denom)
+ (void) mach_timebase_info(&timebase);
+
+ usecs = mach_absolute_time();
+ usecs *= timebase.numer;
+ usecs /= timebase.denom;
+ usecs /= 1000;
+
+ cnow.tv_sec = usecs / 1000000;
+ cnow.tv_usec = usecs % 1000000;
+
+ return cnow;
+}
+
#elif defined(HAVE_GETTIMEOFDAY)
-struct curltime curlx_tvnow(void)
+struct curltime Curl_now(void)
{
/*
** gettimeofday() is not granted to be increased monotonically, due to
@@ -103,7 +134,7 @@ struct curltime curlx_tvnow(void)
#else
-struct curltime curlx_tvnow(void)
+struct curltime Curl_now(void)
{
/*
** time() returns the value of time in seconds since the Epoch.
@@ -116,47 +147,40 @@ struct curltime curlx_tvnow(void)
#endif
+#if SIZEOF_TIME_T < 8
+#define TIME_MAX INT_MAX
+#define TIME_MIN INT_MIN
+#else
+#define TIME_MAX 9223372036854775807LL
+#define TIME_MIN -9223372036854775807LL
+#endif
+
/*
- * Make sure that the first argument is the more recent time, as otherwise
- * we'll get a weird negative time-diff back...
- *
- * Returns: the time difference in number of milliseconds. For large diffs it
- * returns 0x7fffffff on 32bit time_t systems.
+ * Returns: time difference in number of milliseconds. For too large diffs it
+ * returns max value.
*
* @unittest: 1323
*/
-time_t curlx_tvdiff(struct curltime newer, struct curltime older)
+timediff_t Curl_timediff(struct curltime newer, struct curltime older)
{
-#if SIZEOF_TIME_T < 8
- /* for 32bit time_t systems, add a precaution to avoid overflow for really
- big time differences */
- time_t diff = newer.tv_sec-older.tv_sec;
- if(diff >= (0x7fffffff/1000))
- return 0x7fffffff;
-#endif
- return (newer.tv_sec-older.tv_sec)*1000+
- (int)(newer.tv_usec-older.tv_usec)/1000;
+ timediff_t diff = newer.tv_sec-older.tv_sec;
+ if(diff >= (TIME_MAX/1000))
+ return TIME_MAX;
+ else if(diff <= (TIME_MIN/1000))
+ return TIME_MIN;
+ return diff * 1000 + (newer.tv_usec-older.tv_usec)/1000;
}
/*
- * Make sure that the first argument is the more recent time, as otherwise
- * we'll get a weird negative time-diff back...
- *
- * Returns: the time difference in number of microseconds. For too large diffs
- * it returns max value.
+ * Returns: time difference in number of microseconds. For too large diffs it
+ * returns max value.
*/
-time_t Curl_tvdiff_us(struct curltime newer, struct curltime older)
+timediff_t Curl_timediff_us(struct curltime newer, struct curltime older)
{
- time_t diff = newer.tv_sec-older.tv_sec;
-#if SIZEOF_TIME_T < 8
- /* for 32bit time_t systems */
- if(diff >= (0x7fffffff/1000000))
- return 0x7fffffff;
-#else
- /* for 64bit time_t systems */
- if(diff >= (0x7fffffffffffffffLL/1000000))
- return 0x7fffffffffffffffLL;
-#endif
- return (newer.tv_sec-older.tv_sec)*1000000+
- (int)(newer.tv_usec-older.tv_usec);
+ timediff_t diff = newer.tv_sec-older.tv_sec;
+ if(diff >= (TIME_MAX/1000000))
+ return TIME_MAX;
+ else if(diff <= (TIME_MIN/1000000))
+ return TIME_MIN;
+ return diff * 1000000 + newer.tv_usec-older.tv_usec;
}
diff --git a/lib/timeval.h b/lib/timeval.h
index 1ee4b30..fb3f680 100644
--- a/lib/timeval.h
+++ b/lib/timeval.h
@@ -22,19 +22,20 @@
*
***************************************************************************/
-/*
- * CAUTION: this header is designed to work when included by the app-side
- * as well as the library. Do not mix with library internals!
- */
-
#include "curl_setup.h"
+#if SIZEOF_TIME_T < 8
+typedef int timediff_t;
+#else
+typedef curl_off_t timediff_t;
+#endif
+
struct curltime {
- time_t tv_sec; /* seconds */
- unsigned int tv_usec; /* microseconds */
+ time_t tv_sec; /* seconds */
+ int tv_usec; /* microseconds */
};
-struct curltime curlx_tvnow(void);
+struct curltime Curl_now(void);
/*
* Make sure that the first argument (t1) is the more recent time and t2 is
@@ -42,7 +43,7 @@ struct curltime curlx_tvnow(void);
*
* Returns: the time difference in number of milliseconds.
*/
-time_t curlx_tvdiff(struct curltime t1, struct curltime t2);
+timediff_t Curl_timediff(struct curltime t1, struct curltime t2);
/*
* Make sure that the first argument (t1) is the more recent time and t2 is
@@ -50,12 +51,6 @@ time_t curlx_tvdiff(struct curltime t1, struct curltime t2);
*
* Returns: the time difference in number of microseconds.
*/
-time_t Curl_tvdiff_us(struct curltime newer, struct curltime older);
-
-/* These two defines below exist to provide the older API for library
- internals only. */
-#define Curl_tvnow() curlx_tvnow()
-#define Curl_tvdiff(x,y) curlx_tvdiff(x,y)
+timediff_t Curl_timediff_us(struct curltime newer, struct curltime older);
#endif /* HEADER_CURL_TIMEVAL_H */
-
diff --git a/lib/transfer.c b/lib/transfer.c
index 3537b58..8f15b1a 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -73,12 +73,38 @@
#include "connect.h"
#include "non-ascii.h"
#include "http2.h"
+#include "mime.h"
+#include "strcase.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
+#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_SMTP) || \
+ !defined(CURL_DISABLE_IMAP)
+/*
+ * checkheaders() checks the linked list of custom headers for a
+ * particular header (prefix).
+ *
+ * Returns a pointer to the first matching header or NULL if none matched.
+ */
+char *Curl_checkheaders(const struct connectdata *conn,
+ const char *thisheader)
+{
+ struct curl_slist *head;
+ size_t thislen = strlen(thisheader);
+ struct Curl_easy *data = conn->data;
+
+ for(head = data->set.headers; head; head = head->next) {
+ if(strncasecompare(head->data, thisheader, thislen))
+ return head->data;
+ }
+
+ return NULL;
+}
+#endif
+
/*
* This function will call the read callback to fill our buffer with data
* to upload.
@@ -195,27 +221,30 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp)
strlen(endofline_network));
#ifdef CURL_DOES_CONVERSIONS
- CURLcode result;
- int length;
- if(data->set.prefer_ascii) {
- /* translate the protocol and data */
- length = nread;
- }
- else {
- /* just translate the protocol portion */
- length = strlen(hexbuffer);
+ {
+ CURLcode result;
+ int length;
+ if(data->set.prefer_ascii)
+ /* translate the protocol and data */
+ length = nread;
+ else
+ /* just translate the protocol portion */
+ length = (int)strlen(hexbuffer);
+ result = Curl_convert_to_network(data, data->req.upload_fromhere,
+ length);
+ /* Curl_convert_to_network calls failf if unsuccessful */
+ if(result)
+ return result;
}
- result = Curl_convert_to_network(data, data->req.upload_fromhere, length);
- /* Curl_convert_to_network calls failf if unsuccessful */
- if(result)
- return result;
#endif /* CURL_DOES_CONVERSIONS */
- if((nread - hexlen) == 0)
+ if((nread - hexlen) == 0) {
/* mark this as done once this chunk is transferred */
data->req.upload_done = TRUE;
+ infof(data, "Signaling end of chunked upload via terminating chunk.\n");
+ }
- nread+=(int)strlen(endofline_native); /* for the added end of line */
+ nread += (int)strlen(endofline_native); /* for the added end of line */
}
#ifdef CURL_DOES_CONVERSIONS
else if((data->set.prefer_ascii) && (!sending_http_headers)) {
@@ -241,6 +270,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp)
CURLcode Curl_readrewind(struct connectdata *conn)
{
struct Curl_easy *data = conn->data;
+ curl_mimepart *mimepart = &data->set.mimepost;
conn->bits.rewindaftersend = FALSE; /* we rewind now */
@@ -253,9 +283,21 @@ CURLcode Curl_readrewind(struct connectdata *conn)
/* We have sent away data. If not using CURLOPT_POSTFIELDS or
CURLOPT_HTTPPOST, call app to rewind
*/
- if(data->set.postfields ||
- (data->set.httpreq == HTTPREQ_POST_FORM))
+ if(conn->handler->protocol & PROTO_FAMILY_HTTP) {
+ struct HTTP *http = data->req.protop;
+
+ if(http->sendit)
+ mimepart = http->sendit;
+ }
+ if(data->set.postfields)
; /* do nothing */
+ else if(data->set.httpreq == HTTPREQ_POST_MIME ||
+ data->set.httpreq == HTTPREQ_POST_FORM) {
+ if(Curl_mime_rewind(mimepart)) {
+ failf(data, "Cannot rewind mime/post data");
+ return CURLE_SEND_FAIL_REWIND;
+ }
+ }
else {
if(data->set.seek_func) {
int err;
@@ -450,7 +492,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
if(k->exp100 > EXP100_SEND_DATA)
/* set time stamp to compare with when waiting for the 100 */
- k->start100 = Curl_tvnow();
+ k->start100 = Curl_now();
}
*didwhat |= KEEP_RECV;
@@ -560,7 +602,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
infof(data, "Ignoring the response-body\n");
}
if(data->state.resume_from && !k->content_range &&
- (data->set.httpreq==HTTPREQ_GET) &&
+ (data->set.httpreq == HTTPREQ_GET) &&
!k->ignorebody) {
if(k->size == data->state.resume_from) {
@@ -737,48 +779,19 @@ static CURLcode readwrite_data(struct Curl_easy *data,
in http_chunks.c.
Make sure that ALL_CONTENT_ENCODINGS contains all the
encodings handled here. */
-#ifdef HAVE_LIBZ
- switch(conn->data->set.http_ce_skip ?
- IDENTITY : k->auto_decoding) {
- case IDENTITY:
-#endif
- /* This is the default when the server sends no
- Content-Encoding header. See Curl_readwrite_init; the
- memset() call initializes k->auto_decoding to zero. */
+ if(conn->data->set.http_ce_skip || !k->writer_stack) {
if(!k->ignorebody) {
-
#ifndef CURL_DISABLE_POP3
- if(conn->handler->protocol&PROTO_FAMILY_POP3)
+ if(conn->handler->protocol & PROTO_FAMILY_POP3)
result = Curl_pop3_write(conn, k->str, nread);
else
#endif /* CURL_DISABLE_POP3 */
-
result = Curl_client_write(conn, CLIENTWRITE_BODY, k->str,
nread);
}
-#ifdef HAVE_LIBZ
- break;
-
- case DEFLATE:
- /* Assume CLIENTWRITE_BODY; headers are not encoded. */
- if(!k->ignorebody)
- result = Curl_unencode_deflate_write(conn, k, nread);
- break;
-
- case GZIP:
- /* Assume CLIENTWRITE_BODY; headers are not encoded. */
- if(!k->ignorebody)
- result = Curl_unencode_gzip_write(conn, k, nread);
- break;
-
- default:
- failf(data, "Unrecognized content encoding type. "
- "libcurl understands `identity', `deflate' and `gzip' "
- "content encodings.");
- result = CURLE_BAD_CONTENT_ENCODING;
- break;
}
-#endif
+ else
+ result = Curl_unencode_write(conn, k->writer_stack, k->str, nread);
}
k->badheader = HEADER_NORMAL; /* taken care of now */
@@ -885,7 +898,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
go into the Expect: 100 state and await such a header */
k->exp100 = EXP100_AWAITING_CONTINUE; /* wait for the header */
k->keepon &= ~KEEP_SEND; /* disable writing */
- k->start100 = Curl_tvnow(); /* timeout count starts now */
+ k->start100 = Curl_now(); /* timeout count starts now */
*didwhat &= ~KEEP_SEND; /* we didn't write anything actually */
/* set a timeout for the multi interface */
@@ -915,7 +928,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
/* this is a paused transfer */
break;
}
- if(nread<=0) {
+ if(nread <= 0) {
result = done_sending(conn, k);
if(result)
return result;
@@ -1006,7 +1019,8 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
k->writebytecount += bytes_written;
- if(k->writebytecount == data->state.infilesize) {
+ if((!k->upload_chunky || k->forbidchunk) &&
+ (k->writebytecount == data->state.infilesize)) {
/* we have sent all data we were supposed to */
k->upload_done = TRUE;
infof(data, "We are completely uploaded and fine\n");
@@ -1055,7 +1069,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
{
struct SingleRequest *k = &data->req;
CURLcode result;
- int didwhat=0;
+ int didwhat = 0;
curl_socket_t fd_read;
curl_socket_t fd_write;
@@ -1110,7 +1124,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
return result;
}
- k->now = Curl_tvnow();
+ k->now = Curl_now();
if(didwhat) {
/* Update read/write counters */
if(k->bytecountp)
@@ -1134,7 +1148,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
*/
- time_t ms = Curl_tvdiff(k->now, k->start100);
+ timediff_t ms = Curl_timediff(k->now, k->start100);
if(ms >= data->set.expect_100_timeout) {
/* we've waited long enough, continue anyway */
k->exp100 = EXP100_SEND_DATA;
@@ -1158,13 +1172,14 @@ CURLcode Curl_readwrite(struct connectdata *conn,
failf(data, "Operation timed out after %ld milliseconds with %"
CURL_FORMAT_CURL_OFF_T " out of %"
CURL_FORMAT_CURL_OFF_T " bytes received",
- Curl_tvdiff(k->now, data->progress.t_startsingle), k->bytecount,
- k->size);
+ Curl_timediff(k->now, data->progress.t_startsingle),
+ k->bytecount, k->size);
}
else {
failf(data, "Operation timed out after %ld milliseconds with %"
CURL_FORMAT_CURL_OFF_T " bytes received",
- Curl_tvdiff(k->now, data->progress.t_startsingle), k->bytecount);
+ Curl_timediff(k->now, data->progress.t_startsingle),
+ k->bytecount);
}
return CURLE_OPERATION_TIMEDOUT;
}
@@ -1303,7 +1318,8 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
if(result)
return result;
- data->set.followlocation=0; /* reset the location-follow counter */
+ data->state.wildcardmatch = data->set.wildcard_enabled;
+ data->set.followlocation = 0; /* reset the location-follow counter */
data->state.this_is_a_follow = FALSE; /* reset this */
data->state.errorbuf = FALSE; /* no error has occurred */
data->state.httpversion = 0; /* don't assume any particular server version */
@@ -1345,7 +1361,7 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
#endif
Curl_initinfo(data); /* reset session-specific information "variables" */
- Curl_pgrsResetTimesSizes(data);
+ Curl_pgrsResetTransferSizes(data);
Curl_pgrsStartNow(data);
if(data->set.timeout)
@@ -1360,7 +1376,7 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
data->state.authhost.picked &= data->state.authhost.want;
data->state.authproxy.picked &= data->state.authproxy.want;
- if(data->set.wildcardmatch) {
+ if(data->state.wildcardmatch) {
struct WildcardData *wc = &data->wildcard;
if(wc->state < CURLWC_INIT) {
result = Curl_wildcard_init(wc); /* init wildcard structures */
@@ -1427,14 +1443,14 @@ static const char *find_host_sep(const char *url)
static size_t strlen_url(const char *url, bool relative)
{
const unsigned char *ptr;
- size_t newlen=0;
- bool left=TRUE; /* left side of the ? */
+ size_t newlen = 0;
+ bool left = TRUE; /* left side of the ? */
const unsigned char *host_sep = (const unsigned char *) url;
if(!relative)
host_sep = (const unsigned char *) find_host_sep(url);
- for(ptr=(unsigned char *)url; *ptr; ptr++) {
+ for(ptr = (unsigned char *)url; *ptr; ptr++) {
if(ptr < host_sep) {
++newlen;
@@ -1443,7 +1459,7 @@ static size_t strlen_url(const char *url, bool relative)
switch(*ptr) {
case '?':
- left=FALSE;
+ left = FALSE;
/* fall through */
default:
if(*ptr >= 0x80)
@@ -1452,7 +1468,7 @@ static size_t strlen_url(const char *url, bool relative)
break;
case ' ':
if(left)
- newlen+=3;
+ newlen += 3;
else
newlen++;
break;
@@ -1469,7 +1485,7 @@ static size_t strlen_url(const char *url, bool relative)
static void strcpy_url(char *output, const char *url, bool relative)
{
/* we must add this with whitespace-replacing */
- bool left=TRUE;
+ bool left = TRUE;
const unsigned char *iptr;
char *optr = output;
const unsigned char *host_sep = (const unsigned char *) url;
@@ -1488,7 +1504,7 @@ static void strcpy_url(char *output, const char *url, bool relative)
switch(*iptr) {
case '?':
- left=FALSE;
+ left = FALSE;
/* fall through */
default:
if(*iptr >= 0x80) {
@@ -1509,7 +1525,7 @@ static void strcpy_url(char *output, const char *url, bool relative)
break;
}
}
- *optr=0; /* zero terminate output buffer */
+ *optr = 0; /* zero terminate output buffer */
}
@@ -1548,26 +1564,26 @@ static char *concat_url(const char *base, const char *relurl)
/* we must make our own copy of the URL to play with, as it may
point to read-only data */
- char *url_clone=strdup(base);
+ char *url_clone = strdup(base);
if(!url_clone)
return NULL; /* skip out of this NOW */
/* protsep points to the start of the host name */
- protsep=strstr(url_clone, "//");
+ protsep = strstr(url_clone, "//");
if(!protsep)
- protsep=url_clone;
+ protsep = url_clone;
else
- protsep+=2; /* pass the slashes */
+ protsep += 2; /* pass the slashes */
if('/' != relurl[0]) {
- int level=0;
+ int level = 0;
/* First we need to find out if there's a ?-letter in the URL,
and cut it and the right-side of that off */
pathsep = strchr(protsep, '?');
if(pathsep)
- *pathsep=0;
+ *pathsep = 0;
/* we have a relative path to append to the last slash if there's one
available, or if the new URL is just a query string (starts with a
@@ -1576,14 +1592,14 @@ static char *concat_url(const char *base, const char *relurl)
if(useurl[0] != '?') {
pathsep = strrchr(protsep, '/');
if(pathsep)
- *pathsep=0;
+ *pathsep = 0;
}
/* Check if there's any slash after the host name, and if so, remember
that position instead */
pathsep = strchr(protsep, '/');
if(pathsep)
- protsep = pathsep+1;
+ protsep = pathsep + 1;
else
protsep = NULL;
@@ -1591,13 +1607,13 @@ static char *concat_url(const char *base, const char *relurl)
and act accordingly */
if((useurl[0] == '.') && (useurl[1] == '/'))
- useurl+=2; /* just skip the "./" */
+ useurl += 2; /* just skip the "./" */
while((useurl[0] == '.') &&
(useurl[1] == '.') &&
(useurl[2] == '/')) {
level++;
- useurl+=3; /* pass the "../" */
+ useurl += 3; /* pass the "../" */
}
if(protsep) {
@@ -1605,9 +1621,9 @@ static char *concat_url(const char *base, const char *relurl)
/* cut off one more level from the right of the original URL */
pathsep = strrchr(protsep, '/');
if(pathsep)
- *pathsep=0;
+ *pathsep = 0;
else {
- *protsep=0;
+ *protsep = 0;
break;
}
}
@@ -1619,7 +1635,7 @@ static char *concat_url(const char *base, const char *relurl)
if((relurl[0] == '/') && (relurl[1] == '/')) {
/* the new URL starts with //, just keep the protocol part from the
original one */
- *protsep=0;
+ *protsep = 0;
useurl = &relurl[2]; /* we keep the slashes from the original, so we
skip the new ones */
host_changed = TRUE;
@@ -1635,7 +1651,7 @@ static char *concat_url(const char *base, const char *relurl)
char *sep = strchr(protsep, '?');
if(sep && (sep < pathsep))
pathsep = sep;
- *pathsep=0;
+ *pathsep = 0;
}
else {
/* There was no slash. Now, since we might be operating on a badly
@@ -1644,7 +1660,7 @@ static char *concat_url(const char *base, const char *relurl)
?-letter as well! */
pathsep = strchr(protsep, '?');
if(pathsep)
- *pathsep=0;
+ *pathsep = 0;
}
}
}
@@ -1735,7 +1751,7 @@ CURLcode Curl_follow(struct Curl_easy *data,
}
}
- if(!is_absolute_url(newurl)) {
+ if(!is_absolute_url(newurl)) {
/***
*DANG* this is an RFC 2068 violation. The URL is supposed
to be absolute and this doesn't seem to be that!
@@ -1754,7 +1770,7 @@ CURLcode Curl_follow(struct Curl_easy *data,
/* This is an absolute URL, don't allow the custom port number */
disallowport = TRUE;
- newest = malloc(newlen+1); /* get memory for this */
+ newest = malloc(newlen + 1); /* get memory for this */
if(!newest)
return CURLE_OUT_OF_MEMORY;
@@ -1826,7 +1842,8 @@ CURLcode Curl_follow(struct Curl_easy *data,
* can be overridden with CURLOPT_POSTREDIR.
*/
if((data->set.httpreq == HTTPREQ_POST
- || data->set.httpreq == HTTPREQ_POST_FORM)
+ || data->set.httpreq == HTTPREQ_POST_FORM
+ || data->set.httpreq == HTTPREQ_POST_MIME)
&& !(data->set.keep_post & CURL_REDIR_POST_301)) {
infof(data, "Switch from POST to GET\n");
data->set.httpreq = HTTPREQ_GET;
@@ -1850,7 +1867,8 @@ CURLcode Curl_follow(struct Curl_easy *data,
* can be overridden with CURLOPT_POSTREDIR.
*/
if((data->set.httpreq == HTTPREQ_POST
- || data->set.httpreq == HTTPREQ_POST_FORM)
+ || data->set.httpreq == HTTPREQ_POST_FORM
+ || data->set.httpreq == HTTPREQ_POST_MIME)
&& !(data->set.keep_post & CURL_REDIR_POST_302)) {
infof(data, "Switch from POST to GET\n");
data->set.httpreq = HTTPREQ_GET;
@@ -1883,7 +1901,7 @@ CURLcode Curl_follow(struct Curl_easy *data,
break;
}
Curl_pgrsTime(data, TIMER_REDIRECT);
- Curl_pgrsResetTimesSizes(data);
+ Curl_pgrsResetTransferSizes(data);
return CURLE_OK;
#endif /* CURL_DISABLE_HTTP */
@@ -2007,7 +2025,7 @@ Curl_setup_transfer(
(http->sending == HTTPSEND_BODY)) {
/* wait with write until we either got 100-continue or a timeout */
k->exp100 = EXP100_AWAITING_CONTINUE;
- k->start100 = Curl_tvnow();
+ k->start100 = Curl_now();
/* Set a timeout for the multi interface. Add the inaccuracy margin so
that we don't fire slightly too early and get denied to run. */
diff --git a/lib/transfer.h b/lib/transfer.h
index 5189672..72526a8 100644
--- a/lib/transfer.h
+++ b/lib/transfer.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,6 +22,9 @@
*
***************************************************************************/
+char *Curl_checkheaders(const struct connectdata *conn,
+ const char *thisheader);
+
void Curl_init_CONNECT(struct Curl_easy *data);
CURLcode Curl_pretransfer(struct Curl_easy *data);
diff --git a/lib/url.c b/lib/url.c
index 71d4d8b..47f69c9 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -71,6 +71,7 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "netrc.h"
#include "formdata.h"
+#include "mime.h"
#include "vtls/vtls.h"
#include "hostip.h"
#include "transfer.h"
@@ -119,6 +120,8 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "pipeline.h"
#include "dotdot.h"
#include "strdup.h"
+#include "setopt.h"
+
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -135,15 +138,8 @@ static CURLcode parse_url_login(struct Curl_easy *data,
struct connectdata *conn,
char **userptr, char **passwdptr,
char **optionsptr);
-static CURLcode parse_login_details(const char *login, const size_t len,
- char **userptr, char **passwdptr,
- char **optionsptr);
static unsigned int get_protocol_family(unsigned int protocol);
-#define READBUFFER_SIZE CURL_MAX_WRITE_SIZE
-#define READBUFFER_MAX CURL_MAX_READ_SIZE
-#define READBUFFER_MIN 1024
-
/* Some parts of the code (e.g. chunked encoding) assume this buffer has at
* more than just a few bytes to play with. Don't let it become too small or
* bad things will happen.
@@ -284,7 +280,7 @@ void Curl_freeset(struct Curl_easy *data)
{
/* Free all dynamic strings stored in the data->set substructure. */
enum dupstring i;
- for(i=(enum dupstring)0; i < STRING_LAST; i++) {
+ for(i = (enum dupstring)0; i < STRING_LAST; i++) {
Curl_safefree(data->set.str[i]);
}
@@ -300,98 +296,6 @@ void Curl_freeset(struct Curl_easy *data)
data->change.url = NULL;
}
-static CURLcode setstropt(char **charp, const char *s)
-{
- /* Release the previous storage at `charp' and replace by a dynamic storage
- copy of `s'. Return CURLE_OK or CURLE_OUT_OF_MEMORY. */
-
- Curl_safefree(*charp);
-
- if(s) {
- char *str = strdup(s);
-
- if(!str)
- return CURLE_OUT_OF_MEMORY;
-
- *charp = str;
- }
-
- return CURLE_OK;
-}
-
-static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
-{
- CURLcode result = CURLE_OK;
- char *user = NULL;
- char *passwd = NULL;
-
- /* Parse the login details if specified. It not then we treat NULL as a hint
- to clear the existing data */
- if(option) {
- result = parse_login_details(option, strlen(option),
- (userp ? &user : NULL),
- (passwdp ? &passwd : NULL),
- NULL);
- }
-
- if(!result) {
- /* Store the username part of option if required */
- if(userp) {
- if(!user && option && option[0] == ':') {
- /* Allocate an empty string instead of returning NULL as user name */
- user = strdup("");
- if(!user)
- result = CURLE_OUT_OF_MEMORY;
- }
-
- Curl_safefree(*userp);
- *userp = user;
- }
-
- /* Store the password part of option if required */
- if(passwdp) {
- Curl_safefree(*passwdp);
- *passwdp = passwd;
- }
- }
-
- return result;
-}
-
-CURLcode Curl_dupset(struct Curl_easy *dst, struct Curl_easy *src)
-{
- CURLcode result = CURLE_OK;
- enum dupstring i;
-
- /* Copy src->set into dst->set first, then deal with the strings
- afterwards */
- dst->set = src->set;
-
- /* clear all string pointers first */
- memset(dst->set.str, 0, STRING_LAST * sizeof(char *));
-
- /* duplicate all strings */
- for(i=(enum dupstring)0; i< STRING_LASTZEROTERMINATED; i++) {
- result = setstropt(&dst->set.str[i], src->set.str[i]);
- if(result)
- return result;
- }
-
- /* duplicate memory areas pointed to */
- i = STRING_COPYPOSTFIELDS;
- if(src->set.postfieldsize && src->set.str[i]) {
- /* postfieldsize is curl_off_t, Curl_memdup() takes a size_t ... */
- dst->set.str[i] = Curl_memdup(src->set.str[i],
- curlx_sotouz(src->set.postfieldsize));
- if(!dst->set.str[i])
- return CURLE_OUT_OF_MEMORY;
- /* point to the new copy */
- dst->set.postfields = dst->set.str[i];
- }
-
- return CURLE_OK;
-}
-
/*
* This is the internal function curl_easy_cleanup() calls. This should
* cleanup and free all resources associated with this sessionhandle.
@@ -479,6 +383,8 @@ CURLcode Curl_close(struct Curl_easy *data)
Curl_http2_cleanup_dependencies(data);
Curl_convert_close(data);
+ Curl_mime_cleanpart(&data->set.mimepost);
+
/* No longer a dirty share, if it exists */
if(data->share) {
Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
@@ -486,12 +392,8 @@ CURLcode Curl_close(struct Curl_easy *data)
Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
}
- if(data->set.wildcardmatch) {
- /* destruct wildcard structures if it is needed */
- struct WildcardData *wc = &data->wildcard;
- Curl_wildcard_dtor(wc);
- }
-
+ /* destruct wildcard structures if it is needed */
+ Curl_wildcard_dtor(&data->wildcard);
Curl_freeset(data);
free(data);
return CURLE_OK;
@@ -588,25 +490,25 @@ CURLcode Curl_init_userdefined(struct UserDefined *set)
/* This is our preferred CA cert bundle/path since install time */
#if defined(CURL_CA_BUNDLE)
- result = setstropt(&set->str[STRING_SSL_CAFILE_ORIG], CURL_CA_BUNDLE);
+ result = Curl_setstropt(&set->str[STRING_SSL_CAFILE_ORIG], CURL_CA_BUNDLE);
if(result)
return result;
- result = setstropt(&set->str[STRING_SSL_CAFILE_PROXY], CURL_CA_BUNDLE);
+ result = Curl_setstropt(&set->str[STRING_SSL_CAFILE_PROXY], CURL_CA_BUNDLE);
if(result)
return result;
#endif
#if defined(CURL_CA_PATH)
- result = setstropt(&set->str[STRING_SSL_CAPATH_ORIG], CURL_CA_PATH);
+ result = Curl_setstropt(&set->str[STRING_SSL_CAPATH_ORIG], CURL_CA_PATH);
if(result)
return result;
- result = setstropt(&set->str[STRING_SSL_CAPATH_PROXY], CURL_CA_PATH);
+ result = Curl_setstropt(&set->str[STRING_SSL_CAPATH_PROXY], CURL_CA_PATH);
if(result)
return result;
#endif
- set->wildcardmatch = FALSE;
+ set->wildcard_enabled = FALSE;
set->chunk_bgn = ZERO_NULL;
set->chunk_end = ZERO_NULL;
@@ -667,30 +569,31 @@ CURLcode Curl_open(struct Curl_easy **curl)
DEBUGF(fprintf(stderr, "Error: malloc of buffer failed\n"));
result = CURLE_OUT_OF_MEMORY;
}
-
- data->state.headerbuff = malloc(HEADERSIZE);
- if(!data->state.headerbuff) {
- DEBUGF(fprintf(stderr, "Error: malloc of headerbuff failed\n"));
- result = CURLE_OUT_OF_MEMORY;
- }
else {
- result = Curl_init_userdefined(&data->set);
-
- data->state.headersize=HEADERSIZE;
+ Curl_mime_initpart(&data->set.mimepost, data);
- Curl_convert_init(data);
+ data->state.headerbuff = malloc(HEADERSIZE);
+ if(!data->state.headerbuff) {
+ DEBUGF(fprintf(stderr, "Error: malloc of headerbuff failed\n"));
+ result = CURLE_OUT_OF_MEMORY;
+ }
+ else {
+ result = Curl_init_userdefined(&data->set);
- Curl_initinfo(data);
+ data->state.headersize = HEADERSIZE;
+ Curl_convert_init(data);
+ Curl_initinfo(data);
- /* most recent connection is not yet defined */
- data->state.lastconnect = NULL;
+ /* most recent connection is not yet defined */
+ data->state.lastconnect = NULL;
- data->progress.flags |= PGRS_HIDE;
- data->state.current_speed = -1; /* init to negative == impossible */
- data->set.fnmatch = ZERO_NULL;
- data->set.maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */
+ data->progress.flags |= PGRS_HIDE;
+ data->state.current_speed = -1; /* init to negative == impossible */
+ data->set.fnmatch = ZERO_NULL;
+ data->set.maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */
- Curl_http2_init_state(&data->state);
+ Curl_http2_init_state(&data->state);
+ }
}
if(result) {
@@ -707,2244 +610,6 @@ CURLcode Curl_open(struct Curl_easy **curl)
return result;
}
-#define C_SSLVERSION_VALUE(x) (x & 0xffff)
-#define C_SSLVERSION_MAX_VALUE(x) (x & 0xffff0000)
-
-CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
- va_list param)
-{
- char *argptr;
- CURLcode result = CURLE_OK;
- long arg;
-#ifndef CURL_DISABLE_HTTP
- curl_off_t bigsize;
-#endif
-
- switch(option) {
- case CURLOPT_DNS_CACHE_TIMEOUT:
- data->set.dns_cache_timeout = va_arg(param, long);
- break;
- case CURLOPT_DNS_USE_GLOBAL_CACHE:
- /* remember we want this enabled */
- arg = va_arg(param, long);
- data->set.global_dns_cache = (0 != arg) ? TRUE : FALSE;
- break;
- case CURLOPT_SSL_CIPHER_LIST:
- /* set a list of cipher we want to use in the SSL connection */
- result = setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_ORIG],
- va_arg(param, char *));
- break;
- case CURLOPT_PROXY_SSL_CIPHER_LIST:
- /* set a list of cipher we want to use in the SSL connection for proxy */
- result = setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_PROXY],
- va_arg(param, char *));
- break;
-
- case CURLOPT_RANDOM_FILE:
- /*
- * This is the path name to a file that contains random data to seed
- * the random SSL stuff with. The file is only used for reading.
- */
- result = setstropt(&data->set.str[STRING_SSL_RANDOM_FILE],
- va_arg(param, char *));
- break;
- case CURLOPT_EGDSOCKET:
- /*
- * The Entropy Gathering Daemon socket pathname
- */
- result = setstropt(&data->set.str[STRING_SSL_EGDSOCKET],
- va_arg(param, char *));
- break;
- case CURLOPT_MAXCONNECTS:
- /*
- * Set the absolute number of maximum simultaneous alive connection that
- * libcurl is allowed to have.
- */
- data->set.maxconnects = va_arg(param, long);
- break;
- case CURLOPT_FORBID_REUSE:
- /*
- * When this transfer is done, it must not be left to be reused by a
- * subsequent transfer but shall be closed immediately.
- */
- data->set.reuse_forbid = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_FRESH_CONNECT:
- /*
- * This transfer shall not use a previously cached connection but
- * should be made with a fresh new connect!
- */
- data->set.reuse_fresh = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_VERBOSE:
- /*
- * Verbose means infof() calls that give a lot of information about
- * the connection and transfer procedures as well as internal choices.
- */
- data->set.verbose = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_HEADER:
- /*
- * Set to include the header in the general data output stream.
- */
- data->set.include_header = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_NOPROGRESS:
- /*
- * Shut off the internal supported progress meter
- */
- data->set.hide_progress = (0 != va_arg(param, long)) ? TRUE : FALSE;
- if(data->set.hide_progress)
- data->progress.flags |= PGRS_HIDE;
- else
- data->progress.flags &= ~PGRS_HIDE;
- break;
- case CURLOPT_NOBODY:
- /*
- * Do not include the body part in the output data stream.
- */
- data->set.opt_no_body = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_FAILONERROR:
- /*
- * Don't output the >=400 error code HTML-page, but instead only
- * return error.
- */
- data->set.http_fail_on_error = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_KEEP_SENDING_ON_ERROR:
- data->set.http_keep_sending_on_error = (0 != va_arg(param, long)) ?
- TRUE : FALSE;
- break;
- case CURLOPT_UPLOAD:
- case CURLOPT_PUT:
- /*
- * We want to sent data to the remote host. If this is HTTP, that equals
- * using the PUT request.
- */
- data->set.upload = (0 != va_arg(param, long)) ? TRUE : FALSE;
- if(data->set.upload) {
- /* If this is HTTP, PUT is what's needed to "upload" */
- data->set.httpreq = HTTPREQ_PUT;
- data->set.opt_no_body = FALSE; /* this is implied */
- }
- else
- /* In HTTP, the opposite of upload is GET (unless NOBODY is true as
- then this can be changed to HEAD later on) */
- data->set.httpreq = HTTPREQ_GET;
- break;
- case CURLOPT_REQUEST_TARGET:
- result = setstropt(&data->set.str[STRING_TARGET],
- va_arg(param, char *));
- break;
- case CURLOPT_FILETIME:
- /*
- * Try to get the file time of the remote document. The time will
- * later (possibly) become available using curl_easy_getinfo().
- */
- data->set.get_filetime = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_FTP_CREATE_MISSING_DIRS:
- /*
- * An FTP option that modifies an upload to create missing directories on
- * the server.
- */
- switch(va_arg(param, long)) {
- case 0:
- data->set.ftp_create_missing_dirs = 0;
- break;
- case 1:
- data->set.ftp_create_missing_dirs = 1;
- break;
- case 2:
- data->set.ftp_create_missing_dirs = 2;
- break;
- default:
- /* reserve other values for future use */
- result = CURLE_UNKNOWN_OPTION;
- break;
- }
- break;
- case CURLOPT_SERVER_RESPONSE_TIMEOUT:
- /*
- * Option that specifies how quickly an server response must be obtained
- * before it is considered failure. For pingpong protocols.
- */
- data->set.server_response_timeout = va_arg(param, long) * 1000;
- break;
- case CURLOPT_TFTP_NO_OPTIONS:
- /*
- * Option that prevents libcurl from sending TFTP option requests to the
- * server.
- */
- data->set.tftp_no_options = va_arg(param, long) != 0;
- break;
- case CURLOPT_TFTP_BLKSIZE:
- /*
- * TFTP option that specifies the block size to use for data transmission.
- */
- data->set.tftp_blksize = va_arg(param, long);
- break;
- case CURLOPT_DIRLISTONLY:
- /*
- * An option that changes the command to one that asks for a list
- * only, no file info details.
- */
- data->set.ftp_list_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_APPEND:
- /*
- * We want to upload and append to an existing file.
- */
- data->set.ftp_append = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_FTP_FILEMETHOD:
- /*
- * How do access files over FTP.
- */
- data->set.ftp_filemethod = (curl_ftpfile)va_arg(param, long);
- break;
- case CURLOPT_NETRC:
- /*
- * Parse the $HOME/.netrc file
- */
- data->set.use_netrc = (enum CURL_NETRC_OPTION)va_arg(param, long);
- break;
- case CURLOPT_NETRC_FILE:
- /*
- * Use this file instead of the $HOME/.netrc file
- */
- result = setstropt(&data->set.str[STRING_NETRC_FILE],
- va_arg(param, char *));
- break;
- case CURLOPT_TRANSFERTEXT:
- /*
- * This option was previously named 'FTPASCII'. Renamed to work with
- * more protocols than merely FTP.
- *
- * Transfer using ASCII (instead of BINARY).
- */
- data->set.prefer_ascii = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_TIMECONDITION:
- /*
- * Set HTTP time condition. This must be one of the defines in the
- * curl/curl.h header file.
- */
- data->set.timecondition = (curl_TimeCond)va_arg(param, long);
- break;
- case CURLOPT_TIMEVALUE:
- /*
- * This is the value to compare with the remote document with the
- * method set with CURLOPT_TIMECONDITION
- */
- data->set.timevalue = (time_t)va_arg(param, long);
- break;
- case CURLOPT_SSLVERSION:
- /*
- * Set explicit SSL version to try to connect with, as some SSL
- * implementations are lame.
- */
-#ifdef USE_SSL
- arg = va_arg(param, long);
- data->set.ssl.primary.version = C_SSLVERSION_VALUE(arg);
- data->set.ssl.primary.version_max = C_SSLVERSION_MAX_VALUE(arg);
-#else
- result = CURLE_UNKNOWN_OPTION;
-#endif
- break;
- case CURLOPT_PROXY_SSLVERSION:
- /*
- * Set explicit SSL version to try to connect with for proxy, as some SSL
- * implementations are lame.
- */
-#ifdef USE_SSL
- arg = va_arg(param, long);
- data->set.proxy_ssl.primary.version = C_SSLVERSION_VALUE(arg);
- data->set.proxy_ssl.primary.version_max = C_SSLVERSION_MAX_VALUE(arg);
-#else
- result = CURLE_UNKNOWN_OPTION;
-#endif
- break;
-
-#ifndef CURL_DISABLE_HTTP
- case CURLOPT_AUTOREFERER:
- /*
- * Switch on automatic referer that gets set if curl follows locations.
- */
- data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_ACCEPT_ENCODING:
- /*
- * String to use at the value of Accept-Encoding header.
- *
- * If the encoding is set to "" we use an Accept-Encoding header that
- * encompasses all the encodings we support.
- * If the encoding is set to NULL we don't send an Accept-Encoding header
- * and ignore an received Content-Encoding header.
- *
- */
- argptr = va_arg(param, char *);
- result = setstropt(&data->set.str[STRING_ENCODING],
- (argptr && !*argptr)?
- ALL_CONTENT_ENCODINGS: argptr);
- break;
-
- case CURLOPT_TRANSFER_ENCODING:
- data->set.http_transfer_encoding = (0 != va_arg(param, long)) ?
- TRUE : FALSE;
- break;
-
- case CURLOPT_FOLLOWLOCATION:
- /*
- * Follow Location: header hints on a HTTP-server.
- */
- data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_UNRESTRICTED_AUTH:
- /*
- * Send authentication (user+password) when following locations, even when
- * hostname changed.
- */
- data->set.http_disable_hostname_check_before_authentication =
- (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_MAXREDIRS:
- /*
- * The maximum amount of hops you allow curl to follow Location:
- * headers. This should mostly be used to detect never-ending loops.
- */
- data->set.maxredirs = va_arg(param, long);
- break;
-
- case CURLOPT_POSTREDIR:
- {
- /*
- * Set the behaviour of POST when redirecting
- * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302
- * CURL_REDIR_POST_301 - POST is kept as POST after 301
- * CURL_REDIR_POST_302 - POST is kept as POST after 302
- * CURL_REDIR_POST_303 - POST is kept as POST after 303
- * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
- * other - POST is kept as POST after 301 and 302
- */
- arg = va_arg(param, long);
- data->set.keep_post = arg & CURL_REDIR_POST_ALL;
- }
- break;
-
- case CURLOPT_POST:
- /* Does this option serve a purpose anymore? Yes it does, when
- CURLOPT_POSTFIELDS isn't used and the POST data is read off the
- callback! */
- if(va_arg(param, long)) {
- data->set.httpreq = HTTPREQ_POST;
- data->set.opt_no_body = FALSE; /* this is implied */
- }
- else
- data->set.httpreq = HTTPREQ_GET;
- break;
-
- case CURLOPT_COPYPOSTFIELDS:
- /*
- * A string with POST data. Makes curl HTTP POST. Even if it is NULL.
- * If needed, CURLOPT_POSTFIELDSIZE must have been set prior to
- * CURLOPT_COPYPOSTFIELDS and not altered later.
- */
- argptr = va_arg(param, char *);
-
- if(!argptr || data->set.postfieldsize == -1)
- result = setstropt(&data->set.str[STRING_COPYPOSTFIELDS], argptr);
- else {
- /*
- * Check that requested length does not overflow the size_t type.
- */
-
- if((data->set.postfieldsize < 0) ||
- ((sizeof(curl_off_t) != sizeof(size_t)) &&
- (data->set.postfieldsize > (curl_off_t)((size_t)-1))))
- result = CURLE_OUT_OF_MEMORY;
- else {
- char *p;
-
- (void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
-
- /* Allocate even when size == 0. This satisfies the need of possible
- later address compare to detect the COPYPOSTFIELDS mode, and
- to mark that postfields is used rather than read function or
- form data.
- */
- p = malloc((size_t)(data->set.postfieldsize?
- data->set.postfieldsize:1));
-
- if(!p)
- result = CURLE_OUT_OF_MEMORY;
- else {
- if(data->set.postfieldsize)
- memcpy(p, argptr, (size_t)data->set.postfieldsize);
-
- data->set.str[STRING_COPYPOSTFIELDS] = p;
- }
- }
- }
-
- data->set.postfields = data->set.str[STRING_COPYPOSTFIELDS];
- data->set.httpreq = HTTPREQ_POST;
- break;
-
- case CURLOPT_POSTFIELDS:
- /*
- * Like above, but use static data instead of copying it.
- */
- data->set.postfields = va_arg(param, void *);
- /* Release old copied data. */
- (void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
- data->set.httpreq = HTTPREQ_POST;
- break;
-
- case CURLOPT_POSTFIELDSIZE:
- /*
- * The size of the POSTFIELD data to prevent libcurl to do strlen() to
- * figure it out. Enables binary posts.
- */
- bigsize = va_arg(param, long);
-
- if(data->set.postfieldsize < bigsize &&
- data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) {
- /* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */
- (void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
- data->set.postfields = NULL;
- }
-
- data->set.postfieldsize = bigsize;
- break;
-
- case CURLOPT_POSTFIELDSIZE_LARGE:
- /*
- * The size of the POSTFIELD data to prevent libcurl to do strlen() to
- * figure it out. Enables binary posts.
- */
- bigsize = va_arg(param, curl_off_t);
-
- if(data->set.postfieldsize < bigsize &&
- data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) {
- /* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */
- (void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
- data->set.postfields = NULL;
- }
-
- data->set.postfieldsize = bigsize;
- break;
-
- case CURLOPT_HTTPPOST:
- /*
- * Set to make us do HTTP POST
- */
- data->set.httppost = va_arg(param, struct curl_httppost *);
- data->set.httpreq = HTTPREQ_POST_FORM;
- data->set.opt_no_body = FALSE; /* this is implied */
- break;
-
- case CURLOPT_REFERER:
- /*
- * String to set in the HTTP Referer: field.
- */
- if(data->change.referer_alloc) {
- Curl_safefree(data->change.referer);
- data->change.referer_alloc = FALSE;
- }
- result = setstropt(&data->set.str[STRING_SET_REFERER],
- va_arg(param, char *));
- data->change.referer = data->set.str[STRING_SET_REFERER];
- break;
-
- case CURLOPT_USERAGENT:
- /*
- * String to use in the HTTP User-Agent field
- */
- result = setstropt(&data->set.str[STRING_USERAGENT],
- va_arg(param, char *));
- break;
-
- case CURLOPT_HTTPHEADER:
- /*
- * Set a list with HTTP headers to use (or replace internals with)
- */
- data->set.headers = va_arg(param, struct curl_slist *);
- break;
-
- case CURLOPT_PROXYHEADER:
- /*
- * Set a list with proxy headers to use (or replace internals with)
- *
- * Since CURLOPT_HTTPHEADER was the only way to set HTTP headers for a
- * long time we remain doing it this way until CURLOPT_PROXYHEADER is
- * used. As soon as this option has been used, if set to anything but
- * NULL, custom headers for proxies are only picked from this list.
- *
- * Set this option to NULL to restore the previous behavior.
- */
- data->set.proxyheaders = va_arg(param, struct curl_slist *);
- break;
-
- case CURLOPT_HEADEROPT:
- /*
- * Set header option.
- */
- arg = va_arg(param, long);
- data->set.sep_headers = (arg & CURLHEADER_SEPARATE)? TRUE: FALSE;
- break;
-
- case CURLOPT_HTTP200ALIASES:
- /*
- * Set a list of aliases for HTTP 200 in response header
- */
- data->set.http200aliases = va_arg(param, struct curl_slist *);
- break;
-
-#if !defined(CURL_DISABLE_COOKIES)
- case CURLOPT_COOKIE:
- /*
- * Cookie string to send to the remote server in the request.
- */
- result = setstropt(&data->set.str[STRING_COOKIE],
- va_arg(param, char *));
- break;
-
- case CURLOPT_COOKIEFILE:
- /*
- * Set cookie file to read and parse. Can be used multiple times.
- */
- argptr = (char *)va_arg(param, void *);
- if(argptr) {
- struct curl_slist *cl;
- /* append the cookie file name to the list of file names, and deal with
- them later */
- cl = curl_slist_append(data->change.cookielist, argptr);
- if(!cl) {
- curl_slist_free_all(data->change.cookielist);
- data->change.cookielist = NULL;
- return CURLE_OUT_OF_MEMORY;
- }
- data->change.cookielist = cl; /* store the list for later use */
- }
- break;
-
- case CURLOPT_COOKIEJAR:
- /*
- * Set cookie file name to dump all cookies to when we're done.
- */
- {
- struct CookieInfo *newcookies;
- result = setstropt(&data->set.str[STRING_COOKIEJAR],
- va_arg(param, char *));
-
- /*
- * Activate the cookie parser. This may or may not already
- * have been made.
- */
- newcookies = Curl_cookie_init(data, NULL, data->cookies,
- data->set.cookiesession);
- if(!newcookies)
- result = CURLE_OUT_OF_MEMORY;
- data->cookies = newcookies;
- }
- break;
-
- case CURLOPT_COOKIESESSION:
- /*
- * Set this option to TRUE to start a new "cookie session". It will
- * prevent the forthcoming read-cookies-from-file actions to accept
- * cookies that are marked as being session cookies, as they belong to a
- * previous session.
- *
- * In the original Netscape cookie spec, "session cookies" are cookies
- * with no expire date set. RFC2109 describes the same action if no
- * 'Max-Age' is set and RFC2965 includes the RFC2109 description and adds
- * a 'Discard' action that can enforce the discard even for cookies that
- * have a Max-Age.
- *
- * We run mostly with the original cookie spec, as hardly anyone implements
- * anything else.
- */
- data->set.cookiesession = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_COOKIELIST:
- argptr = va_arg(param, char *);
-
- if(argptr == NULL)
- break;
-
- if(strcasecompare(argptr, "ALL")) {
- /* clear all cookies */
- Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
- Curl_cookie_clearall(data->cookies);
- Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
- }
- else if(strcasecompare(argptr, "SESS")) {
- /* clear session cookies */
- Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
- Curl_cookie_clearsess(data->cookies);
- Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
- }
- else if(strcasecompare(argptr, "FLUSH")) {
- /* flush cookies to file, takes care of the locking */
- Curl_flush_cookies(data, 0);
- }
- else if(strcasecompare(argptr, "RELOAD")) {
- /* reload cookies from file */
- Curl_cookie_loadfiles(data);
- break;
- }
- else {
- if(!data->cookies)
- /* if cookie engine was not running, activate it */
- data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE);
-
- argptr = strdup(argptr);
- if(!argptr || !data->cookies) {
- result = CURLE_OUT_OF_MEMORY;
- free(argptr);
- }
- else {
- Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
-
- if(checkprefix("Set-Cookie:", argptr))
- /* HTTP Header format line */
- Curl_cookie_add(data, data->cookies, TRUE, argptr + 11, NULL, NULL);
-
- else
- /* Netscape format line */
- Curl_cookie_add(data, data->cookies, FALSE, argptr, NULL, NULL);
-
- Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
- free(argptr);
- }
- }
-
- break;
-#endif /* CURL_DISABLE_COOKIES */
-
- case CURLOPT_HTTPGET:
- /*
- * Set to force us do HTTP GET
- */
- if(va_arg(param, long)) {
- data->set.httpreq = HTTPREQ_GET;
- data->set.upload = FALSE; /* switch off upload */
- data->set.opt_no_body = FALSE; /* this is implied */
- }
- break;
-
- case CURLOPT_HTTP_VERSION:
- /*
- * This sets a requested HTTP version to be used. The value is one of
- * the listed enums in curl/curl.h.
- */
- arg = va_arg(param, long);
-#ifndef USE_NGHTTP2
- if(arg >= CURL_HTTP_VERSION_2)
- return CURLE_UNSUPPORTED_PROTOCOL;
-#endif
- data->set.httpversion = arg;
- break;
-
- case CURLOPT_HTTPAUTH:
- /*
- * Set HTTP Authentication type BITMASK.
- */
- {
- int bitcheck;
- bool authbits;
- unsigned long auth = va_arg(param, unsigned long);
-
- if(auth == CURLAUTH_NONE) {
- data->set.httpauth = auth;
- break;
- }
-
- /* the DIGEST_IE bit is only used to set a special marker, for all the
- rest we need to handle it as normal DIGEST */
- data->state.authhost.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE;
-
- if(auth & CURLAUTH_DIGEST_IE) {
- auth |= CURLAUTH_DIGEST; /* set standard digest bit */
- auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */
- }
-
- /* switch off bits we can't support */
-#ifndef USE_NTLM
- auth &= ~CURLAUTH_NTLM; /* no NTLM support */
- auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
-#elif !defined(NTLM_WB_ENABLED)
- auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
-#endif
-#ifndef USE_SPNEGO
- auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without
- GSS-API or SSPI */
-#endif
-
- /* check if any auth bit lower than CURLAUTH_ONLY is still set */
- bitcheck = 0;
- authbits = FALSE;
- while(bitcheck < 31) {
- if(auth & (1UL << bitcheck++)) {
- authbits = TRUE;
- break;
- }
- }
- if(!authbits)
- return CURLE_NOT_BUILT_IN; /* no supported types left! */
-
- data->set.httpauth = auth;
- }
- break;
-
- case CURLOPT_EXPECT_100_TIMEOUT_MS:
- /*
- * Time to wait for a response to a HTTP request containing an
- * Expect: 100-continue header before sending the data anyway.
- */
- data->set.expect_100_timeout = va_arg(param, long);
- break;
-
-#endif /* CURL_DISABLE_HTTP */
-
- case CURLOPT_CUSTOMREQUEST:
- /*
- * Set a custom string to use as request
- */
- result = setstropt(&data->set.str[STRING_CUSTOMREQUEST],
- va_arg(param, char *));
-
- /* we don't set
- data->set.httpreq = HTTPREQ_CUSTOM;
- here, we continue as if we were using the already set type
- and this just changes the actual request keyword */
- break;
-
-#ifndef CURL_DISABLE_PROXY
- case CURLOPT_HTTPPROXYTUNNEL:
- /*
- * Tunnel operations through the proxy instead of normal proxy use
- */
- data->set.tunnel_thru_httpproxy = (0 != va_arg(param, long)) ?
- TRUE : FALSE;
- break;
-
- case CURLOPT_PROXYPORT:
- /*
- * Explicitly set HTTP proxy port number.
- */
- data->set.proxyport = va_arg(param, long);
- break;
-
- case CURLOPT_PROXYAUTH:
- /*
- * Set HTTP Authentication type BITMASK.
- */
- {
- int bitcheck;
- bool authbits;
- unsigned long auth = va_arg(param, unsigned long);
-
- if(auth == CURLAUTH_NONE) {
- data->set.proxyauth = auth;
- break;
- }
-
- /* the DIGEST_IE bit is only used to set a special marker, for all the
- rest we need to handle it as normal DIGEST */
- data->state.authproxy.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE;
-
- if(auth & CURLAUTH_DIGEST_IE) {
- auth |= CURLAUTH_DIGEST; /* set standard digest bit */
- auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */
- }
- /* switch off bits we can't support */
-#ifndef USE_NTLM
- auth &= ~CURLAUTH_NTLM; /* no NTLM support */
- auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
-#elif !defined(NTLM_WB_ENABLED)
- auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
-#endif
-#ifndef USE_SPNEGO
- auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without
- GSS-API or SSPI */
-#endif
-
- /* check if any auth bit lower than CURLAUTH_ONLY is still set */
- bitcheck = 0;
- authbits = FALSE;
- while(bitcheck < 31) {
- if(auth & (1UL << bitcheck++)) {
- authbits = TRUE;
- break;
- }
- }
- if(!authbits)
- return CURLE_NOT_BUILT_IN; /* no supported types left! */
-
- data->set.proxyauth = auth;
- }
- break;
-
- case CURLOPT_PROXY:
- /*
- * Set proxy server:port to use as proxy.
- *
- * If the proxy is set to "" (and CURLOPT_SOCKS_PROXY is set to "" or NULL)
- * we explicitly say that we don't want to use a proxy
- * (even though there might be environment variables saying so).
- *
- * Setting it to NULL, means no proxy but allows the environment variables
- * to decide for us (if CURLOPT_SOCKS_PROXY setting it to NULL).
- */
- result = setstropt(&data->set.str[STRING_PROXY],
- va_arg(param, char *));
- break;
-
- case CURLOPT_PRE_PROXY:
- /*
- * Set proxy server:port to use as SOCKS proxy.
- *
- * If the proxy is set to "" or NULL we explicitly say that we don't want
- * to use the socks proxy.
- */
- result = setstropt(&data->set.str[STRING_PRE_PROXY],
- va_arg(param, char *));
- break;
-
- case CURLOPT_PROXYTYPE:
- /*
- * Set proxy type. HTTP/HTTP_1_0/SOCKS4/SOCKS4a/SOCKS5/SOCKS5_HOSTNAME
- */
- data->set.proxytype = (curl_proxytype)va_arg(param, long);
- break;
-
- case CURLOPT_PROXY_TRANSFER_MODE:
- /*
- * set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy
- */
- switch(va_arg(param, long)) {
- case 0:
- data->set.proxy_transfer_mode = FALSE;
- break;
- case 1:
- data->set.proxy_transfer_mode = TRUE;
- break;
- default:
- /* reserve other values for future use */
- result = CURLE_UNKNOWN_OPTION;
- break;
- }
- break;
-#endif /* CURL_DISABLE_PROXY */
-
- case CURLOPT_SOCKS5_AUTH:
- data->set.socks5auth = va_arg(param, unsigned long);
- if(data->set.socks5auth & ~(CURLAUTH_BASIC | CURLAUTH_GSSAPI))
- result = CURLE_NOT_BUILT_IN;
- break;
-#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- case CURLOPT_SOCKS5_GSSAPI_NEC:
- /*
- * Set flag for NEC SOCK5 support
- */
- data->set.socks5_gssapi_nec = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_SOCKS5_GSSAPI_SERVICE:
- case CURLOPT_PROXY_SERVICE_NAME:
- /*
- * Set proxy authentication service name for Kerberos 5 and SPNEGO
- */
- result = setstropt(&data->set.str[STRING_PROXY_SERVICE_NAME],
- va_arg(param, char *));
- break;
-#endif
-
-#if !defined(CURL_DISABLE_CRYPTO_AUTH) || defined(USE_KERBEROS5) || \
- defined(USE_SPNEGO)
- case CURLOPT_SERVICE_NAME:
- /*
- * Set authentication service name for DIGEST-MD5, Kerberos 5 and SPNEGO
- */
- result = setstropt(&data->set.str[STRING_SERVICE_NAME],
- va_arg(param, char *));
- break;
-
-#endif
-
- case CURLOPT_HEADERDATA:
- /*
- * Custom pointer to pass the header write callback function
- */
- data->set.writeheader = (void *)va_arg(param, void *);
- break;
- case CURLOPT_ERRORBUFFER:
- /*
- * Error buffer provided by the caller to get the human readable
- * error string in.
- */
- data->set.errorbuffer = va_arg(param, char *);
- break;
- case CURLOPT_WRITEDATA:
- /*
- * FILE pointer to write to. Or possibly
- * used as argument to the write callback.
- */
- data->set.out = va_arg(param, void *);
- break;
- case CURLOPT_FTPPORT:
- /*
- * Use FTP PORT, this also specifies which IP address to use
- */
- result = setstropt(&data->set.str[STRING_FTPPORT],
- va_arg(param, char *));
- data->set.ftp_use_port = (data->set.str[STRING_FTPPORT]) ? TRUE : FALSE;
- break;
-
- case CURLOPT_FTP_USE_EPRT:
- data->set.ftp_use_eprt = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_FTP_USE_EPSV:
- data->set.ftp_use_epsv = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_FTP_USE_PRET:
- data->set.ftp_use_pret = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_FTP_SSL_CCC:
- data->set.ftp_ccc = (curl_ftpccc)va_arg(param, long);
- break;
-
- case CURLOPT_FTP_SKIP_PASV_IP:
- /*
- * Enable or disable FTP_SKIP_PASV_IP, which will disable/enable the
- * bypass of the IP address in PASV responses.
- */
- data->set.ftp_skip_ip = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_READDATA:
- /*
- * FILE pointer to read the file to be uploaded from. Or possibly
- * used as argument to the read callback.
- */
- data->set.in_set = va_arg(param, void *);
- break;
- case CURLOPT_INFILESIZE:
- /*
- * If known, this should inform curl about the file size of the
- * to-be-uploaded file.
- */
- data->set.filesize = va_arg(param, long);
- break;
- case CURLOPT_INFILESIZE_LARGE:
- /*
- * If known, this should inform curl about the file size of the
- * to-be-uploaded file.
- */
- data->set.filesize = va_arg(param, curl_off_t);
- break;
- case CURLOPT_LOW_SPEED_LIMIT:
- /*
- * The low speed limit that if transfers are below this for
- * CURLOPT_LOW_SPEED_TIME, the transfer is aborted.
- */
- data->set.low_speed_limit=va_arg(param, long);
- break;
- case CURLOPT_MAX_SEND_SPEED_LARGE:
- /*
- * When transfer uploads are faster then CURLOPT_MAX_SEND_SPEED_LARGE
- * bytes per second the transfer is throttled..
- */
- data->set.max_send_speed=va_arg(param, curl_off_t);
- break;
- case CURLOPT_MAX_RECV_SPEED_LARGE:
- /*
- * When receiving data faster than CURLOPT_MAX_RECV_SPEED_LARGE bytes per
- * second the transfer is throttled..
- */
- data->set.max_recv_speed=va_arg(param, curl_off_t);
- break;
- case CURLOPT_LOW_SPEED_TIME:
- /*
- * The low speed time that if transfers are below the set
- * CURLOPT_LOW_SPEED_LIMIT during this time, the transfer is aborted.
- */
- data->set.low_speed_time=va_arg(param, long);
- break;
- case CURLOPT_URL:
- /*
- * The URL to fetch.
- */
- if(data->change.url_alloc) {
- /* the already set URL is allocated, free it first! */
- Curl_safefree(data->change.url);
- data->change.url_alloc = FALSE;
- }
- result = setstropt(&data->set.str[STRING_SET_URL],
- va_arg(param, char *));
- data->change.url = data->set.str[STRING_SET_URL];
- break;
- case CURLOPT_PORT:
- /*
- * The port number to use when getting the URL
- */
- data->set.use_port = va_arg(param, long);
- break;
- case CURLOPT_TIMEOUT:
- /*
- * The maximum time you allow curl to use for a single transfer
- * operation.
- */
- data->set.timeout = va_arg(param, long) * 1000L;
- break;
-
- case CURLOPT_TIMEOUT_MS:
- data->set.timeout = va_arg(param, long);
- break;
-
- case CURLOPT_CONNECTTIMEOUT:
- /*
- * The maximum time you allow curl to use to connect.
- */
- data->set.connecttimeout = va_arg(param, long) * 1000L;
- break;
-
- case CURLOPT_CONNECTTIMEOUT_MS:
- data->set.connecttimeout = va_arg(param, long);
- break;
-
- case CURLOPT_ACCEPTTIMEOUT_MS:
- /*
- * The maximum time you allow curl to wait for server connect
- */
- data->set.accepttimeout = va_arg(param, long);
- break;
-
- case CURLOPT_USERPWD:
- /*
- * user:password to use in the operation
- */
- result = setstropt_userpwd(va_arg(param, char *),
- &data->set.str[STRING_USERNAME],
- &data->set.str[STRING_PASSWORD]);
- break;
-
- case CURLOPT_USERNAME:
- /*
- * authentication user name to use in the operation
- */
- result = setstropt(&data->set.str[STRING_USERNAME],
- va_arg(param, char *));
- break;
-
- case CURLOPT_PASSWORD:
- /*
- * authentication password to use in the operation
- */
- result = setstropt(&data->set.str[STRING_PASSWORD],
- va_arg(param, char *));
- break;
-
- case CURLOPT_LOGIN_OPTIONS:
- /*
- * authentication options to use in the operation
- */
- result = setstropt(&data->set.str[STRING_OPTIONS],
- va_arg(param, char *));
- break;
-
- case CURLOPT_XOAUTH2_BEARER:
- /*
- * OAuth 2.0 bearer token to use in the operation
- */
- result = setstropt(&data->set.str[STRING_BEARER],
- va_arg(param, char *));
- break;
-
- case CURLOPT_POSTQUOTE:
- /*
- * List of RAW FTP commands to use after a transfer
- */
- data->set.postquote = va_arg(param, struct curl_slist *);
- break;
- case CURLOPT_PREQUOTE:
- /*
- * List of RAW FTP commands to use prior to RETR (Wesley Laxton)
- */
- data->set.prequote = va_arg(param, struct curl_slist *);
- break;
- case CURLOPT_QUOTE:
- /*
- * List of RAW FTP commands to use before a transfer
- */
- data->set.quote = va_arg(param, struct curl_slist *);
- break;
- case CURLOPT_RESOLVE:
- /*
- * List of NAME:[address] names to populate the DNS cache with
- * Prefix the NAME with dash (-) to _remove_ the name from the cache.
- *
- * Names added with this API will remain in the cache until explicitly
- * removed or the handle is cleaned up.
- *
- * This API can remove any name from the DNS cache, but only entries
- * that aren't actually in use right now will be pruned immediately.
- */
- data->set.resolve = va_arg(param, struct curl_slist *);
- data->change.resolve = data->set.resolve;
- break;
- case CURLOPT_PROGRESSFUNCTION:
- /*
- * Progress callback function
- */
- data->set.fprogress = va_arg(param, curl_progress_callback);
- if(data->set.fprogress)
- data->progress.callback = TRUE; /* no longer internal */
- else
- data->progress.callback = FALSE; /* NULL enforces internal */
- break;
-
- case CURLOPT_XFERINFOFUNCTION:
- /*
- * Transfer info callback function
- */
- data->set.fxferinfo = va_arg(param, curl_xferinfo_callback);
- if(data->set.fxferinfo)
- data->progress.callback = TRUE; /* no longer internal */
- else
- data->progress.callback = FALSE; /* NULL enforces internal */
-
- break;
-
- case CURLOPT_PROGRESSDATA:
- /*
- * Custom client data to pass to the progress callback
- */
- data->set.progress_client = va_arg(param, void *);
- break;
-
-#ifndef CURL_DISABLE_PROXY
- case CURLOPT_PROXYUSERPWD:
- /*
- * user:password needed to use the proxy
- */
- result = setstropt_userpwd(va_arg(param, char *),
- &data->set.str[STRING_PROXYUSERNAME],
- &data->set.str[STRING_PROXYPASSWORD]);
- break;
- case CURLOPT_PROXYUSERNAME:
- /*
- * authentication user name to use in the operation
- */
- result = setstropt(&data->set.str[STRING_PROXYUSERNAME],
- va_arg(param, char *));
- break;
- case CURLOPT_PROXYPASSWORD:
- /*
- * authentication password to use in the operation
- */
- result = setstropt(&data->set.str[STRING_PROXYPASSWORD],
- va_arg(param, char *));
- break;
- case CURLOPT_NOPROXY:
- /*
- * proxy exception list
- */
- result = setstropt(&data->set.str[STRING_NOPROXY],
- va_arg(param, char *));
- break;
-#endif
-
- case CURLOPT_RANGE:
- /*
- * What range of the file you want to transfer
- */
- result = setstropt(&data->set.str[STRING_SET_RANGE],
- va_arg(param, char *));
- break;
- case CURLOPT_RESUME_FROM:
- /*
- * Resume transfer at the give file position
- */
- data->set.set_resume_from = va_arg(param, long);
- break;
- case CURLOPT_RESUME_FROM_LARGE:
- /*
- * Resume transfer at the give file position
- */
- data->set.set_resume_from = va_arg(param, curl_off_t);
- break;
- case CURLOPT_DEBUGFUNCTION:
- /*
- * stderr write callback.
- */
- data->set.fdebug = va_arg(param, curl_debug_callback);
- /*
- * if the callback provided is NULL, it'll use the default callback
- */
- break;
- case CURLOPT_DEBUGDATA:
- /*
- * Set to a void * that should receive all error writes. This
- * defaults to CURLOPT_STDERR for normal operations.
- */
- data->set.debugdata = va_arg(param, void *);
- break;
- case CURLOPT_STDERR:
- /*
- * Set to a FILE * that should receive all error writes. This
- * defaults to stderr for normal operations.
- */
- data->set.err = va_arg(param, FILE *);
- if(!data->set.err)
- data->set.err = stderr;
- break;
- case CURLOPT_HEADERFUNCTION:
- /*
- * Set header write callback
- */
- data->set.fwrite_header = va_arg(param, curl_write_callback);
- break;
- case CURLOPT_WRITEFUNCTION:
- /*
- * Set data write callback
- */
- data->set.fwrite_func = va_arg(param, curl_write_callback);
- if(!data->set.fwrite_func) {
- data->set.is_fwrite_set = 0;
- /* When set to NULL, reset to our internal default function */
- data->set.fwrite_func = (curl_write_callback)fwrite;
- }
- else
- data->set.is_fwrite_set = 1;
- break;
- case CURLOPT_READFUNCTION:
- /*
- * Read data callback
- */
- data->set.fread_func_set = va_arg(param, curl_read_callback);
- if(!data->set.fread_func_set) {
- data->set.is_fread_set = 0;
- /* When set to NULL, reset to our internal default function */
- data->set.fread_func_set = (curl_read_callback)fread;
- }
- else
- data->set.is_fread_set = 1;
- break;
- case CURLOPT_SEEKFUNCTION:
- /*
- * Seek callback. Might be NULL.
- */
- data->set.seek_func = va_arg(param, curl_seek_callback);
- break;
- case CURLOPT_SEEKDATA:
- /*
- * Seek control callback. Might be NULL.
- */
- data->set.seek_client = va_arg(param, void *);
- break;
- case CURLOPT_CONV_FROM_NETWORK_FUNCTION:
- /*
- * "Convert from network encoding" callback
- */
- data->set.convfromnetwork = va_arg(param, curl_conv_callback);
- break;
- case CURLOPT_CONV_TO_NETWORK_FUNCTION:
- /*
- * "Convert to network encoding" callback
- */
- data->set.convtonetwork = va_arg(param, curl_conv_callback);
- break;
- case CURLOPT_CONV_FROM_UTF8_FUNCTION:
- /*
- * "Convert from UTF-8 encoding" callback
- */
- data->set.convfromutf8 = va_arg(param, curl_conv_callback);
- break;
- case CURLOPT_IOCTLFUNCTION:
- /*
- * I/O control callback. Might be NULL.
- */
- data->set.ioctl_func = va_arg(param, curl_ioctl_callback);
- break;
- case CURLOPT_IOCTLDATA:
- /*
- * I/O control data pointer. Might be NULL.
- */
- data->set.ioctl_client = va_arg(param, void *);
- break;
- case CURLOPT_SSLCERT:
- /*
- * String that holds file name of the SSL certificate to use
- */
- result = setstropt(&data->set.str[STRING_CERT_ORIG],
- va_arg(param, char *));
- break;
- case CURLOPT_PROXY_SSLCERT:
- /*
- * String that holds file name of the SSL certificate to use for proxy
- */
- result = setstropt(&data->set.str[STRING_CERT_PROXY],
- va_arg(param, char *));
- break;
- case CURLOPT_SSLCERTTYPE:
- /*
- * String that holds file type of the SSL certificate to use
- */
- result = setstropt(&data->set.str[STRING_CERT_TYPE_ORIG],
- va_arg(param, char *));
- break;
- case CURLOPT_PROXY_SSLCERTTYPE:
- /*
- * String that holds file type of the SSL certificate to use for proxy
- */
- result = setstropt(&data->set.str[STRING_CERT_TYPE_PROXY],
- va_arg(param, char *));
- break;
- case CURLOPT_SSLKEY:
- /*
- * String that holds file name of the SSL key to use
- */
- result = setstropt(&data->set.str[STRING_KEY_ORIG],
- va_arg(param, char *));
- break;
- case CURLOPT_PROXY_SSLKEY:
- /*
- * String that holds file name of the SSL key to use for proxy
- */
- result = setstropt(&data->set.str[STRING_KEY_PROXY],
- va_arg(param, char *));
- break;
- case CURLOPT_SSLKEYTYPE:
- /*
- * String that holds file type of the SSL key to use
- */
- result = setstropt(&data->set.str[STRING_KEY_TYPE_ORIG],
- va_arg(param, char *));
- break;
- case CURLOPT_PROXY_SSLKEYTYPE:
- /*
- * String that holds file type of the SSL key to use for proxy
- */
- result = setstropt(&data->set.str[STRING_KEY_TYPE_PROXY],
- va_arg(param, char *));
- break;
- case CURLOPT_KEYPASSWD:
- /*
- * String that holds the SSL or SSH private key password.
- */
- result = setstropt(&data->set.str[STRING_KEY_PASSWD_ORIG],
- va_arg(param, char *));
- break;
- case CURLOPT_PROXY_KEYPASSWD:
- /*
- * String that holds the SSL private key password for proxy.
- */
- result = setstropt(&data->set.str[STRING_KEY_PASSWD_PROXY],
- va_arg(param, char *));
- break;
- case CURLOPT_SSLENGINE:
- /*
- * String that holds the SSL crypto engine.
- */
- argptr = va_arg(param, char *);
- if(argptr && argptr[0])
- result = Curl_ssl_set_engine(data, argptr);
- break;
-
- case CURLOPT_SSLENGINE_DEFAULT:
- /*
- * flag to set engine as default.
- */
- result = Curl_ssl_set_engine_default(data);
- break;
- case CURLOPT_CRLF:
- /*
- * Kludgy option to enable CRLF conversions. Subject for removal.
- */
- data->set.crlf = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_INTERFACE:
- /*
- * Set what interface or address/hostname to bind the socket to when
- * performing an operation and thus what from-IP your connection will use.
- */
- result = setstropt(&data->set.str[STRING_DEVICE],
- va_arg(param, char *));
- break;
- case CURLOPT_LOCALPORT:
- /*
- * Set what local port to bind the socket to when performing an operation.
- */
- arg = va_arg(param, long);
- if((arg < 0) || (arg > 65535))
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.localport = curlx_sltous(arg);
- break;
- case CURLOPT_LOCALPORTRANGE:
- /*
- * Set number of local ports to try, starting with CURLOPT_LOCALPORT.
- */
- arg = va_arg(param, long);
- if((arg < 0) || (arg > 65535))
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.localportrange = curlx_sltosi(arg);
- break;
- case CURLOPT_KRBLEVEL:
- /*
- * A string that defines the kerberos security level.
- */
- result = setstropt(&data->set.str[STRING_KRB_LEVEL],
- va_arg(param, char *));
- data->set.krb = (data->set.str[STRING_KRB_LEVEL]) ? TRUE : FALSE;
- break;
- case CURLOPT_GSSAPI_DELEGATION:
- /*
- * GSS-API credential delegation
- */
- data->set.gssapi_delegation = va_arg(param, long);
- break;
- case CURLOPT_SSL_VERIFYPEER:
- /*
- * Enable peer SSL verifying.
- */
- data->set.ssl.primary.verifypeer = (0 != va_arg(param, long)) ?
- TRUE : FALSE;
- break;
- case CURLOPT_PROXY_SSL_VERIFYPEER:
- /*
- * Enable peer SSL verifying for proxy.
- */
- data->set.proxy_ssl.primary.verifypeer =
- (0 != va_arg(param, long))?TRUE:FALSE;
- break;
- case CURLOPT_SSL_VERIFYHOST:
- /*
- * Enable verification of the host name in the peer certificate
- */
- arg = va_arg(param, long);
-
- /* Obviously people are not reading documentation and too many thought
- this argument took a boolean when it wasn't and misused it. We thus ban
- 1 as a sensible input and we warn about its use. Then we only have the
- 2 action internally stored as TRUE. */
-
- if(1 == arg) {
- failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
- return CURLE_BAD_FUNCTION_ARGUMENT;
- }
-
- data->set.ssl.primary.verifyhost = (0 != arg) ? TRUE : FALSE;
- break;
- case CURLOPT_PROXY_SSL_VERIFYHOST:
- /*
- * Enable verification of the host name in the peer certificate for proxy
- */
- arg = va_arg(param, long);
-
- /* Obviously people are not reading documentation and too many thought
- this argument took a boolean when it wasn't and misused it. We thus ban
- 1 as a sensible input and we warn about its use. Then we only have the
- 2 action internally stored as TRUE. */
-
- if(1 == arg) {
- failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
- return CURLE_BAD_FUNCTION_ARGUMENT;
- }
-
- data->set.proxy_ssl.primary.verifyhost = (0 != arg)?TRUE:FALSE;
- break;
- case CURLOPT_SSL_VERIFYSTATUS:
- /*
- * Enable certificate status verifying.
- */
- if(!Curl_ssl_cert_status_request()) {
- result = CURLE_NOT_BUILT_IN;
- break;
- }
-
- data->set.ssl.primary.verifystatus = (0 != va_arg(param, long)) ?
- TRUE : FALSE;
- break;
- case CURLOPT_SSL_CTX_FUNCTION:
-#ifdef have_curlssl_ssl_ctx
- /*
- * Set a SSL_CTX callback
- */
- data->set.ssl.fsslctx = va_arg(param, curl_ssl_ctx_callback);
-#else
- result = CURLE_NOT_BUILT_IN;
-#endif
- break;
- case CURLOPT_SSL_CTX_DATA:
-#ifdef have_curlssl_ssl_ctx
- /*
- * Set a SSL_CTX callback parameter pointer
- */
- data->set.ssl.fsslctxp = va_arg(param, void *);
-#else
- result = CURLE_NOT_BUILT_IN;
-#endif
- break;
- case CURLOPT_SSL_FALSESTART:
- /*
- * Enable TLS false start.
- */
- if(!Curl_ssl_false_start()) {
- result = CURLE_NOT_BUILT_IN;
- break;
- }
-
- data->set.ssl.falsestart = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_CERTINFO:
-#ifdef have_curlssl_certinfo
- data->set.ssl.certinfo = (0 != va_arg(param, long)) ? TRUE : FALSE;
-#else
- result = CURLE_NOT_BUILT_IN;
-#endif
- break;
- case CURLOPT_PINNEDPUBLICKEY:
-#ifdef have_curlssl_pinnedpubkey /* only by supported backends */
- /*
- * Set pinned public key for SSL connection.
- * Specify file name of the public key in DER format.
- */
- result = setstropt(&data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG],
- va_arg(param, char *));
-#else
- result = CURLE_NOT_BUILT_IN;
-#endif
- break;
- case CURLOPT_PROXY_PINNEDPUBLICKEY:
-#ifdef have_curlssl_pinnedpubkey /* only by supported backends */
- /*
- * Set pinned public key for SSL connection.
- * Specify file name of the public key in DER format.
- */
- result = setstropt(&data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY],
- va_arg(param, char *));
-#else
- result = CURLE_NOT_BUILT_IN;
-#endif
- break;
- case CURLOPT_CAINFO:
- /*
- * Set CA info for SSL connection. Specify file name of the CA certificate
- */
- result = setstropt(&data->set.str[STRING_SSL_CAFILE_ORIG],
- va_arg(param, char *));
- break;
- case CURLOPT_PROXY_CAINFO:
- /*
- * Set CA info SSL connection for proxy. Specify file name of the
- * CA certificate
- */
- result = setstropt(&data->set.str[STRING_SSL_CAFILE_PROXY],
- va_arg(param, char *));
- break;
- case CURLOPT_CAPATH:
-#ifdef have_curlssl_ca_path /* not supported by all backends */
- /*
- * Set CA path info for SSL connection. Specify directory name of the CA
- * certificates which have been prepared using openssl c_rehash utility.
- */
- /* This does not work on windows. */
- result = setstropt(&data->set.str[STRING_SSL_CAPATH_ORIG],
- va_arg(param, char *));
-#else
- result = CURLE_NOT_BUILT_IN;
-#endif
- break;
- case CURLOPT_PROXY_CAPATH:
-#ifdef have_curlssl_ca_path /* not supported by all backends */
- /*
- * Set CA path info for SSL connection proxy. Specify directory name of the
- * CA certificates which have been prepared using openssl c_rehash utility.
- */
- /* This does not work on windows. */
- result = setstropt(&data->set.str[STRING_SSL_CAPATH_PROXY],
- va_arg(param, char *));
-#else
- result = CURLE_NOT_BUILT_IN;
-#endif
- break;
- case CURLOPT_CRLFILE:
- /*
- * Set CRL file info for SSL connection. Specify file name of the CRL
- * to check certificates revocation
- */
- result = setstropt(&data->set.str[STRING_SSL_CRLFILE_ORIG],
- va_arg(param, char *));
- break;
- case CURLOPT_PROXY_CRLFILE:
- /*
- * Set CRL file info for SSL connection for proxy. Specify file name of the
- * CRL to check certificates revocation
- */
- result = setstropt(&data->set.str[STRING_SSL_CRLFILE_PROXY],
- va_arg(param, char *));
- break;
- case CURLOPT_ISSUERCERT:
- /*
- * Set Issuer certificate file
- * to check certificates issuer
- */
- result = setstropt(&data->set.str[STRING_SSL_ISSUERCERT_ORIG],
- va_arg(param, char *));
- break;
- case CURLOPT_TELNETOPTIONS:
- /*
- * Set a linked list of telnet options
- */
- data->set.telnet_options = va_arg(param, struct curl_slist *);
- break;
-
- case CURLOPT_BUFFERSIZE:
- /*
- * The application kindly asks for a differently sized receive buffer.
- * If it seems reasonable, we'll use it.
- */
- arg = va_arg(param, long);
-
- if(arg > READBUFFER_MAX)
- arg = READBUFFER_MAX;
- else if(arg < 1)
- arg = READBUFFER_SIZE;
- else if(arg < READBUFFER_MIN)
- arg = READBUFFER_MIN;
-
- /* Resize if new size */
- if(arg != data->set.buffer_size) {
- char *newbuff = realloc(data->state.buffer, arg + 1);
- if(!newbuff) {
- DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
- result = CURLE_OUT_OF_MEMORY;
- }
- else
- data->state.buffer = newbuff;
- }
- data->set.buffer_size = arg;
-
- break;
-
- case CURLOPT_NOSIGNAL:
- /*
- * The application asks not to set any signal() or alarm() handlers,
- * even when using a timeout.
- */
- data->set.no_signal = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_SHARE:
- {
- struct Curl_share *set;
- set = va_arg(param, struct Curl_share *);
-
- /* disconnect from old share, if any */
- if(data->share) {
- Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
-
- if(data->dns.hostcachetype == HCACHE_SHARED) {
- data->dns.hostcache = NULL;
- data->dns.hostcachetype = HCACHE_NONE;
- }
-
-#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
- if(data->share->cookies == data->cookies)
- data->cookies = NULL;
-#endif
-
- if(data->share->sslsession == data->state.session)
- data->state.session = NULL;
-
- data->share->dirty--;
-
- Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
- data->share = NULL;
- }
-
- /* use new share if it set */
- data->share = set;
- if(data->share) {
-
- Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
-
- data->share->dirty++;
-
- if(data->share->specifier & (1<< CURL_LOCK_DATA_DNS)) {
- /* use shared host cache */
- data->dns.hostcache = &data->share->hostcache;
- data->dns.hostcachetype = HCACHE_SHARED;
- }
-#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
- if(data->share->cookies) {
- /* use shared cookie list, first free own one if any */
- Curl_cookie_cleanup(data->cookies);
- /* enable cookies since we now use a share that uses cookies! */
- data->cookies = data->share->cookies;
- }
-#endif /* CURL_DISABLE_HTTP */
- if(data->share->sslsession) {
- data->set.general_ssl.max_ssl_sessions = data->share->max_ssl_sessions;
- data->state.session = data->share->sslsession;
- }
- Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
-
- }
- /* check for host cache not needed,
- * it will be done by curl_easy_perform */
- }
- break;
-
- case CURLOPT_PRIVATE:
- /*
- * Set private data pointer.
- */
- data->set.private_data = va_arg(param, void *);
- break;
-
- case CURLOPT_MAXFILESIZE:
- /*
- * Set the maximum size of a file to download.
- */
- data->set.max_filesize = va_arg(param, long);
- break;
-
-#ifdef USE_SSL
- case CURLOPT_USE_SSL:
- /*
- * Make transfers attempt to use SSL/TLS.
- */
- data->set.use_ssl = (curl_usessl)va_arg(param, long);
- break;
-
- case CURLOPT_SSL_OPTIONS:
- arg = va_arg(param, long);
- data->set.ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE;
- data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
- break;
-
- case CURLOPT_PROXY_SSL_OPTIONS:
- arg = va_arg(param, long);
- data->set.proxy_ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE;
- data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
- break;
-
-#endif
- case CURLOPT_FTPSSLAUTH:
- /*
- * Set a specific auth for FTP-SSL transfers.
- */
- data->set.ftpsslauth = (curl_ftpauth)va_arg(param, long);
- break;
-
- case CURLOPT_IPRESOLVE:
- data->set.ipver = va_arg(param, long);
- break;
-
- case CURLOPT_MAXFILESIZE_LARGE:
- /*
- * Set the maximum size of a file to download.
- */
- data->set.max_filesize = va_arg(param, curl_off_t);
- break;
-
- case CURLOPT_TCP_NODELAY:
- /*
- * Enable or disable TCP_NODELAY, which will disable/enable the Nagle
- * algorithm
- */
- data->set.tcp_nodelay = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_FTP_ACCOUNT:
- result = setstropt(&data->set.str[STRING_FTP_ACCOUNT],
- va_arg(param, char *));
- break;
-
- case CURLOPT_IGNORE_CONTENT_LENGTH:
- data->set.ignorecl = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_CONNECT_ONLY:
- /*
- * No data transfer, set up connection and let application use the socket
- */
- data->set.connect_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_FTP_ALTERNATIVE_TO_USER:
- result = setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER],
- va_arg(param, char *));
- break;
-
- case CURLOPT_SOCKOPTFUNCTION:
- /*
- * socket callback function: called after socket() but before connect()
- */
- data->set.fsockopt = va_arg(param, curl_sockopt_callback);
- break;
-
- case CURLOPT_SOCKOPTDATA:
- /*
- * socket callback data pointer. Might be NULL.
- */
- data->set.sockopt_client = va_arg(param, void *);
- break;
-
- case CURLOPT_OPENSOCKETFUNCTION:
- /*
- * open/create socket callback function: called instead of socket(),
- * before connect()
- */
- data->set.fopensocket = va_arg(param, curl_opensocket_callback);
- break;
-
- case CURLOPT_OPENSOCKETDATA:
- /*
- * socket callback data pointer. Might be NULL.
- */
- data->set.opensocket_client = va_arg(param, void *);
- break;
-
- case CURLOPT_CLOSESOCKETFUNCTION:
- /*
- * close socket callback function: called instead of close()
- * when shutting down a connection
- */
- data->set.fclosesocket = va_arg(param, curl_closesocket_callback);
- break;
-
- case CURLOPT_CLOSESOCKETDATA:
- /*
- * socket callback data pointer. Might be NULL.
- */
- data->set.closesocket_client = va_arg(param, void *);
- break;
-
- case CURLOPT_SSL_SESSIONID_CACHE:
- data->set.ssl.primary.sessionid = (0 != va_arg(param, long)) ?
- TRUE : FALSE;
- data->set.proxy_ssl.primary.sessionid = data->set.ssl.primary.sessionid;
- break;
-
-#ifdef USE_LIBSSH2
- /* we only include SSH options if explicitly built to support SSH */
- case CURLOPT_SSH_AUTH_TYPES:
- data->set.ssh_auth_types = va_arg(param, long);
- break;
-
- case CURLOPT_SSH_PUBLIC_KEYFILE:
- /*
- * Use this file instead of the $HOME/.ssh/id_dsa.pub file
- */
- result = setstropt(&data->set.str[STRING_SSH_PUBLIC_KEY],
- va_arg(param, char *));
- break;
-
- case CURLOPT_SSH_PRIVATE_KEYFILE:
- /*
- * Use this file instead of the $HOME/.ssh/id_dsa file
- */
- result = setstropt(&data->set.str[STRING_SSH_PRIVATE_KEY],
- va_arg(param, char *));
- break;
- case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:
- /*
- * Option to allow for the MD5 of the host public key to be checked
- * for validation purposes.
- */
- result = setstropt(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5],
- va_arg(param, char *));
- break;
-#ifdef HAVE_LIBSSH2_KNOWNHOST_API
- case CURLOPT_SSH_KNOWNHOSTS:
- /*
- * Store the file name to read known hosts from.
- */
- result = setstropt(&data->set.str[STRING_SSH_KNOWNHOSTS],
- va_arg(param, char *));
- break;
-
- case CURLOPT_SSH_KEYFUNCTION:
- /* setting to NULL is fine since the ssh.c functions themselves will
- then rever to use the internal default */
- data->set.ssh_keyfunc = va_arg(param, curl_sshkeycallback);
- break;
-
- case CURLOPT_SSH_KEYDATA:
- /*
- * Custom client data to pass to the SSH keyfunc callback
- */
- data->set.ssh_keyfunc_userp = va_arg(param, void *);
- break;
-#endif /* HAVE_LIBSSH2_KNOWNHOST_API */
-
-#endif /* USE_LIBSSH2 */
-
- case CURLOPT_HTTP_TRANSFER_DECODING:
- /*
- * disable libcurl transfer encoding is used
- */
- data->set.http_te_skip = (0 == va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_HTTP_CONTENT_DECODING:
- /*
- * raw data passed to the application when content encoding is used
- */
- data->set.http_ce_skip = (0 == va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_NEW_FILE_PERMS:
- /*
- * Uses these permissions instead of 0644
- */
- data->set.new_file_perms = va_arg(param, long);
- break;
-
- case CURLOPT_NEW_DIRECTORY_PERMS:
- /*
- * Uses these permissions instead of 0755
- */
- data->set.new_directory_perms = va_arg(param, long);
- break;
-
- case CURLOPT_ADDRESS_SCOPE:
- /*
- * We always get longs when passed plain numericals, but for this value we
- * know that an unsigned int will always hold the value so we blindly
- * typecast to this type
- */
- arg = va_arg(param, long);
- if((arg < 0) || (arg > 0xf))
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.scope_id = curlx_sltoui(arg);
- break;
-
- case CURLOPT_PROTOCOLS:
- /* set the bitmask for the protocols that are allowed to be used for the
- transfer, which thus helps the app which takes URLs from users or other
- external inputs and want to restrict what protocol(s) to deal
- with. Defaults to CURLPROTO_ALL. */
- data->set.allowed_protocols = va_arg(param, long);
- break;
-
- case CURLOPT_REDIR_PROTOCOLS:
- /* set the bitmask for the protocols that libcurl is allowed to follow to,
- as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
- to be set in both bitmasks to be allowed to get redirected to. Defaults
- to all protocols except FILE and SCP. */
- data->set.redir_protocols = va_arg(param, long);
- break;
-
- case CURLOPT_DEFAULT_PROTOCOL:
- /* Set the protocol to use when the URL doesn't include any protocol */
- result = setstropt(&data->set.str[STRING_DEFAULT_PROTOCOL],
- va_arg(param, char *));
- break;
-
- case CURLOPT_MAIL_FROM:
- /* Set the SMTP mail originator */
- result = setstropt(&data->set.str[STRING_MAIL_FROM],
- va_arg(param, char *));
- break;
-
- case CURLOPT_MAIL_AUTH:
- /* Set the SMTP auth originator */
- result = setstropt(&data->set.str[STRING_MAIL_AUTH],
- va_arg(param, char *));
- break;
-
- case CURLOPT_MAIL_RCPT:
- /* Set the list of mail recipients */
- data->set.mail_rcpt = va_arg(param, struct curl_slist *);
- break;
-
- case CURLOPT_SASL_IR:
- /* Enable/disable SASL initial response */
- data->set.sasl_ir = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_RTSP_REQUEST:
- {
- /*
- * Set the RTSP request method (OPTIONS, SETUP, PLAY, etc...)
- * Would this be better if the RTSPREQ_* were just moved into here?
- */
- long curl_rtspreq = va_arg(param, long);
- Curl_RtspReq rtspreq = RTSPREQ_NONE;
- switch(curl_rtspreq) {
- case CURL_RTSPREQ_OPTIONS:
- rtspreq = RTSPREQ_OPTIONS;
- break;
-
- case CURL_RTSPREQ_DESCRIBE:
- rtspreq = RTSPREQ_DESCRIBE;
- break;
-
- case CURL_RTSPREQ_ANNOUNCE:
- rtspreq = RTSPREQ_ANNOUNCE;
- break;
-
- case CURL_RTSPREQ_SETUP:
- rtspreq = RTSPREQ_SETUP;
- break;
-
- case CURL_RTSPREQ_PLAY:
- rtspreq = RTSPREQ_PLAY;
- break;
-
- case CURL_RTSPREQ_PAUSE:
- rtspreq = RTSPREQ_PAUSE;
- break;
-
- case CURL_RTSPREQ_TEARDOWN:
- rtspreq = RTSPREQ_TEARDOWN;
- break;
-
- case CURL_RTSPREQ_GET_PARAMETER:
- rtspreq = RTSPREQ_GET_PARAMETER;
- break;
-
- case CURL_RTSPREQ_SET_PARAMETER:
- rtspreq = RTSPREQ_SET_PARAMETER;
- break;
-
- case CURL_RTSPREQ_RECORD:
- rtspreq = RTSPREQ_RECORD;
- break;
-
- case CURL_RTSPREQ_RECEIVE:
- rtspreq = RTSPREQ_RECEIVE;
- break;
- default:
- rtspreq = RTSPREQ_NONE;
- }
-
- data->set.rtspreq = rtspreq;
- break;
- }
-
-
- case CURLOPT_RTSP_SESSION_ID:
- /*
- * Set the RTSP Session ID manually. Useful if the application is
- * resuming a previously established RTSP session
- */
- result = setstropt(&data->set.str[STRING_RTSP_SESSION_ID],
- va_arg(param, char *));
- break;
-
- case CURLOPT_RTSP_STREAM_URI:
- /*
- * Set the Stream URI for the RTSP request. Unless the request is
- * for generic server options, the application will need to set this.
- */
- result = setstropt(&data->set.str[STRING_RTSP_STREAM_URI],
- va_arg(param, char *));
- break;
-
- case CURLOPT_RTSP_TRANSPORT:
- /*
- * The content of the Transport: header for the RTSP request
- */
- result = setstropt(&data->set.str[STRING_RTSP_TRANSPORT],
- va_arg(param, char *));
- break;
-
- case CURLOPT_RTSP_CLIENT_CSEQ:
- /*
- * Set the CSEQ number to issue for the next RTSP request. Useful if the
- * application is resuming a previously broken connection. The CSEQ
- * will increment from this new number henceforth.
- */
- data->state.rtsp_next_client_CSeq = va_arg(param, long);
- break;
-
- case CURLOPT_RTSP_SERVER_CSEQ:
- /* Same as the above, but for server-initiated requests */
- data->state.rtsp_next_client_CSeq = va_arg(param, long);
- break;
-
- case CURLOPT_INTERLEAVEDATA:
- data->set.rtp_out = va_arg(param, void *);
- break;
- case CURLOPT_INTERLEAVEFUNCTION:
- /* Set the user defined RTP write function */
- data->set.fwrite_rtp = va_arg(param, curl_write_callback);
- break;
-
- case CURLOPT_WILDCARDMATCH:
- data->set.wildcardmatch = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_CHUNK_BGN_FUNCTION:
- data->set.chunk_bgn = va_arg(param, curl_chunk_bgn_callback);
- break;
- case CURLOPT_CHUNK_END_FUNCTION:
- data->set.chunk_end = va_arg(param, curl_chunk_end_callback);
- break;
- case CURLOPT_FNMATCH_FUNCTION:
- data->set.fnmatch = va_arg(param, curl_fnmatch_callback);
- break;
- case CURLOPT_CHUNK_DATA:
- data->wildcard.customptr = va_arg(param, void *);
- break;
- case CURLOPT_FNMATCH_DATA:
- data->set.fnmatch_data = va_arg(param, void *);
- break;
-#ifdef USE_TLS_SRP
- case CURLOPT_TLSAUTH_USERNAME:
- result = setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_ORIG],
- va_arg(param, char *));
- if(data->set.str[STRING_TLSAUTH_USERNAME_ORIG] && !data->set.ssl.authtype)
- data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
- break;
- case CURLOPT_PROXY_TLSAUTH_USERNAME:
- result = setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_PROXY],
- va_arg(param, char *));
- if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
- !data->set.proxy_ssl.authtype)
- data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
- break;
- case CURLOPT_TLSAUTH_PASSWORD:
- result = setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_ORIG],
- va_arg(param, char *));
- if(data->set.str[STRING_TLSAUTH_USERNAME_ORIG] && !data->set.ssl.authtype)
- data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
- break;
- case CURLOPT_PROXY_TLSAUTH_PASSWORD:
- result = setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_PROXY],
- va_arg(param, char *));
- if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
- !data->set.proxy_ssl.authtype)
- data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
- break;
- case CURLOPT_TLSAUTH_TYPE:
- argptr = va_arg(param, char *);
- if(!argptr ||
- strncasecompare(argptr, "SRP", strlen("SRP")))
- data->set.ssl.authtype = CURL_TLSAUTH_SRP;
- else
- data->set.ssl.authtype = CURL_TLSAUTH_NONE;
- break;
- case CURLOPT_PROXY_TLSAUTH_TYPE:
- argptr = va_arg(param, char *);
- if(!argptr ||
- strncasecompare(argptr, "SRP", strlen("SRP")))
- data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP;
- else
- data->set.proxy_ssl.authtype = CURL_TLSAUTH_NONE;
- break;
-#endif
- case CURLOPT_DNS_SERVERS:
- result = Curl_set_dns_servers(data, va_arg(param, char *));
- break;
- case CURLOPT_DNS_INTERFACE:
- result = Curl_set_dns_interface(data, va_arg(param, char *));
- break;
- case CURLOPT_DNS_LOCAL_IP4:
- result = Curl_set_dns_local_ip4(data, va_arg(param, char *));
- break;
- case CURLOPT_DNS_LOCAL_IP6:
- result = Curl_set_dns_local_ip6(data, va_arg(param, char *));
- break;
-
- case CURLOPT_TCP_KEEPALIVE:
- data->set.tcp_keepalive = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_TCP_KEEPIDLE:
- data->set.tcp_keepidle = va_arg(param, long);
- break;
- case CURLOPT_TCP_KEEPINTVL:
- data->set.tcp_keepintvl = va_arg(param, long);
- break;
- case CURLOPT_TCP_FASTOPEN:
-#if defined(CONNECT_DATA_IDEMPOTENT) || defined(MSG_FASTOPEN)
- data->set.tcp_fastopen = (0 != va_arg(param, long))?TRUE:FALSE;
-#else
- result = CURLE_NOT_BUILT_IN;
-#endif
- break;
- case CURLOPT_SSL_ENABLE_NPN:
- data->set.ssl_enable_npn = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_SSL_ENABLE_ALPN:
- data->set.ssl_enable_alpn = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
-#ifdef USE_UNIX_SOCKETS
- case CURLOPT_UNIX_SOCKET_PATH:
- data->set.abstract_unix_socket = FALSE;
- result = setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH],
- va_arg(param, char *));
- break;
- case CURLOPT_ABSTRACT_UNIX_SOCKET:
- data->set.abstract_unix_socket = TRUE;
- result = setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH],
- va_arg(param, char *));
- break;
-#endif
-
- case CURLOPT_PATH_AS_IS:
- data->set.path_as_is = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_PIPEWAIT:
- data->set.pipewait = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
- case CURLOPT_STREAM_WEIGHT:
-#ifndef USE_NGHTTP2
- return CURLE_NOT_BUILT_IN;
-#else
- arg = va_arg(param, long);
- if((arg>=1) && (arg <= 256))
- data->set.stream_weight = (int)arg;
- break;
-#endif
- case CURLOPT_STREAM_DEPENDS:
- case CURLOPT_STREAM_DEPENDS_E:
- {
-#ifndef USE_NGHTTP2
- return CURLE_NOT_BUILT_IN;
-#else
- struct Curl_easy *dep = va_arg(param, struct Curl_easy *);
- if(!dep || GOOD_EASY_HANDLE(dep)) {
- if(data->set.stream_depends_on) {
- Curl_http2_remove_child(data->set.stream_depends_on, data);
- }
- Curl_http2_add_child(dep, data, (option == CURLOPT_STREAM_DEPENDS_E));
- }
- break;
-#endif
- }
- case CURLOPT_CONNECT_TO:
- data->set.connect_to = va_arg(param, struct curl_slist *);
- break;
- case CURLOPT_SUPPRESS_CONNECT_HEADERS:
- data->set.suppress_connect_headers = (0 != va_arg(param, long))?TRUE:FALSE;
- break;
- default:
- /* unknown tag and its companion, just ignore: */
- result = CURLE_UNKNOWN_OPTION;
- break;
- }
-
- return result;
-}
-
#ifdef USE_RECV_BEFORE_SEND_WORKAROUND
static void conn_reset_postponed_data(struct connectdata *conn, int num)
{
@@ -3259,58 +924,6 @@ static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke)
}
}
-/*
- * This function finds the connection in the connection
- * cache that has been unused for the longest time.
- *
- * Returns the pointer to the oldest idle connection, or NULL if none was
- * found.
- */
-struct connectdata *
-Curl_oldest_idle_connection(struct Curl_easy *data)
-{
- struct conncache *bc = data->state.conn_cache;
- struct curl_hash_iterator iter;
- struct curl_llist_element *curr;
- struct curl_hash_element *he;
- time_t highscore=-1;
- time_t score;
- struct curltime now;
- struct connectdata *conn_candidate = NULL;
- struct connectbundle *bundle;
-
- now = Curl_tvnow();
-
- Curl_hash_start_iterate(&bc->hash, &iter);
-
- he = Curl_hash_next_element(&iter);
- while(he) {
- struct connectdata *conn;
-
- bundle = he->ptr;
-
- curr = bundle->conn_list.head;
- while(curr) {
- conn = curr->ptr;
-
- if(!conn->inuse) {
- /* Set higher score for the age passed since the connection was used */
- score = Curl_tvdiff(now, conn->now);
-
- if(score > highscore) {
- highscore = score;
- conn_candidate = conn;
- }
- }
- curr = curr->next;
- }
-
- he = Curl_hash_next_element(&iter);
- }
-
- return conn_candidate;
-}
-
static bool
proxy_info_matches(const struct proxy_info* data,
const struct proxy_info* needle)
@@ -3336,15 +949,15 @@ find_oldest_idle_connection_in_bundle(struct Curl_easy *data,
struct connectbundle *bundle)
{
struct curl_llist_element *curr;
- time_t highscore=-1;
- time_t score;
+ timediff_t highscore = -1;
+ timediff_t score;
struct curltime now;
struct connectdata *conn_candidate = NULL;
struct connectdata *conn;
(void)data;
- now = Curl_tvnow();
+ now = Curl_now();
curr = bundle->conn_list.head;
while(curr) {
@@ -3352,7 +965,7 @@ find_oldest_idle_connection_in_bundle(struct Curl_easy *data,
if(!conn->inuse) {
/* Set higher score for the age passed since the connection was used */
- score = Curl_tvdiff(now, conn->now);
+ score = Curl_timediff(now, conn->now);
if(score > highscore) {
highscore = score;
@@ -3426,11 +1039,11 @@ static int call_disconnect_if_dead(struct connectdata *conn,
*/
static void prune_dead_connections(struct Curl_easy *data)
{
- struct curltime now = Curl_tvnow();
- time_t elapsed = Curl_tvdiff(now, data->state.conn_cache->last_cleanup);
+ struct curltime now = Curl_now();
+ time_t elapsed = Curl_timediff(now, data->state.conn_cache->last_cleanup);
if(elapsed >= 1000L) {
- Curl_conncache_foreach(data->state.conn_cache, data,
+ Curl_conncache_foreach(data, data->state.conn_cache, data,
call_disconnect_if_dead);
data->state.conn_cache->last_cleanup = now;
}
@@ -3967,7 +1580,7 @@ int Curl_doing_getsock(struct connectdata *conn,
CURLcode Curl_protocol_connecting(struct connectdata *conn,
bool *done)
{
- CURLcode result=CURLE_OK;
+ CURLcode result = CURLE_OK;
if(conn && conn->handler->connecting) {
*done = FALSE;
@@ -3986,7 +1599,7 @@ CURLcode Curl_protocol_connecting(struct connectdata *conn,
CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done)
{
- CURLcode result=CURLE_OK;
+ CURLcode result = CURLE_OK;
if(conn && conn->handler->doing) {
*done = FALSE;
@@ -4006,7 +1619,7 @@ CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done)
CURLcode Curl_protocol_connect(struct connectdata *conn,
bool *protocol_done)
{
- CURLcode result=CURLE_OK;
+ CURLcode result = CURLE_OK;
*protocol_done = FALSE;
@@ -4074,7 +1687,7 @@ static bool is_ASCII_name(const char *hostname)
/*
* Perform any necessary IDN conversion of hostname
*/
-static void fix_hostname(struct connectdata *conn, struct hostname *host)
+static CURLcode fix_hostname(struct connectdata *conn, struct hostname *host)
{
size_t len;
struct Curl_easy *data = conn->data;
@@ -4093,7 +1706,7 @@ static void fix_hostname(struct connectdata *conn, struct hostname *host)
if(len && (host->name[len-1] == '.'))
/* strip off a single trailing dot if present, primarily for SNI but
there's no use for it */
- host->name[len-1]=0;
+ host->name[len-1] = 0;
/* Check name for non-ASCII and convert hostname to ACE form if we can */
if(!is_ASCII_name(host->name)) {
@@ -4114,9 +1727,11 @@ static void fix_hostname(struct connectdata *conn, struct hostname *host)
/* change the name pointer to point to the encoded hostname */
host->name = host->encalloc;
}
- else
- infof(data, "Failed to convert %s to ACE; %s\n", host->name,
+ else {
+ failf(data, "Failed to convert %s to ACE; %s\n", host->name,
idn2_strerror(rc));
+ return CURLE_URL_MALFORMAT;
+ }
}
#elif defined(USE_WIN32_IDN)
char *ace_hostname = NULL;
@@ -4126,12 +1741,24 @@ static void fix_hostname(struct connectdata *conn, struct hostname *host)
/* change the name pointer to point to the encoded hostname */
host->name = host->encalloc;
}
- else
- infof(data, "Failed to convert %s to ACE;\n", host->name);
+ else {
+ failf(data, "Failed to convert %s to ACE;\n", host->name);
+ return CURLE_URL_MALFORMAT;
+ }
#else
infof(data, "IDN support not present, can't parse Unicode domains\n");
#endif
}
+ {
+ char *hostp;
+ for(hostp = host->name; *hostp; hostp++) {
+ if(*hostp <= 32) {
+ failf(data, "Host name '%s' contains bad letter", host->name);
+ return CURLE_URL_MALFORMAT;
+ }
+ }
+ }
+ return CURLE_OK;
}
/*
@@ -4146,7 +1773,7 @@ static void free_fixed_hostname(struct hostname *host)
host->encalloc = NULL;
}
#elif defined(USE_WIN32_IDN)
- free(host->encalloc); /* must be freed withidn_free() since this was
+ free(host->encalloc); /* must be freed with free() since this was
allocated by curl_win32_idn_to_ascii */
host->encalloc = NULL;
#else
@@ -4166,10 +1793,41 @@ static void llist_dtor(void *user, void *element)
*/
static struct connectdata *allocate_conn(struct Curl_easy *data)
{
- struct connectdata *conn = calloc(1, sizeof(struct connectdata));
+ struct connectdata *conn;
+ size_t connsize = sizeof(struct connectdata);
+
+#ifdef USE_SSL
+/* SSLBK_MAX_ALIGN: The max byte alignment a CPU would use */
+#define SSLBK_MAX_ALIGN 32
+ /* The SSL backend-specific data (ssl_backend_data) objects are allocated as
+ part of connectdata at the end. To ensure suitable alignment we will
+ assume a maximum of SSLBK_MAX_ALIGN for alignment. Since calloc returns a
+ pointer suitably aligned for any variable this will ensure the
+ ssl_backend_data array has proper alignment, even if that alignment turns
+ out to be less than SSLBK_MAX_ALIGN. */
+ size_t paddingsize = sizeof(struct connectdata) % SSLBK_MAX_ALIGN;
+ size_t alignsize = paddingsize ? (SSLBK_MAX_ALIGN - paddingsize) : 0;
+ size_t sslbksize = Curl_ssl->sizeof_ssl_backend_data;
+ connsize += alignsize + (4 * sslbksize);
+#endif
+
+ conn = calloc(1, connsize);
if(!conn)
return NULL;
+#ifdef USE_SSL
+ /* Point to the ssl_backend_data objects at the end of connectdata.
+ Note that these backend pointers can be swapped by vtls (eg ssl backend
+ data becomes proxy backend data). */
+ {
+ char *end = (char *)conn + connsize;
+ conn->ssl[0].backend = ((void *)(end - (4 * sslbksize)));
+ conn->ssl[1].backend = ((void *)(end - (3 * sslbksize)));
+ conn->proxy_ssl[0].backend = ((void *)(end - (2 * sslbksize)));
+ conn->proxy_ssl[1].backend = ((void *)(end - (1 * sslbksize)));
+ }
+#endif
+
conn->handler = &Curl_handler_dummy; /* Be sure we have a handler defined
already from start to avoid NULL
situations and checks */
@@ -4194,7 +1852,7 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
connclose(conn, "Default to force-close");
/* Store creation time to help future close decision making */
- conn->created = Curl_tvnow();
+ conn->created = Curl_now();
conn->data = data; /* Setup the association between this connection
and the Curl_easy */
@@ -4390,6 +2048,14 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
('A' <= str[0] && str[0] <= 'Z')) && \
(str[1] == ':'))
+ /* MSDOS/Windows style drive prefix, optionally with
+ * a '|' instead of ':', followed by a slash or NUL */
+#define STARTS_WITH_URL_DRIVE_PREFIX(str) \
+ ((('a' <= (str)[0] && (str)[0] <= 'z') || \
+ ('A' <= (str)[0] && (str)[0] <= 'Z')) && \
+ ((str)[1] == ':' || (str)[1] == '|') && \
+ ((str)[2] == '/' || (str)[2] == 0))
+
/* Don't mistake a drive letter for a scheme if the default protocol is file.
curld --proto-default file c:/foo/bar.txt */
if(STARTS_WITH_DRIVE_PREFIX(data->change.url) &&
@@ -4422,63 +2088,90 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
return CURLE_URL_MALFORMAT;
}
- if(url_has_scheme && path[0] == '/' && path[1] == '/') {
- /* Allow omitted hostname (e.g. file:/<path>). This is not strictly
- * speaking a valid file: URL by RFC 1738, but treating file:/<path> as
- * file://localhost/<path> is similar to how other schemes treat missing
- * hostnames. See RFC 1808. */
-
- /* This cannot be done with strcpy() in a portable manner, since the
- memory areas overlap! */
- memmove(path, path + 2, strlen(path + 2)+1);
+ if(url_has_scheme && path[0] == '/' && path[1] == '/' &&
+ path[2] == '/' && path[3] == '/') {
+ /* This appears to be a UNC string (usually indicating a SMB share).
+ * We don't do SMB in file: URLs. (TODO?)
+ */
+ failf(data, "SMB shares are not supported in file: URLs.");
+ return CURLE_URL_MALFORMAT;
}
- /*
- * we deal with file://<host>/<path> differently since it supports no
- * hostname other than "localhost" and "127.0.0.1", which is unique among
- * the URL protocols specified in RFC 1738
+ /* Extra handling URLs with an authority component (i.e. that start with
+ * "file://")
+ *
+ * We allow omitted hostname (e.g. file:/<path>) -- valid according to
+ * RFC 8089, but not the (current) WHAT-WG URL spec.
*/
- if(path[0] != '/' && !STARTS_WITH_DRIVE_PREFIX(path)) {
- /* the URL includes a host name, it must match "localhost" or
- "127.0.0.1" to be valid */
- char *ptr;
- if(!checkprefix("localhost/", path) &&
- !checkprefix("127.0.0.1/", path)) {
- failf(data, "Invalid file://hostname/, "
- "expected localhost or 127.0.0.1 or none");
- return CURLE_URL_MALFORMAT;
- }
- ptr = &path[9]; /* now points to the slash after the host */
-
- /* there was a host name and slash present
-
- RFC1738 (section 3.1, page 5) says:
-
- The rest of the locator consists of data specific to the scheme,
- and is known as the "url-path". It supplies the details of how the
- specified resource can be accessed. Note that the "/" between the
- host (or port) and the url-path is NOT part of the url-path.
+ if(url_has_scheme && path[0] == '/' && path[1] == '/') {
+ /* swallow the two slashes */
+ char *ptr = &path[2];
- As most agents use file://localhost/foo to get '/foo' although the
- slash preceding foo is a separator and not a slash for the path,
- a URL as file://localhost//foo must be valid as well, to refer to
- the same file with an absolute path.
- */
+ /*
+ * According to RFC 8089, a file: URL can be reliably dereferenced if:
+ *
+ * o it has no/blank hostname, or
+ *
+ * o the hostname matches "localhost" (case-insensitively), or
+ *
+ * o the hostname is a FQDN that resolves to this machine.
+ *
+ * For brevity, we only consider URLs with empty, "localhost", or
+ * "127.0.0.1" hostnames as local.
+ *
+ * Additionally, there is an exception for URLs with a Windows drive
+ * letter in the authority (which was accidentally omitted from RFC 8089
+ * Appendix E, but believe me, it was meant to be there. --MK)
+ */
+ if(ptr[0] != '/' && !STARTS_WITH_URL_DRIVE_PREFIX(ptr)) {
+ /* the URL includes a host name, it must match "localhost" or
+ "127.0.0.1" to be valid */
+ if(!checkprefix("localhost/", ptr) &&
+ !checkprefix("127.0.0.1/", ptr)) {
+ failf(data, "Invalid file://hostname/, "
+ "expected localhost or 127.0.0.1 or none");
+ return CURLE_URL_MALFORMAT;
+ }
+ ptr += 9; /* now points to the slash after the host */
+ }
- if('/' == ptr[1])
- /* if there was two slashes, we skip the first one as that is then
- used truly as a separator */
+ /*
+ * RFC 8089, Appendix D, Section D.1, says:
+ *
+ * > In a POSIX file system, the root of the file system is represented
+ * > as a directory with a zero-length name, usually written as "/"; the
+ * > presence of this root in a file URI can be taken as given by the
+ * > initial slash in the "path-absolute" rule.
+ *
+ * i.e. the first slash is part of the path.
+ *
+ * However in RFC 1738 the "/" between the host (or port) and the
+ * URL-path was NOT part of the URL-path. Any agent that followed the
+ * older spec strictly, and wanted to refer to a file with an absolute
+ * path, would have included a second slash. So if there are two
+ * slashes, swallow one.
+ */
+ if('/' == ptr[1]) /* note: the only way ptr[0]!='/' is if ptr[1]==':' */
ptr++;
- /* This cannot be made with strcpy, as the memory chunks overlap! */
- memmove(path, ptr, strlen(ptr)+1);
+ /* This cannot be done with strcpy, as the memory chunks overlap! */
+ memmove(path, ptr, strlen(ptr) + 1);
}
#if !defined(MSDOS) && !defined(WIN32) && !defined(__CYGWIN__)
- if(STARTS_WITH_DRIVE_PREFIX(path)) {
+ /* Don't allow Windows drive letters when not in Windows.
+ * This catches both "file:/c:" and "file:c:" */
+ if(('/' == path[0] && STARTS_WITH_URL_DRIVE_PREFIX(&path[1])) ||
+ STARTS_WITH_URL_DRIVE_PREFIX(path)) {
failf(data, "File drive letters are only accepted in MSDOS/Windows.");
return CURLE_URL_MALFORMAT;
}
+#else
+ /* If the path starts with a slash and a drive letter, ditch the slash */
+ if('/' == path[0] && STARTS_WITH_URL_DRIVE_PREFIX(&path[1])) {
+ /* This cannot be done with strcpy, as the memory chunks overlap! */
+ memmove(path, &path[1], strlen(&path[1]) + 1);
+ }
#endif
protop = "file"; /* protocol string */
@@ -4487,7 +2180,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
else {
/* clear path */
char slashbuf[4];
- path[0]=0;
+ path[0] = 0;
rc = sscanf(data->change.url,
"%15[^\n/:]:%3[/]%[^\n/?#]%[^\n]",
@@ -4572,7 +2265,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
*/
at = strchr(conn->host.name, '@');
if(at)
- query = strchr(at+1, '?');
+ query = strchr(at + 1, '?');
else
query = strchr(conn->host.name, '?');
@@ -4590,15 +2283,15 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
/* move the existing path plus the zero byte forward, to make room for
the host-name part */
- memmove(path+hostlen+1, path, pathlen+1);
+ memmove(path + hostlen + 1, path, pathlen + 1);
/* now copy the trailing host part in front of the existing path */
- memcpy(path+1, query, hostlen);
+ memcpy(path + 1, query, hostlen);
path[0]='/'; /* prepend the missing slash */
rebuild_url = TRUE;
- *query=0; /* now cut off the hostname at the ? */
+ *query = 0; /* now cut off the hostname at the ? */
}
else if(!path[0]) {
/* if there's no path set, use a single slash */
@@ -4614,7 +2307,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
/* We need this function to deal with overlapping memory areas. We know
that the memory area 'path' points to is 'urllen' bytes big and that
is bigger than the path. Use +1 to move the zero byte too. */
- memmove(&path[1], path, strlen(path)+1);
+ memmove(&path[1], path, strlen(path) + 1);
path[0] = '/';
rebuild_url = TRUE;
}
@@ -4720,7 +2413,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
if(*endp == ']') {
/* The address scope was well formed. Knock it out of the
hostname. */
- memmove(percent, endp, strlen(endp)+1);
+ memmove(percent, endp, strlen(endp) + 1);
conn->scope_id = (unsigned int)scope;
}
else {
@@ -4990,7 +2683,7 @@ static char *detect_proxy(struct connectdata *conn)
strcpy(envp, "_proxy");
/* read the protocol proxy: */
- prox=curl_getenv(proxy_env);
+ prox = curl_getenv(proxy_env);
/*
* We don't try the uppercase version of HTTP_PROXY because of
@@ -5007,7 +2700,7 @@ static char *detect_proxy(struct connectdata *conn)
if(!prox && !strcasecompare("http_proxy", proxy_env)) {
/* There was no lowercase variable, try the uppercase version: */
Curl_strntoupper(proxy_env, proxy_env, sizeof(proxy_env));
- prox=curl_getenv(proxy_env);
+ prox = curl_getenv(proxy_env);
}
if(prox)
@@ -5015,7 +2708,7 @@ static char *detect_proxy(struct connectdata *conn)
else {
proxy = curl_getenv("all_proxy"); /* default proxy to use */
if(!proxy)
- proxy=curl_getenv("ALL_PROXY");
+ proxy = curl_getenv("ALL_PROXY");
}
return proxy;
@@ -5050,7 +2743,7 @@ static CURLcode parse_proxy(struct Curl_easy *data,
/* Parse the protocol part if present */
endofprot = strstr(proxy, "://");
if(endofprot) {
- proxyptr = endofprot+3;
+ proxyptr = endofprot + 3;
if(checkprefix("https", proxy))
proxytype = CURLPROXY_HTTPS;
else if(checkprefix("socks5h", proxy))
@@ -5072,13 +2765,14 @@ static CURLcode parse_proxy(struct Curl_easy *data,
else
proxyptr = proxy; /* No xxx:// head: It's a HTTP proxy */
-#ifndef HTTPS_PROXY_SUPPORT
- if(proxytype == CURLPROXY_HTTPS) {
- failf(data, "Unsupported proxy \'%s\'"
- ", libcurl is built without the HTTPS-proxy support.", proxy);
- return CURLE_NOT_BUILT_IN;
- }
+#ifdef USE_SSL
+ if(!Curl_ssl->support_https_proxy)
#endif
+ if(proxytype == CURLPROXY_HTTPS) {
+ failf(data, "Unsupported proxy \'%s\', libcurl is built without the "
+ "HTTPS-proxy support.", proxy);
+ return CURLE_NOT_BUILT_IN;
+ }
sockstype = proxytype == CURLPROXY_SOCKS5_HOSTNAME ||
proxytype == CURLPROXY_SOCKS5 ||
@@ -5089,8 +2783,8 @@ static CURLcode parse_proxy(struct Curl_easy *data,
atsign = strchr(proxyptr, '@');
if(atsign) {
CURLcode result =
- parse_login_details(proxyptr, atsign - proxyptr,
- &proxyuser, &proxypasswd, NULL);
+ Curl_parse_login_details(proxyptr, atsign - proxyptr,
+ &proxyuser, &proxypasswd, NULL);
if(result)
return result;
proxyptr = atsign + 1;
@@ -5299,22 +2993,21 @@ static CURLcode create_conn_helper_init_proxy(struct connectdata *conn)
}
}
- no_proxy = curl_getenv("no_proxy");
- if(!no_proxy)
- no_proxy = curl_getenv("NO_PROXY");
+ if(!data->set.str[STRING_NOPROXY]) {
+ no_proxy = curl_getenv("no_proxy");
+ if(!no_proxy)
+ no_proxy = curl_getenv("NO_PROXY");
+ }
- if(check_noproxy(conn->host.name, data->set.str[STRING_NOPROXY]) ||
- (!data->set.str[STRING_NOPROXY] &&
- check_noproxy(conn->host.name, no_proxy))) {
+ if(check_noproxy(conn->host.name, data->set.str[STRING_NOPROXY] ?
+ data->set.str[STRING_NOPROXY] : no_proxy)) {
Curl_safefree(proxy);
Curl_safefree(socksproxy);
}
- else if(!proxy && !socksproxy)
#ifndef CURL_DISABLE_HTTP
+ else if(!proxy && !socksproxy)
/* if the host is not in the noproxy list, detect proxy. */
proxy = detect_proxy(conn);
-#else /* !CURL_DISABLE_HTTP */
- proxy = NULL;
#endif /* CURL_DISABLE_HTTP */
Curl_safefree(no_proxy);
@@ -5482,10 +3175,11 @@ static CURLcode parse_url_login(struct Curl_easy *data,
/* We could use the login information in the URL so extract it. Only parse
options if the handler says we should. */
- result = parse_login_details(login, ptr - login - 1,
- &userp, &passwdp,
- (conn->handler->flags & PROTOPT_URLOPTIONS)?
- &optionsp:NULL);
+ result =
+ Curl_parse_login_details(login, ptr - login - 1,
+ &userp, &passwdp,
+ (conn->handler->flags & PROTOPT_URLOPTIONS)?
+ &optionsp:NULL);
if(result)
goto out;
@@ -5541,7 +3235,7 @@ static CURLcode parse_url_login(struct Curl_easy *data,
}
/*
- * parse_login_details()
+ * Curl_parse_login_details()
*
* This is used to parse a login string for user name, password and options in
* the following formats:
@@ -5569,9 +3263,9 @@ static CURLcode parse_url_login(struct Curl_easy *data,
*
* Returns CURLE_OK on success.
*/
-static CURLcode parse_login_details(const char *login, const size_t len,
- char **userp, char **passwdp,
- char **optionsp)
+CURLcode Curl_parse_login_details(const char *login, const size_t len,
+ char **userp, char **passwdp,
+ char **optionsp)
{
CURLcode result = CURLE_OK;
char *ubuf = NULL;
@@ -5700,7 +3394,13 @@ static CURLcode parse_remote_port(struct Curl_easy *data,
portptr = strchr(conn->host.name, ']');
if(portptr) {
*portptr++ = '\0'; /* zero terminate, killing the bracket */
- if(':' != *portptr)
+ if(*portptr) {
+ if (*portptr != ':') {
+ failf(data, "IPv6 closing bracket followed by '%c'", *portptr);
+ return CURLE_URL_MALFORMAT;
+ }
+ }
+ else
portptr = NULL; /* no port number available */
}
}
@@ -5762,7 +3462,7 @@ static CURLcode parse_remote_port(struct Curl_easy *data,
char *rest;
long port;
- port=strtol(portptr+1, &rest, 10); /* Port number must be decimal */
+ port = strtol(portptr + 1, &rest, 10); /* Port number must be decimal */
if((port < 0) || (port > 0xffff)) {
/* Single unix standard says port numbers are 16 bits long */
@@ -6118,8 +3818,8 @@ static CURLcode resolve_server(struct Curl_easy *data,
struct connectdata *conn,
bool *async)
{
- CURLcode result=CURLE_OK;
- time_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
+ CURLcode result = CURLE_OK;
+ timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
/*************************************************************
* Resolve the name of the server or proxy
@@ -6281,11 +3981,10 @@ static void reuse_conn(struct connectdata *old_conn,
free_fixed_hostname(&conn->conn_to_host);
Curl_safefree(conn->host.rawalloc);
Curl_safefree(conn->conn_to_host.rawalloc);
- conn->host=old_conn->host;
- conn->bits.conn_to_host = old_conn->bits.conn_to_host;
+ conn->host = old_conn->host;
conn->conn_to_host = old_conn->conn_to_host;
- conn->bits.conn_to_port = old_conn->bits.conn_to_port;
conn->conn_to_port = old_conn->conn_to_port;
+ conn->remote_port = old_conn->remote_port;
/* persist connection info in session handle */
Curl_persistconninfo(conn);
@@ -6384,9 +4083,9 @@ static CURLcode create_conn(struct Curl_easy *data,
* other parts of the code will rely on this fact
***********************************************************/
#define LEAST_PATH_ALLOC 256
- urllen=strlen(data->change.url);
+ urllen = strlen(data->change.url);
if(urllen < LEAST_PATH_ALLOC)
- urllen=LEAST_PATH_ALLOC;
+ urllen = LEAST_PATH_ALLOC;
/*
* We malloc() the buffers below urllen+2 to make room for 2 possibilities:
@@ -6397,14 +4096,14 @@ static CURLcode create_conn(struct Curl_easy *data,
Curl_safefree(data->state.pathbuffer);
data->state.path = NULL;
- data->state.pathbuffer = malloc(urllen+2);
+ data->state.pathbuffer = malloc(urllen + 2);
if(NULL == data->state.pathbuffer) {
result = CURLE_OUT_OF_MEMORY; /* really bad error */
goto out;
}
data->state.path = data->state.pathbuffer;
- conn->host.rawalloc = malloc(urllen+2);
+ conn->host.rawalloc = malloc(urllen + 2);
if(NULL == conn->host.rawalloc) {
Curl_safefree(data->state.pathbuffer);
data->state.path = NULL;
@@ -6537,13 +4236,24 @@ static CURLcode create_conn(struct Curl_easy *data,
/*************************************************************
* IDN-fix the hostnames
*************************************************************/
- fix_hostname(conn, &conn->host);
- if(conn->bits.conn_to_host)
- fix_hostname(conn, &conn->conn_to_host);
- if(conn->bits.httpproxy)
- fix_hostname(conn, &conn->http_proxy.host);
- if(conn->bits.socksproxy)
- fix_hostname(conn, &conn->socks_proxy.host);
+ result = fix_hostname(conn, &conn->host);
+ if(result)
+ goto out;
+ if(conn->bits.conn_to_host) {
+ result = fix_hostname(conn, &conn->conn_to_host);
+ if(result)
+ goto out;
+ }
+ if(conn->bits.httpproxy) {
+ result = fix_hostname(conn, &conn->http_proxy.host);
+ if(result)
+ goto out;
+ }
+ if(conn->bits.socksproxy) {
+ result = fix_hostname(conn, &conn->socks_proxy.host);
+ if(result)
+ goto out;
+ }
/*************************************************************
* Check whether the host and the "connect to host" are equal.
@@ -6786,7 +4496,7 @@ static CURLcode create_conn(struct Curl_easy *data,
struct connectdata *conn_candidate;
/* The cache is full. Let's see if we can kill a connection. */
- conn_candidate = Curl_oldest_idle_connection(data);
+ conn_candidate = Curl_conncache_oldest_idle(data);
if(conn_candidate) {
/* Set the connection's owner correctly, then kill it */
@@ -6921,7 +4631,7 @@ CURLcode Curl_setup_conn(struct connectdata *conn,
/* set start time here for timeout purposes in the connect procedure, it
is later set again for the progress meter purpose */
- conn->now = Curl_tvnow();
+ conn->now = Curl_now();
if(CURL_SOCKET_BAD == conn->sock[FIRSTSOCKET]) {
conn->bits.tcpconnect[FIRSTSOCKET] = FALSE;
@@ -6938,7 +4648,7 @@ CURLcode Curl_setup_conn(struct connectdata *conn,
Curl_verboseconnect(conn);
}
- conn->now = Curl_tvnow(); /* time this *after* the connect is done, we
+ conn->now = Curl_now(); /* time this *after* the connect is done, we
set this here perhaps a second time */
#ifdef __EMX__
@@ -7011,13 +4721,17 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
{
struct SingleRequest *k = &data->req;
- if(conn)
- conn->bits.do_more = FALSE; /* by default there's no curl_do_more() to
- * use */
+ conn->bits.do_more = FALSE; /* by default there's no curl_do_more() to
+ use */
data->state.done = FALSE; /* *_done() is not called yet */
data->state.expect100header = FALSE;
+ /* if the protocol used doesn't support wildcards, switch it off */
+ if(data->state.wildcardmatch &&
+ !(conn->handler->flags & PROTOPT_WILDCARD))
+ data->state.wildcardmatch = FALSE;
+
if(data->set.opt_no_body)
/* in HTTP lingo, no body means using the HEAD request... */
data->set.httpreq = HTTPREQ_HEAD;
@@ -7029,7 +4743,7 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
HTTP. */
data->set.httpreq = HTTPREQ_GET;
- k->start = Curl_tvnow(); /* start time */
+ k->start = Curl_now(); /* start time */
k->now = k->start; /* current time is now */
k->header = TRUE; /* assume header */
@@ -7037,7 +4751,7 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
k->buf = data->state.buffer;
k->hbufp = data->state.headerbuff;
- k->ignorebody=FALSE;
+ k->ignorebody = FALSE;
Curl_speedinit(data);
diff --git a/lib/url.h b/lib/url.h
index f13c8e6..5dd04fd 100644
--- a/lib/url.h
+++ b/lib/url.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,6 +23,10 @@
***************************************************************************/
#include "curl_setup.h"
+#define READBUFFER_SIZE CURL_MAX_WRITE_SIZE
+#define READBUFFER_MAX CURL_MAX_READ_SIZE
+#define READBUFFER_MIN 1024
+
/*
* Prototypes for library-wide functions provided by url.c
*/
@@ -51,14 +55,14 @@ int Curl_protocol_getsock(struct connectdata *conn,
int Curl_doing_getsock(struct connectdata *conn,
curl_socket_t *socks,
int numsocks);
-
+CURLcode Curl_parse_login_details(const char *login, const size_t len,
+ char **userptr, char **passwdptr,
+ char **optionsptr);
bool Curl_isPipeliningEnabled(const struct Curl_easy *handle);
CURLcode Curl_addHandleToPipeline(struct Curl_easy *handle,
struct curl_llist *pipeline);
int Curl_removeHandleFromPipeline(struct Curl_easy *handle,
struct curl_llist *pipeline);
-struct connectdata *
-Curl_oldest_idle_connection(struct Curl_easy *data);
/* remove the specified connection from all (possible) pipelines and related
queues */
void Curl_getoff_all_pipelines(struct Curl_easy *data,
diff --git a/lib/urldata.h b/lib/urldata.h
index b4f18e7..edd1fd9 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -82,89 +82,12 @@
#include "cookie.h"
#include "formdata.h"
-#ifdef USE_OPENSSL
-#include <openssl/ssl.h>
-#ifdef HAVE_OPENSSL_ENGINE_H
-#include <openssl/engine.h>
-#endif
-#endif /* USE_OPENSSL */
-
-#ifdef USE_GNUTLS
-#include <gnutls/gnutls.h>
-#endif
-
-#ifdef USE_MBEDTLS
-
-#include <mbedtls/ssl.h>
-#include <mbedtls/version.h>
-#include <mbedtls/entropy.h>
-#include <mbedtls/ctr_drbg.h>
-
-#elif defined USE_POLARSSL
-
-#include <polarssl/ssl.h>
-#include <polarssl/version.h>
-#if POLARSSL_VERSION_NUMBER<0x01010000
-#include <polarssl/havege.h>
-#else
-#include <polarssl/entropy.h>
-#include <polarssl/ctr_drbg.h>
-#endif /* POLARSSL_VERSION_NUMBER<0x01010000 */
-
-#endif /* USE_POLARSSL */
-
-#ifdef USE_CYASSL
-#undef OCSP_REQUEST /* avoid cyassl/openssl/ssl.h clash with wincrypt.h */
-#undef OCSP_RESPONSE /* avoid cyassl/openssl/ssl.h clash with wincrypt.h */
-#include <cyassl/openssl/ssl.h>
-#endif
-
-#ifdef USE_NSS
-#include <nspr.h>
-#include <pk11pub.h>
-#endif
-
-#ifdef USE_GSKIT
-#include <gskssl.h>
-#endif
-
-#ifdef USE_AXTLS
-#include <axTLS/config.h>
-#include <axTLS/ssl.h>
-#undef malloc
-#undef calloc
-#undef realloc
-#endif /* USE_AXTLS */
-
-#if defined(USE_SCHANNEL) || defined(USE_WINDOWS_SSPI)
-#include "curl_sspi.h"
-#endif
-#ifdef USE_SCHANNEL
-#include <schnlsp.h>
-#include <schannel.h>
-#endif
-
-#ifdef USE_DARWINSSL
-#include <Security/Security.h>
-/* For some reason, when building for iOS, the omnibus header above does
- * not include SecureTransport.h as of iOS SDK 5.1. */
-#include <Security/SecureTransport.h>
-#endif
-
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#include "timeval.h"
-#ifdef HAVE_ZLIB_H
-#include <zlib.h> /* for content-encoding */
-#ifdef __SYMBIAN32__
-/* zlib pollutes the namespace with this definition */
-#undef WIN32
-#endif
-#endif
-
#include <curl/curl.h>
#include "http_chunks.h" /* for the structs and enum stuff */
@@ -172,6 +95,7 @@
#include "hash.h"
#include "splay.h"
+#include "mime.h"
#include "imap.h"
#include "pop3.h"
#include "smtp.h"
@@ -240,20 +164,6 @@ enum protection_level {
};
#endif
-#ifdef USE_SCHANNEL
-/* Structs to store Schannel handles */
-struct curl_schannel_cred {
- CredHandle cred_handle;
- TimeStamp time_stamp;
- int refcount;
-};
-
-struct curl_schannel_ctxt {
- CtxtHandle ctxt_handle;
- TimeStamp time_stamp;
-};
-#endif
-
/* enum for the nonblocking SSL connection state machine */
typedef enum {
ssl_connect_1,
@@ -270,6 +180,9 @@ typedef enum {
ssl_connection_complete
} ssl_connection_state;
+/* SSL backend-specific data; declared differently by each SSL backend */
+struct ssl_backend_data;
+
/* struct for data related to each SSL connection */
struct ssl_connect_data {
/* Use ssl encrypted communications TRUE/FALSE, not necessarily using it atm
@@ -278,78 +191,8 @@ struct ssl_connect_data {
bool use;
ssl_connection_state state;
ssl_connect_state connecting_state;
-#if defined(USE_OPENSSL)
- /* these ones requires specific SSL-types */
- SSL_CTX* ctx;
- SSL* handle;
- X509* server_cert;
-#elif defined(USE_GNUTLS)
- gnutls_session_t session;
- gnutls_certificate_credentials_t cred;
-#ifdef USE_TLS_SRP
- gnutls_srp_client_credentials_t srp_client_cred;
-#endif
-#elif defined(USE_MBEDTLS)
- mbedtls_ctr_drbg_context ctr_drbg;
- mbedtls_entropy_context entropy;
- mbedtls_ssl_context ssl;
- int server_fd;
- mbedtls_x509_crt cacert;
- mbedtls_x509_crt clicert;
- mbedtls_x509_crl crl;
- mbedtls_pk_context pk;
- mbedtls_ssl_config config;
- const char *protocols[3];
-#elif defined(USE_POLARSSL)
- ctr_drbg_context ctr_drbg;
- entropy_context entropy;
- ssl_context ssl;
- int server_fd;
- x509_crt cacert;
- x509_crt clicert;
- x509_crl crl;
- rsa_context rsa;
-#elif defined(USE_CYASSL)
- SSL_CTX* ctx;
- SSL* handle;
-#elif defined(USE_NSS)
- PRFileDesc *handle;
- char *client_nickname;
- struct Curl_easy *data;
- struct curl_llist obj_list;
- PK11GenericObject *obj_clicert;
-#elif defined(USE_GSKIT)
- gsk_handle handle;
- int iocport;
- int localfd;
- int remotefd;
-#elif defined(USE_AXTLS)
- SSL_CTX* ssl_ctx;
- SSL* ssl;
-#elif defined(USE_SCHANNEL)
- struct curl_schannel_cred *cred;
- struct curl_schannel_ctxt *ctxt;
- SecPkgContext_StreamSizes stream_sizes;
- size_t encdata_length, decdata_length;
- size_t encdata_offset, decdata_offset;
- unsigned char *encdata_buffer, *decdata_buffer;
- /* encdata_is_incomplete: if encdata contains only a partial record that
- can't be decrypted without another Curl_read_plain (that is, status is
- SEC_E_INCOMPLETE_MESSAGE) then set this true. after Curl_read_plain writes
- more bytes into encdata then set this back to false. */
- bool encdata_is_incomplete;
- unsigned long req_flags, ret_flags;
- CURLcode recv_unrecoverable_err; /* schannel_recv had an unrecoverable err */
- bool recv_sspi_close_notify; /* true if connection closed by close_notify */
- bool recv_connection_closed; /* true if connection closed, regardless how */
- bool use_alpn; /* true if ALPN is used for this connection */
-#elif defined(USE_DARWINSSL)
- SSLContextRef ssl_ctx;
- curl_socket_t ssl_sockfd;
- bool ssl_direction; /* true if writing, false if reading */
- size_t ssl_write_buffered_length;
-#elif defined(USE_SSL)
-#error "SSL backend specific information missing from ssl_connect_data"
+#if defined(USE_SSL)
+ struct ssl_backend_data *backend;
#endif
};
@@ -359,13 +202,13 @@ struct ssl_primary_config {
bool verifypeer; /* set TRUE if this is desired */
bool verifyhost; /* set TRUE if CN/SAN must match hostname */
bool verifystatus; /* set TRUE if certificate status must be checked */
+ bool sessionid; /* cache session IDs or not */
char *CApath; /* certificate dir (doesn't work on windows) */
char *CAfile; /* certificate to verify peer against */
char *clientcert;
char *random_file; /* path to file containing "random" data */
char *egdsocket; /* path to file containing the EGD daemon socket */
char *cipher_list; /* list of ciphers to use */
- bool sessionid; /* cache session IDs or not */
};
struct ssl_config_data {
@@ -411,6 +254,10 @@ struct curl_ssl_session {
struct ssl_primary_config ssl_config; /* setup for this session */
};
+#ifdef USE_WINDOWS_SSPI
+#include "curl_sspi.h"
+#endif
+
/* Struct used for Digest challenge-response authentication */
struct digestdata {
#if defined(USE_WINDOWS_SSPI)
@@ -431,6 +278,7 @@ struct digestdata {
char *qop;
char *algorithm;
int nc; /* nounce count */
+ bool userhash;
#endif
};
@@ -442,10 +290,6 @@ typedef enum {
NTLMSTATE_LAST
} curlntlm;
-#ifdef USE_WINDOWS_SSPI
-#include "curl_sspi.h"
-#endif
-
#if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
#include <iconv.h>
#endif
@@ -612,16 +456,6 @@ struct hostname {
#define KEEP_SENDBITS (KEEP_SEND | KEEP_SEND_HOLD | KEEP_SEND_PAUSE)
-#ifdef HAVE_LIBZ
-typedef enum {
- ZLIB_UNINIT, /* uninitialized */
- ZLIB_INIT, /* initialized */
- ZLIB_GZIP_HEADER, /* reading gzip header */
- ZLIB_GZIP_INFLATING, /* inflating gzip stream */
- ZLIB_INIT_GZIP /* initialized in transparent gzip mode */
-} zlibInitState;
-#endif
-
#ifdef CURLRES_ASYNCH
struct Curl_async {
char *hostname;
@@ -709,18 +543,8 @@ struct SingleRequest {
enum expect100 exp100; /* expect 100 continue state */
enum upgrade101 upgr101; /* 101 upgrade state */
- int auto_decoding; /* What content encoding. sec 3.5, RFC2616. */
-
-#define IDENTITY 0 /* No encoding */
-#define DEFLATE 1 /* zlib deflate [RFC 1950 & 1951] */
-#define GZIP 2 /* gzip algorithm [RFC 1952] */
-
-#ifdef HAVE_LIBZ
- zlibInitState zlib_init; /* possible zlib init state;
- undefined if Content-Encoding header. */
- z_stream z; /* State structure for zlib. */
-#endif
-
+ struct contenc_writer_s *writer_stack; /* Content unencoding stack. */
+ /* See sec 3.5, RFC2616. */
time_t timeofdoc;
long bodywrites;
@@ -868,6 +692,7 @@ struct Curl_handler {
#define PROTOPT_PROXY_AS_HTTP (1<<11) /* allow this non-HTTP scheme over a
HTTP proxy as HTTP proxies may know
this protocol and act as a gateway */
+#define PROTOPT_WILDCARD (1<<12) /* protocol supports wildcard matching */
#define CONNCHECK_NONE 0 /* No checks */
#define CONNCHECK_ISDEAD (1<<0) /* Check if the connection is dead. */
@@ -1259,6 +1084,8 @@ struct Progress {
struct curltime t_startop;
struct curltime t_acceptdata;
+ bool is_t_startransfer_set;
+
/* upload speed limit */
struct curltime ul_limit_start;
curl_off_t ul_limit_size;
@@ -1266,7 +1093,7 @@ struct Progress {
struct curltime dl_limit_start;
curl_off_t dl_limit_size;
-#define CURR_TIME (5+1) /* 6 entries for 5 seconds */
+#define CURR_TIME (5 + 1) /* 6 entries for 5 seconds */
curl_off_t speeder[ CURR_TIME ];
struct curltime speeder_time[ CURR_TIME ];
@@ -1278,6 +1105,7 @@ typedef enum {
HTTPREQ_GET,
HTTPREQ_POST,
HTTPREQ_POST_FORM, /* we make a difference internally */
+ HTTPREQ_POST_MIME, /* we make a difference internally */
HTTPREQ_PUT,
HTTPREQ_HEAD,
HTTPREQ_OPTIONS,
@@ -1387,7 +1215,7 @@ struct UrlState {
size_t headersize; /* size of the allocation */
char *buffer; /* download buffer */
- char uploadbuffer[UPLOAD_BUFSIZE+1]; /* upload buffer */
+ char uploadbuffer[UPLOAD_BUFSIZE + 1]; /* upload buffer */
curl_off_t current_speed; /* the ProgressShow() function sets this,
bytes / second */
bool this_is_a_follow; /* this is a followed Location: request */
@@ -1431,7 +1259,8 @@ struct UrlState {
ares_channel f.e. */
#if defined(USE_OPENSSL) && defined(HAVE_OPENSSL_ENGINE_H)
- ENGINE *engine;
+ /* void instead of ENGINE to avoid bleeding OpenSSL into this header */
+ void *engine;
#endif /* USE_OPENSSL */
struct curltime expiretime; /* set this with Curl_expire() only */
struct Curl_tree timenode; /* for the splay stuff */
@@ -1443,7 +1272,7 @@ struct UrlState {
/* set after initial USER failure, to prevent an authentication loop */
bool ftp_trying_alternative;
-
+ bool wildcardmatch; /* enable wildcard matching */
int httpversion; /* the lowest HTTP version*10 reported by any server
involved in this request */
bool expect100header; /* TRUE if we added Expect: 100-continue */
@@ -1588,7 +1417,7 @@ enum dupstring {
STRING_PROXY_SERVICE_NAME, /* Proxy service name */
#endif
#if !defined(CURL_DISABLE_CRYPTO_AUTH) || defined(USE_KERBEROS5) || \
- defined(USE_SPNEGO)
+ defined(USE_SPNEGO) || defined(HAVE_GSSAPI)
STRING_SERVICE_NAME, /* Service name */
#endif
STRING_MAIL_FROM,
@@ -1694,7 +1523,8 @@ struct UserDefined {
curl_off_t set_resume_from; /* continue [ftp] transfer from here */
struct curl_slist *headers; /* linked list of extra headers */
struct curl_slist *proxyheaders; /* linked list of extra CONNECT headers */
- struct curl_httppost *httppost; /* linked list of POST data */
+ struct curl_httppost *httppost; /* linked list of old POST data */
+ curl_mimepart mimepost; /* MIME/POST data. */
bool sep_headers; /* handle host and proxy headers separately */
bool cookiesession; /* new cookie session? */
bool crlf; /* convert crlf on ftp upload(?) */
@@ -1740,6 +1570,7 @@ struct UserDefined {
curl_sshkeycallback ssh_keyfunc; /* key matching callback */
void *ssh_keyfunc_userp; /* custom pointer to callback */
+ bool ssh_compression; /* enable SSH compression */
/* Here follows boolean settings that define how to behave during
this session. They are STATIC, set by libcurl users or at least initially
@@ -1805,7 +1636,7 @@ struct UserDefined {
/* Common RTSP header options */
Curl_RtspReq rtspreq; /* RTSP request type */
long rtspversion; /* like httpversion, for RTSP */
- bool wildcardmatch; /* enable wildcard matching */
+ bool wildcard_enabled; /* enable wildcard matching */
curl_chunk_bgn_callback chunk_bgn; /* called before part of transfer
starts */
curl_chunk_end_callback chunk_end; /* called after part transferring
diff --git a/lib/vauth/digest.c b/lib/vauth/digest.c
index 185098e..131d9da 100644
--- a/lib/vauth/digest.c
+++ b/lib/vauth/digest.c
@@ -19,6 +19,7 @@
* KIND, either express or implied.
*
* RFC2831 DIGEST-MD5 authentication
+ * RFC7616 DIGEST-SHA256, DIGEST-SHA512-256 authentication
*
***************************************************************************/
@@ -34,6 +35,7 @@
#include "curl_base64.h"
#include "curl_hmac.h"
#include "curl_md5.h"
+#include "curl_sha256.h"
#include "vtls/vtls.h"
#include "warnless.h"
#include "strtok.h"
@@ -144,6 +146,15 @@ static void auth_digest_md5_to_ascii(unsigned char *source, /* 16 bytes */
snprintf((char *) &dest[i * 2], 3, "%02x", source[i]);
}
+/* Convert sha256 chunk to RFC7616 -suitable ascii string*/
+static void auth_digest_sha256_to_ascii(unsigned char *source, /* 32 bytes */
+ unsigned char *dest) /* 65 bytes */
+{
+ int i;
+ for(i = 0; i < 32; i++)
+ snprintf((char *) &dest[i * 2], 3, "%02x", source[i]);
+}
+
/* Perform quoted-string escaping as described in RFC2616 and its errata */
static char *auth_digest_string_quoted(const char *source)
{
@@ -602,9 +613,22 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
digest->algo = CURLDIGESTALGO_MD5SESS;
else if(strcasecompare(content, "MD5"))
digest->algo = CURLDIGESTALGO_MD5;
+ else if(strcasecompare(content, "SHA-256"))
+ digest->algo = CURLDIGESTALGO_SHA256;
+ else if(strcasecompare(content, "SHA-256-SESS"))
+ digest->algo = CURLDIGESTALGO_SHA256SESS;
+ else if(strcasecompare(content, "SHA-512-256"))
+ digest->algo = CURLDIGESTALGO_SHA512_256;
+ else if(strcasecompare(content, "SHA-512-256-SESS"))
+ digest->algo = CURLDIGESTALGO_SHA512_256SESS;
else
return CURLE_BAD_CONTENT_ENCODING;
}
+ else if(strcasecompare(value, "userhash")) {
+ if(strcasecompare(content, "true")) {
+ digest->userhash = TRUE;
+ }
+ }
else {
/* Unknown specifier, ignore it! */
}
@@ -635,7 +659,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
}
/*
- * Curl_auth_create_digest_http_message()
+ * _Curl_auth_create_digest_http_message()
*
* This is used to generate a HTTP DIGEST response message ready for sending
* to the recipient.
@@ -654,20 +678,24 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
*
* Returns CURLE_OK on success.
*/
-CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
- const char *userp,
- const char *passwdp,
- const unsigned char *request,
- const unsigned char *uripath,
- struct digestdata *digest,
- char **outptr, size_t *outlen)
+static CURLcode _Curl_auth_create_digest_http_message(
+ struct Curl_easy *data,
+ const char *userp,
+ const char *passwdp,
+ const unsigned char *request,
+ const unsigned char *uripath,
+ struct digestdata *digest,
+ char **outptr, size_t *outlen,
+ void (*convert_to_ascii)(unsigned char *, unsigned char *),
+ void (*hash)(unsigned char *, const unsigned char *))
{
CURLcode result;
- unsigned char md5buf[16]; /* 16 bytes/128 bits */
- unsigned char request_digest[33];
- unsigned char *md5this;
- unsigned char ha1[33]; /* 32 digits and 1 zero byte */
- unsigned char ha2[33]; /* 32 digits and 1 zero byte */
+ unsigned char hashbuf[32]; /* 32 bytes/256 bits */
+ unsigned char request_digest[65];
+ unsigned char *hashthis;
+ unsigned char ha1[65]; /* 64 digits and 1 zero byte */
+ unsigned char ha2[65]; /* 64 digits and 1 zero byte */
+ char userh[65];
char cnoncebuf[33];
char *cnonce = NULL;
size_t cnonce_sz = 0;
@@ -692,6 +720,17 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
digest->cnonce = cnonce;
}
+ if(digest->userhash) {
+ hashthis = (unsigned char *) aprintf("%s:%s", userp, digest->realm);
+ if(!hashthis)
+ return CURLE_OUT_OF_MEMORY;
+
+ CURL_OUTPUT_DIGEST_CONV(data, hashthis);
+ hash(hashbuf, hashthis);
+ free(hashthis);
+ convert_to_ascii(hashbuf, (unsigned char *)userh);
+ }
+
/*
If the algorithm is "MD5" or unspecified (which then defaults to MD5):
@@ -703,26 +742,29 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
unq(nonce-value) ":" unq(cnonce-value)
*/
- md5this = (unsigned char *)
- aprintf("%s:%s:%s", userp, digest->realm, passwdp);
- if(!md5this)
+ hashthis = (unsigned char *)
+ aprintf("%s:%s:%s", digest->userhash ? userh : userp,
+ digest->realm, passwdp);
+ if(!hashthis)
return CURLE_OUT_OF_MEMORY;
- CURL_OUTPUT_DIGEST_CONV(data, md5this); /* convert on non-ASCII machines */
- Curl_md5it(md5buf, md5this);
- free(md5this);
- auth_digest_md5_to_ascii(md5buf, ha1);
+ CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
+ hash(hashbuf, hashthis);
+ free(hashthis);
+ convert_to_ascii(hashbuf, ha1);
- if(digest->algo == CURLDIGESTALGO_MD5SESS) {
+ if(digest->algo == CURLDIGESTALGO_MD5SESS ||
+ digest->algo == CURLDIGESTALGO_SHA256SESS ||
+ digest->algo == CURLDIGESTALGO_SHA512_256SESS) {
/* nonce and cnonce are OUTSIDE the hash */
tmp = aprintf("%s:%s:%s", ha1, digest->nonce, digest->cnonce);
if(!tmp)
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, tmp); /* Convert on non-ASCII machines */
- Curl_md5it(md5buf, (unsigned char *) tmp);
+ hash(hashbuf, (unsigned char *) tmp);
free(tmp);
- auth_digest_md5_to_ascii(md5buf, ha1);
+ convert_to_ascii(hashbuf, ha1);
}
/*
@@ -738,27 +780,32 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
5.1.1 of RFC 2616)
*/
- md5this = (unsigned char *) aprintf("%s:%s", request, uripath);
+ hashthis = (unsigned char *) aprintf("%s:%s", request, uripath);
if(digest->qop && strcasecompare(digest->qop, "auth-int")) {
/* We don't support auth-int for PUT or POST at the moment.
- TODO: replace md5 of empty string with entity-body for PUT/POST */
- unsigned char *md5this2 = (unsigned char *)
- aprintf("%s:%s", md5this, "d41d8cd98f00b204e9800998ecf8427e");
- free(md5this);
- md5this = md5this2;
+ TODO: replace hash of empty string with entity-body for PUT/POST */
+ char hashed[65];
+ unsigned char *hashthis2;
+
+ hash(hashbuf, (const unsigned char *)"");
+ convert_to_ascii(hashbuf, (unsigned char *)hashed);
+
+ hashthis2 = (unsigned char *)aprintf("%s:%s", hashthis, hashed);
+ free(hashthis);
+ hashthis = hashthis2;
}
- if(!md5this)
+ if(!hashthis)
return CURLE_OUT_OF_MEMORY;
- CURL_OUTPUT_DIGEST_CONV(data, md5this); /* convert on non-ASCII machines */
- Curl_md5it(md5buf, md5this);
- free(md5this);
- auth_digest_md5_to_ascii(md5buf, ha2);
+ CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
+ hash(hashbuf, hashthis);
+ free(hashthis);
+ convert_to_ascii(hashbuf, ha2);
if(digest->qop) {
- md5this = (unsigned char *) aprintf("%s:%s:%08x:%s:%s:%s",
+ hashthis = (unsigned char *) aprintf("%s:%s:%08x:%s:%s:%s",
ha1,
digest->nonce,
digest->nc,
@@ -767,19 +814,19 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
ha2);
}
else {
- md5this = (unsigned char *) aprintf("%s:%s:%s",
+ hashthis = (unsigned char *) aprintf("%s:%s:%s",
ha1,
digest->nonce,
ha2);
}
- if(!md5this)
+ if(!hashthis)
return CURLE_OUT_OF_MEMORY;
- CURL_OUTPUT_DIGEST_CONV(data, md5this); /* convert on non-ASCII machines */
- Curl_md5it(md5buf, md5this);
- free(md5this);
- auth_digest_md5_to_ascii(md5buf, request_digest);
+ CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
+ hash(hashbuf, hashthis);
+ free(hashthis);
+ convert_to_ascii(hashbuf, request_digest);
/* For test case 64 (snooped from a Mozilla 1.3a request)
@@ -794,7 +841,7 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
characters. algorithm and qop with standard values only contain web-safe
characters.
*/
- userp_quoted = auth_digest_string_quoted(userp);
+ userp_quoted = auth_digest_string_quoted(digest->userhash ? userh : userp);
if(!userp_quoted)
return CURLE_OUT_OF_MEMORY;
@@ -858,6 +905,16 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
response = tmp;
}
+ if(digest->userhash) {
+ /* Append the userhash */
+ tmp = aprintf("%s, userhash=true", response);
+ free(response);
+ if(!tmp)
+ return CURLE_OUT_OF_MEMORY;
+
+ response = tmp;
+ }
+
/* Return the output */
*outptr = response;
*outlen = strlen(response);
@@ -866,6 +923,58 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
}
/*
+ * Curl_auth_create_digest_http_message()
+ *
+ * This is used to generate a HTTP DIGEST response message ready for sending
+ * to the recipient.
+ *
+ * Parameters:
+ *
+ * data [in] - The session handle.
+ * userp [in] - The user name.
+ * passdwp [in] - The user's password.
+ * request [in] - The HTTP request.
+ * uripath [in] - The path of the HTTP uri.
+ * digest [in/out] - The digest data struct being used and modified.
+ * outptr [in/out] - The address where a pointer to newly allocated memory
+ * holding the result will be stored upon completion.
+ * outlen [out] - The length of the output message.
+ *
+ * Returns CURLE_OK on success.
+ */
+CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
+ const char *userp,
+ const char *passwdp,
+ const unsigned char *request,
+ const unsigned char *uripath,
+ struct digestdata *digest,
+ char **outptr, size_t *outlen)
+{
+ switch(digest->algo) {
+ case CURLDIGESTALGO_MD5:
+ case CURLDIGESTALGO_MD5SESS:
+ return _Curl_auth_create_digest_http_message(data, userp, passwdp,
+ request, uripath, digest,
+ outptr, outlen,
+ auth_digest_md5_to_ascii,
+ Curl_md5it);
+
+ case CURLDIGESTALGO_SHA256:
+ case CURLDIGESTALGO_SHA256SESS:
+ case CURLDIGESTALGO_SHA512_256:
+ case CURLDIGESTALGO_SHA512_256SESS:
+ return _Curl_auth_create_digest_http_message(data, userp, passwdp,
+ request, uripath, digest,
+ outptr, outlen,
+ auth_digest_sha256_to_ascii,
+ Curl_sha256it);
+
+ default:
+ return CURLE_UNSUPPORTED_PROTOCOL;
+ }
+}
+
+/*
* Curl_auth_digest_cleanup()
*
* This is used to clean up the digest specific data.
@@ -887,6 +996,7 @@ void Curl_auth_digest_cleanup(struct digestdata *digest)
digest->nc = 0;
digest->algo = CURLDIGESTALGO_MD5; /* default algorithm */
digest->stale = FALSE; /* default means normal, not stale */
+ digest->userhash = FALSE;
}
#endif /* !USE_WINDOWS_SSPI */
diff --git a/lib/vauth/digest.h b/lib/vauth/digest.h
index 5722dce..8686c44 100644
--- a/lib/vauth/digest.h
+++ b/lib/vauth/digest.h
@@ -31,7 +31,11 @@
enum {
CURLDIGESTALGO_MD5,
- CURLDIGESTALGO_MD5SESS
+ CURLDIGESTALGO_MD5SESS,
+ CURLDIGESTALGO_SHA256,
+ CURLDIGESTALGO_SHA256SESS,
+ CURLDIGESTALGO_SHA512_256,
+ CURLDIGESTALGO_SHA512_256SESS
};
/* This is used to extract the realm from a challenge message */
diff --git a/lib/vauth/digest_sspi.c b/lib/vauth/digest_sspi.c
index f5d619c..a3f96ed 100644
--- a/lib/vauth/digest_sspi.c
+++ b/lib/vauth/digest_sspi.c
@@ -352,8 +352,8 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
if(!Curl_auth_digest_get_pair(p, value, content, &p))
break;
- if(Curl_strcasecompare(value, "stale")
- && Curl_strcasecompare(content, "true")) {
+ if(strcasecompare(value, "stale") &&
+ strcasecompare(content, "true")) {
stale = true;
break;
}
diff --git a/lib/vauth/ntlm.c b/lib/vauth/ntlm.c
index 4219645..1e0d479 100644
--- a/lib/vauth/ntlm.c
+++ b/lib/vauth/ntlm.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,7 +44,9 @@
#include "rand.h"
#include "vtls/vtls.h"
-#ifdef USE_NSS
+/* SSL backend-specific #if branches in this file must be kept in the order
+ documented in curl_ntlm_core. */
+#if defined(NTLM_NEEDS_NSS_INIT)
#include "vtls/nssg.h" /* for Curl_nss_force_init() */
#endif
@@ -272,7 +274,7 @@ CURLcode Curl_auth_decode_ntlm_type2_message(struct Curl_easy *data,
unsigned char *type2 = NULL;
size_t type2_len = 0;
-#if defined(USE_NSS)
+#if defined(NTLM_NEEDS_NSS_INIT)
/* Make sure the crypto backend is initialized */
result = Curl_nss_force_init(data);
if(result)
@@ -350,6 +352,7 @@ static void unicodecpy(unsigned char *dest, const char *src, size_t length)
*
* Parameters:
*
+ * data [in] - The session handle.
* userp [in] - The user name in the format User or Domain\User.
* passdwp [in] - The user's password.
* ntlm [in/out] - The NTLM data struct being used and modified.
@@ -359,7 +362,8 @@ static void unicodecpy(unsigned char *dest, const char *src, size_t length)
*
* Returns CURLE_OK on success.
*/
-CURLcode Curl_auth_create_ntlm_type1_message(const char *userp,
+CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
+ const char *userp,
const char *passwdp,
struct ntlmdata *ntlm,
char **outptr, size_t *outlen)
@@ -458,7 +462,7 @@ CURLcode Curl_auth_create_ntlm_type1_message(const char *userp,
});
/* Return with binary blob encoded into base64 */
- return Curl_base64_encode(NULL, (char *)ntlmbuf, size, outptr, outlen);
+ return Curl_base64_encode(data, (char *)ntlmbuf, size, outptr, outlen);
}
/*
@@ -539,8 +543,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
else
user = userp;
- if(user)
- userlen = strlen(user);
+ userlen = strlen(user);
/* Get the machine's un-qualified host name as NTLM doesn't like the fully
qualified domain name */
@@ -827,7 +830,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
return CURLE_CONV_FAILED;
/* Return with binary blob encoded into base64 */
- result = Curl_base64_encode(NULL, (char *)ntlmbuf, size, outptr, outlen);
+ result = Curl_base64_encode(data, (char *)ntlmbuf, size, outptr, outlen);
Curl_auth_ntlm_cleanup(ntlm);
diff --git a/lib/vauth/ntlm_sspi.c b/lib/vauth/ntlm_sspi.c
index c330517..e748ce3 100644
--- a/lib/vauth/ntlm_sspi.c
+++ b/lib/vauth/ntlm_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -29,6 +29,7 @@
#include "vauth/vauth.h"
#include "urldata.h"
#include "curl_base64.h"
+#include "curl_ntlm_core.h"
#include "warnless.h"
#include "curl_multibyte.h"
#include "sendf.h"
@@ -66,6 +67,7 @@ bool Curl_auth_is_ntlm_supported(void)
*
* Parameters:
*
+ * data [in] - The session handle.
* userp [in] - The user name in the format User or Domain\User.
* passdwp [in] - The user's password.
* ntlm [in/out] - The NTLM data struct being used and modified.
@@ -75,7 +77,8 @@ bool Curl_auth_is_ntlm_supported(void)
*
* Returns CURLE_OK on success.
*/
-CURLcode Curl_auth_create_ntlm_type1_message(const char *userp,
+CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
+ const char *userp,
const char *passwdp,
struct ntlmdata *ntlm,
char **outptr, size_t *outlen)
@@ -166,7 +169,7 @@ CURLcode Curl_auth_create_ntlm_type1_message(const char *userp,
return CURLE_RECV_ERROR;
/* Base64 encode the response */
- return Curl_base64_encode(NULL, (char *) ntlm->output_token,
+ return Curl_base64_encode(data, (char *) ntlm->output_token,
type_1_buf.cbBuffer, outptr, outlen);
}
diff --git a/lib/vauth/vauth.h b/lib/vauth/vauth.h
index 9d61228..dfaf985 100644
--- a/lib/vauth/vauth.h
+++ b/lib/vauth/vauth.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014 - 2016, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2017, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -119,7 +119,8 @@ void Curl_auth_digest_cleanup(struct digestdata *digest);
bool Curl_auth_is_ntlm_supported(void);
/* This is used to generate a base64 encoded NTLM type-1 message */
-CURLcode Curl_auth_create_ntlm_type1_message(const char *userp,
+CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
+ const char *userp,
const char *passwdp,
struct ntlmdata *ntlm,
char **outptr,
diff --git a/lib/version.c b/lib/version.c
index 3d17768..79cc0bb 100644
--- a/lib/version.c
+++ b/lib/version.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -64,6 +64,18 @@
#define CURL_LIBSSH2_VERSION LIBSSH2_VERSION
#endif
+#ifdef HAVE_ZLIB_H
+#include <zlib.h>
+#ifdef __SYMBIAN32__
+/* zlib pollutes the namespace with this definition */
+#undef WIN32
+#endif
+#endif
+
+#ifdef HAVE_BROTLI
+#include <brotli/decode.h>
+#endif
+
void Curl_version_init(void);
/* For thread safety purposes this function is called by global_init so that
@@ -74,6 +86,18 @@ void Curl_version_init(void)
curl_version_info(CURLVERSION_NOW);
}
+#ifdef HAVE_BROTLI
+static size_t brotli_version(char *buf, size_t bufsz)
+{
+ uint32_t brotli_version = BrotliDecoderVersion();
+ unsigned int major = brotli_version >> 24;
+ unsigned int minor = (brotli_version & 0x00FFFFFF) >> 12;
+ unsigned int patch = brotli_version & 0x00000FFF;
+
+ return snprintf(buf, bufsz, "%u.%u.%u", major, minor, patch);
+}
+#endif
+
char *curl_version(void)
{
static bool initialized;
@@ -105,6 +129,14 @@ char *curl_version(void)
left -= len;
ptr += len;
#endif
+#ifdef HAVE_BROTLI
+ len = snprintf(ptr, left, "%s", " brotli/");
+ left -= len;
+ ptr += len;
+ len = brotli_version(ptr, left);
+ left -= len;
+ ptr += len;
+#endif
#ifdef USE_ARES
/* this function is only present in c-ares, not in the original ares */
len = snprintf(ptr, left, " c-ares/%s", ares_version(NULL));
@@ -324,8 +356,11 @@ static curl_version_info_data version_info = {
#if defined(USE_LIBPSL)
| CURL_VERSION_PSL
#endif
-#if defined(HTTPS_PROXY_SUPPORT)
- | CURL_VERSION_HTTPS_PROXY
+#if defined(CURL_WITH_MULTI_SSL)
+ | CURL_VERSION_MULTI_SSL
+#endif
+#if defined(HAVE_BROTLI)
+ | CURL_VERSION_BROTLI
#endif
,
NULL, /* ssl_version */
@@ -337,6 +372,8 @@ static curl_version_info_data version_info = {
NULL, /* libidn version */
0, /* iconv version */
NULL, /* ssh lib version */
+ 0, /* brotli_ver_num */
+ NULL, /* brotli version */
};
curl_version_info_data *curl_version_info(CURLversion stamp)
@@ -348,6 +385,9 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
#ifdef USE_SSL
static char ssl_buffer[80];
#endif
+#ifdef HAVE_BROTLI
+ static char brotli_buffer[80];
+#endif
if(initialized)
return &version_info;
@@ -355,6 +395,10 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
#ifdef USE_SSL
Curl_ssl_version(ssl_buffer, sizeof(ssl_buffer));
version_info.ssl_version = ssl_buffer;
+ if(Curl_ssl->support_https_proxy)
+ version_info.features |= CURL_VERSION_HTTPS_PROXY;
+ else
+ version_info.features &= ~CURL_VERSION_HTTPS_PROXY;
#endif
#ifdef HAVE_LIBZ
@@ -392,6 +436,12 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
version_info.libssh_version = ssh_buffer;
#endif
+#ifdef HAVE_BROTLI
+ version_info.brotli_ver_num = BrotliDecoderVersion();
+ brotli_version(brotli_buffer, sizeof brotli_buffer);
+ version_info.brotli_version = brotli_buffer;
+#endif
+
(void)stamp; /* avoid compiler warnings, we don't use this */
initialized = true;
diff --git a/lib/vtls/axtls.c b/lib/vtls/axtls.c
index f0e3766..9294f49 100644
--- a/lib/vtls/axtls.c
+++ b/lib/vtls/axtls.c
@@ -47,21 +47,12 @@
#include "curl_memory.h"
#include "memdebug.h"
+struct ssl_backend_data {
+ SSL_CTX* ssl_ctx;
+ SSL* ssl;
+};
-/* Global axTLS init, called from Curl_ssl_init() */
-int Curl_axtls_init(void)
-{
-/* axTLS has no global init. Everything is done through SSL and SSL_CTX
- * structs stored in connectdata structure. Perhaps can move to axtls.h.
- */
- return 1;
-}
-
-int Curl_axtls_cleanup(void)
-{
- /* axTLS has no global cleanup. Perhaps can move this to axtls.h. */
- return 1;
-}
+#define BACKEND connssl->backend
static CURLcode map_error_to_curl(int axtls_err)
{
@@ -120,13 +111,13 @@ static Curl_send axtls_send;
static void free_ssl_structs(struct ssl_connect_data *connssl)
{
- if(connssl->ssl) {
- ssl_free(connssl->ssl);
- connssl->ssl = NULL;
+ if(BACKEND->ssl) {
+ ssl_free(BACKEND->ssl);
+ BACKEND->ssl = NULL;
}
- if(connssl->ssl_ctx) {
- ssl_ctx_free(connssl->ssl_ctx);
- connssl->ssl_ctx = NULL;
+ if(BACKEND->ssl_ctx) {
+ ssl_ctx_free(BACKEND->ssl_ctx);
+ BACKEND->ssl_ctx = NULL;
}
}
@@ -137,6 +128,7 @@ static void free_ssl_structs(struct ssl_connect_data *connssl)
*/
static CURLcode connect_prep(struct connectdata *conn, int sockindex)
{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
struct Curl_easy *data = conn->data;
SSL_CTX *ssl_ctx;
SSL *ssl = NULL;
@@ -151,7 +143,7 @@ static CURLcode connect_prep(struct connectdata *conn, int sockindex)
SSL_SERVER_VERIFY_LATER |
SSL_CONNECT_IN_PARTS;
- if(conn->ssl[sockindex].state == ssl_connection_complete)
+ if(connssl->state == ssl_connection_complete)
/* to make us tolerant against being called more than once for the
same connection */
return CURLE_OK;
@@ -185,8 +177,8 @@ static CURLcode connect_prep(struct connectdata *conn, int sockindex)
return CURLE_SSL_CONNECT_ERROR;
}
- conn->ssl[sockindex].ssl_ctx = ssl_ctx;
- conn->ssl[sockindex].ssl = NULL;
+ BACKEND->ssl_ctx = ssl_ctx;
+ BACKEND->ssl = NULL;
/* Load the trusted CA cert bundle file */
if(SSL_CONN_CONFIG(CAfile)) {
@@ -212,7 +204,7 @@ static CURLcode connect_prep(struct connectdata *conn, int sockindex)
/* Load client certificate */
if(SSL_SET_OPTION(cert)) {
- i=0;
+ i = 0;
/* Instead of trying to analyze cert type here, let axTLS try them all. */
while(cert_types[i] != 0) {
ssl_fcn_return = ssl_obj_load(ssl_ctx, cert_types[i],
@@ -236,7 +228,7 @@ static CURLcode connect_prep(struct connectdata *conn, int sockindex)
If a pkcs12 file successfully loaded a cert, then there's nothing to do
because the key has already been loaded. */
if(SSL_SET_OPTION(key) && cert_types[i] != SSL_OBJ_PKCS12) {
- i=0;
+ i = 0;
/* Instead of trying to analyze key type here, let axTLS try them all. */
while(key_types[i] != 0) {
ssl_fcn_return = ssl_obj_load(ssl_ctx, key_types[i],
@@ -281,10 +273,26 @@ static CURLcode connect_prep(struct connectdata *conn, int sockindex)
if(!ssl)
ssl = ssl_client_new(ssl_ctx, conn->sock[sockindex], NULL, 0, NULL);
- conn->ssl[sockindex].ssl = ssl;
+ BACKEND->ssl = ssl;
return CURLE_OK;
}
+static void Curl_axtls_close(struct connectdata *conn, int sockindex)
+{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+
+ infof(conn->data, " Curl_axtls_close\n");
+
+ /* line from openssl.c: (void)SSL_shutdown(BACKEND->ssl);
+ axTLS compat layer does nothing for SSL_shutdown */
+
+ /* The following line is from openssl.c. There seems to be no axTLS
+ equivalent. ssl_free and ssl_ctx_free close things.
+ SSL_set_connect_state(connssl->handle); */
+
+ free_ssl_structs(connssl);
+}
+
/*
* For both blocking and non-blocking connects, this function finalizes the
* SSL connection.
@@ -292,7 +300,8 @@ static CURLcode connect_prep(struct connectdata *conn, int sockindex)
static CURLcode connect_finish(struct connectdata *conn, int sockindex)
{
struct Curl_easy *data = conn->data;
- SSL *ssl = conn->ssl[sockindex].ssl;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ SSL *ssl = BACKEND->ssl;
const char *peer_CN;
uint32_t dns_altname_index;
const char *dns_altname;
@@ -387,7 +396,7 @@ static CURLcode connect_finish(struct connectdata *conn, int sockindex)
}
/* General housekeeping */
- conn->ssl[sockindex].state = ssl_connection_complete;
+ connssl->state = ssl_connection_complete;
conn->recv[sockindex] = axtls_recv;
conn->send[sockindex] = axtls_send;
@@ -409,11 +418,10 @@ static CURLcode connect_finish(struct connectdata *conn, int sockindex)
* Use axTLS's non-blocking connection feature to open an SSL connection.
* This is called after a TCP connection is already established.
*/
-CURLcode Curl_axtls_connect_nonblocking(
- struct connectdata *conn,
- int sockindex,
- bool *done)
+static CURLcode Curl_axtls_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
CURLcode conn_step;
int ssl_fcn_return;
int i;
@@ -421,23 +429,23 @@ CURLcode Curl_axtls_connect_nonblocking(
*done = FALSE;
/* connectdata is calloc'd and connecting_state is only changed in this
function, so this is safe, as the state is effectively initialized. */
- if(conn->ssl[sockindex].connecting_state == ssl_connect_1) {
+ if(connssl->connecting_state == ssl_connect_1) {
conn_step = connect_prep(conn, sockindex);
if(conn_step != CURLE_OK) {
Curl_axtls_close(conn, sockindex);
return conn_step;
}
- conn->ssl[sockindex].connecting_state = ssl_connect_2;
+ connssl->connecting_state = ssl_connect_2;
}
- if(conn->ssl[sockindex].connecting_state == ssl_connect_2) {
+ if(connssl->connecting_state == ssl_connect_2) {
/* Check to make sure handshake was ok. */
- if(ssl_handshake_status(conn->ssl[sockindex].ssl) != SSL_OK) {
+ if(ssl_handshake_status(BACKEND->ssl) != SSL_OK) {
/* Loop to perform more work in between sleeps. This is work around the
fact that axtls does not expose any knowledge about when work needs
to be performed. This can save ~25% of time on SSL handshakes. */
- for(i=0; i<5; i++) {
- ssl_fcn_return = ssl_read(conn->ssl[sockindex].ssl, NULL);
+ for(i = 0; i<5; i++) {
+ ssl_fcn_return = ssl_read(BACKEND->ssl, NULL);
if(ssl_fcn_return < 0) {
Curl_axtls_close(conn, sockindex);
ssl_display_error(ssl_fcn_return); /* goes to stdout. */
@@ -447,10 +455,10 @@ CURLcode Curl_axtls_connect_nonblocking(
}
}
infof(conn->data, "handshake completed successfully\n");
- conn->ssl[sockindex].connecting_state = ssl_connect_3;
+ connssl->connecting_state = ssl_connect_3;
}
- if(conn->ssl[sockindex].connecting_state == ssl_connect_3) {
+ if(connssl->connecting_state == ssl_connect_3) {
conn_step = connect_finish(conn, sockindex);
if(conn_step != CURLE_OK) {
Curl_axtls_close(conn, sockindex);
@@ -458,15 +466,15 @@ CURLcode Curl_axtls_connect_nonblocking(
}
/* Reset connect state */
- conn->ssl[sockindex].connecting_state = ssl_connect_1;
+ connssl->connecting_state = ssl_connect_1;
*done = TRUE;
return CURLE_OK;
}
/* Unrecognized state. Things are very bad. */
- conn->ssl[sockindex].state = ssl_connection_none;
- conn->ssl[sockindex].connecting_state = ssl_connect_1;
+ connssl->state = ssl_connection_none;
+ connssl->connecting_state = ssl_connect_1;
/* Return value perhaps not strictly correct, but distinguishes the issue.*/
return CURLE_BAD_FUNCTION_ARGUMENT;
}
@@ -476,15 +484,13 @@ CURLcode Curl_axtls_connect_nonblocking(
* This function is called after the TCP connect has completed. Setup the TLS
* layer and do all necessary magic for a blocking connect.
*/
-CURLcode
-Curl_axtls_connect(struct connectdata *conn,
- int sockindex)
-
+static CURLcode Curl_axtls_connect(struct connectdata *conn, int sockindex)
{
struct Curl_easy *data = conn->data;
CURLcode conn_step = connect_prep(conn, sockindex);
int ssl_fcn_return;
- SSL *ssl = conn->ssl[sockindex].ssl;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ SSL *ssl = BACKEND->ssl;
long timeout_ms;
if(conn_step != CURLE_OK) {
@@ -530,8 +536,9 @@ static ssize_t axtls_send(struct connectdata *conn,
size_t len,
CURLcode *err)
{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
/* ssl_write() returns 'int' while write() and send() returns 'size_t' */
- int rc = ssl_write(conn->ssl[sockindex].ssl, mem, (int)len);
+ int rc = ssl_write(BACKEND->ssl, mem, (int)len);
infof(conn->data, " axtls_send\n");
@@ -544,27 +551,11 @@ static ssize_t axtls_send(struct connectdata *conn,
return rc;
}
-void Curl_axtls_close(struct connectdata *conn, int sockindex)
-{
- struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-
- infof(conn->data, " Curl_axtls_close\n");
-
- /* line from openssl.c: (void)SSL_shutdown(connssl->ssl);
- axTLS compat layer does nothing for SSL_shutdown */
-
- /* The following line is from openssl.c. There seems to be no axTLS
- equivalent. ssl_free and ssl_ctx_free close things.
- SSL_set_connect_state(connssl->handle); */
-
- free_ssl_structs(connssl);
-}
-
/*
* This function is called to shut down the SSL layer but keep the
* socket open (CCC - Clear Command Channel)
*/
-int Curl_axtls_shutdown(struct connectdata *conn, int sockindex)
+static int Curl_axtls_shutdown(struct connectdata *conn, int sockindex)
{
/* Outline taken from openssl.c since functions are in axTLS compat layer.
axTLS's error set is much smaller, so a lot of error-handling was removed.
@@ -584,17 +575,17 @@ int Curl_axtls_shutdown(struct connectdata *conn, int sockindex)
/* axTLS compat layer does nothing for SSL_shutdown, so we do nothing too
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
- (void)SSL_shutdown(connssl->ssl);
+ (void)SSL_shutdown(BACKEND->ssl);
*/
- if(connssl->ssl) {
+ if(BACKEND->ssl) {
int what = SOCKET_READABLE(conn->sock[sockindex], SSL_SHUTDOWN_TIMEOUT);
if(what > 0) {
/* Something to read, let's do it and hope that it is the close
notify alert from the server. buf is managed internally by
axTLS and will be released upon calling ssl_free via
free_ssl_structs. */
- nread = (ssize_t)ssl_read(connssl->ssl, &buf);
+ nread = (ssize_t)ssl_read(BACKEND->ssl, &buf);
if(nread < SSL_OK) {
failf(data, "close notify alert not received during shutdown");
@@ -630,7 +621,7 @@ static ssize_t axtls_recv(struct connectdata *conn, /* connection data */
*err = CURLE_OK;
if(connssl) {
- ret = ssl_read(connssl->ssl, &read_buf);
+ ret = ssl_read(BACKEND->ssl, &read_buf);
if(ret > SSL_OK) {
/* ssl_read returns SSL_OK if there is more data to read, so if it is
larger, then all data has been read already. */
@@ -663,9 +654,10 @@ static ssize_t axtls_recv(struct connectdata *conn, /* connection data */
* 0 means the connection has been closed
* -1 means the connection status is unknown
*/
-int Curl_axtls_check_cxn(struct connectdata *conn)
+static int Curl_axtls_check_cxn(struct connectdata *conn)
{
- /* openssl.c line: rc = SSL_peek(conn->ssl[FIRSTSOCKET].ssl, (void*)&buf, 1);
+ /* openssl.c line:
+ rc = SSL_peek(conn->ssl[FIRSTSOCKET].backend->ssl, (void*)&buf, 1);
axTLS compat layer always returns the last argument, so connection is
always alive? */
@@ -673,7 +665,7 @@ int Curl_axtls_check_cxn(struct connectdata *conn)
return 1; /* connection still in place */
}
-void Curl_axtls_session_free(void *ptr)
+static void Curl_axtls_session_free(void *ptr)
{
(void)ptr;
/* free the ID */
@@ -681,14 +673,13 @@ void Curl_axtls_session_free(void *ptr)
compatibility layer does nothing, so we do nothing too. */
}
-size_t Curl_axtls_version(char *buffer, size_t size)
+static size_t Curl_axtls_version(char *buffer, size_t size)
{
return snprintf(buffer, size, "axTLS/%s", ssl_version());
}
-CURLcode Curl_axtls_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length)
+static CURLcode Curl_axtls_random(struct Curl_easy *data,
+ unsigned char *entropy, size_t length)
{
static bool ssl_seeded = FALSE;
(void)data;
@@ -703,4 +694,49 @@ CURLcode Curl_axtls_random(struct Curl_easy *data,
return CURLE_OK;
}
+static void *Curl_axtls_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ (void)info;
+ return BACKEND->ssl;
+}
+
+const struct Curl_ssl Curl_ssl_axtls = {
+ { CURLSSLBACKEND_AXTLS, "axtls" }, /* info */
+
+ 0, /* have_ca_path */
+ 0, /* have_certinfo */
+ 0, /* have_pinnedpubkey */
+ 0, /* have_ssl_ctx */
+ 0, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ /*
+ * axTLS has no global init. Everything is done through SSL and SSL_CTX
+ * structs stored in connectdata structure.
+ */
+ Curl_none_init, /* init */
+ /* axTLS has no global cleanup. */
+ Curl_none_cleanup, /* cleanup */
+ Curl_axtls_version, /* version */
+ Curl_axtls_check_cxn, /* check_cxn */
+ Curl_axtls_shutdown, /* shutdown */
+ Curl_none_data_pending, /* data_pending */
+ Curl_axtls_random, /* random */
+ Curl_none_cert_status_request, /* cert_status_request */
+ Curl_axtls_connect, /* connect */
+ Curl_axtls_connect_nonblocking, /* connect_nonblocking */
+ Curl_axtls_get_internals, /* get_internals */
+ Curl_axtls_close, /* close_one */
+ Curl_none_close_all, /* close_all */
+ Curl_axtls_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_none_false_start, /* false_start */
+ Curl_none_md5sum, /* md5sum */
+ NULL /* sha256sum */
+};
+
#endif /* USE_AXTLS */
diff --git a/lib/vtls/axtls.h b/lib/vtls/axtls.h
index 53797ea..3f1e129 100644
--- a/lib/vtls/axtls.h
+++ b/lib/vtls/axtls.h
@@ -27,44 +27,7 @@
#include "curl/curl.h"
#include "urldata.h"
-int Curl_axtls_init(void);
-int Curl_axtls_cleanup(void);
-CURLcode Curl_axtls_connect(struct connectdata *conn, int sockindex);
-CURLcode Curl_axtls_connect_nonblocking(
- struct connectdata *conn,
- int sockindex,
- bool *done);
-
- /* close a SSL connection */
-void Curl_axtls_close(struct connectdata *conn, int sockindex);
-
-void Curl_axtls_session_free(void *ptr);
-size_t Curl_axtls_version(char *buffer, size_t size);
-int Curl_axtls_shutdown(struct connectdata *conn, int sockindex);
-int Curl_axtls_check_cxn(struct connectdata *conn);
-CURLcode Curl_axtls_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length);
-
-/* Set the API backend definition to axTLS */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_AXTLS
-
-/* API setup for axTLS */
-#define curlssl_init Curl_axtls_init
-#define curlssl_cleanup Curl_axtls_cleanup
-#define curlssl_connect Curl_axtls_connect
-#define curlssl_connect_nonblocking Curl_axtls_connect_nonblocking
-#define curlssl_session_free(x) Curl_axtls_session_free(x)
-#define curlssl_close_all(x) ((void)x)
-#define curlssl_close Curl_axtls_close
-#define curlssl_shutdown(x,y) Curl_axtls_shutdown(x,y)
-#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN)
-#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN)
-#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL)
-#define curlssl_version Curl_axtls_version
-#define curlssl_check_cxn(x) Curl_axtls_check_cxn(x)
-#define curlssl_data_pending(x,y) ((void)x, (void)y, 0)
-#define curlssl_random(x,y,z) Curl_axtls_random(x,y,z)
+extern const struct Curl_ssl Curl_ssl_axtls;
#endif /* USE_AXTLS */
#endif /* HEADER_CURL_AXTLS_H */
diff --git a/lib/vtls/cyassl.c b/lib/vtls/cyassl.c
index 01bfdab..e065223 100644
--- a/lib/vtls/cyassl.c
+++ b/lib/vtls/cyassl.c
@@ -91,6 +91,7 @@ and that's a problem since options.h hasn't been included yet. */
#include "x509asn1.h"
#include "curl_printf.h"
+#include <cyassl/openssl/ssl.h>
#include <cyassl/ssl.h>
#ifdef HAVE_CYASSL_ERROR_SSL_H
#include <cyassl/error-ssl.h>
@@ -110,6 +111,25 @@ and that's a problem since options.h hasn't been included yet. */
#define CYASSL_MAX_ERROR_SZ 80
#endif
+/* KEEP_PEER_CERT is a product of the presence of build time symbol
+ OPENSSL_EXTRA without NO_CERTS, depending on the version. KEEP_PEER_CERT is
+ in wolfSSL's settings.h, and the latter two are build time symbols in
+ options.h. */
+#ifndef KEEP_PEER_CERT
+#if defined(HAVE_CYASSL_GET_PEER_CERTIFICATE) || \
+ defined(HAVE_WOLFSSL_GET_PEER_CERTIFICATE) || \
+ (defined(OPENSSL_EXTRA) && !defined(NO_CERTS))
+#define KEEP_PEER_CERT
+#endif
+#endif
+
+struct ssl_backend_data {
+ SSL_CTX* ctx;
+ SSL* handle;
+};
+
+#define BACKEND connssl->backend
+
static Curl_recv cyassl_recv;
static Curl_send cyassl_send;
@@ -136,7 +156,7 @@ cyassl_connect_step1(struct connectdata *conn,
char error_buffer[CYASSL_MAX_ERROR_SZ];
char *ciphers;
struct Curl_easy *data = conn->data;
- struct ssl_connect_data* conssl = &conn->ssl[sockindex];
+ struct ssl_connect_data* connssl = &conn->ssl[sockindex];
SSL_METHOD* req_method = NULL;
curl_socket_t sockfd = conn->sock[sockindex];
#ifdef HAVE_SNI
@@ -146,7 +166,7 @@ cyassl_connect_step1(struct connectdata *conn,
#define use_sni(x) Curl_nop_stmt
#endif
- if(conssl->state == ssl_connection_complete)
+ if(connssl->state == ssl_connection_complete)
return CURLE_OK;
if(SSL_CONN_CONFIG(version_max) != CURL_SSLVERSION_MAX_NONE) {
@@ -205,11 +225,11 @@ cyassl_connect_step1(struct connectdata *conn,
return CURLE_OUT_OF_MEMORY;
}
- if(conssl->ctx)
- SSL_CTX_free(conssl->ctx);
- conssl->ctx = SSL_CTX_new(req_method);
+ if(BACKEND->ctx)
+ SSL_CTX_free(BACKEND->ctx);
+ BACKEND->ctx = SSL_CTX_new(req_method);
- if(!conssl->ctx) {
+ if(!BACKEND->ctx) {
failf(data, "SSL: couldn't create a context!");
return CURLE_OUT_OF_MEMORY;
}
@@ -225,9 +245,9 @@ cyassl_connect_step1(struct connectdata *conn,
version. We use wolfSSL_CTX_SetMinVersion and not CyaSSL_SetMinVersion
because only the former will work before the user's CTX callback is called.
*/
- if((wolfSSL_CTX_SetMinVersion(conssl->ctx, WOLFSSL_TLSV1) != 1) &&
- (wolfSSL_CTX_SetMinVersion(conssl->ctx, WOLFSSL_TLSV1_1) != 1) &&
- (wolfSSL_CTX_SetMinVersion(conssl->ctx, WOLFSSL_TLSV1_2) != 1)) {
+ if((wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1) != 1) &&
+ (wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1_1) != 1) &&
+ (wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1_2) != 1)) {
failf(data, "SSL: couldn't set the minimum protocol version");
return CURLE_SSL_CONNECT_ERROR;
}
@@ -237,7 +257,7 @@ cyassl_connect_step1(struct connectdata *conn,
ciphers = SSL_CONN_CONFIG(cipher_list);
if(ciphers) {
- if(!SSL_CTX_set_cipher_list(conssl->ctx, ciphers)) {
+ if(!SSL_CTX_set_cipher_list(BACKEND->ctx, ciphers)) {
failf(data, "failed setting cipher list: %s", ciphers);
return CURLE_SSL_CIPHER;
}
@@ -247,7 +267,7 @@ cyassl_connect_step1(struct connectdata *conn,
#ifndef NO_FILESYSTEM
/* load trusted cacert */
if(SSL_CONN_CONFIG(CAfile)) {
- if(1 != SSL_CTX_load_verify_locations(conssl->ctx,
+ if(1 != SSL_CTX_load_verify_locations(BACKEND->ctx,
SSL_CONN_CONFIG(CAfile),
SSL_CONN_CONFIG(CApath))) {
if(SSL_CONN_CONFIG(verifypeer)) {
@@ -284,7 +304,7 @@ cyassl_connect_step1(struct connectdata *conn,
if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) {
int file_type = do_file_type(SSL_SET_OPTION(cert_type));
- if(SSL_CTX_use_certificate_file(conssl->ctx, SSL_SET_OPTION(cert),
+ if(SSL_CTX_use_certificate_file(BACKEND->ctx, SSL_SET_OPTION(cert),
file_type) != 1) {
failf(data, "unable to use client certificate (no key or wrong pass"
" phrase?)");
@@ -292,7 +312,7 @@ cyassl_connect_step1(struct connectdata *conn,
}
file_type = do_file_type(SSL_SET_OPTION(key_type));
- if(SSL_CTX_use_PrivateKey_file(conssl->ctx, SSL_SET_OPTION(key),
+ if(SSL_CTX_use_PrivateKey_file(BACKEND->ctx, SSL_SET_OPTION(key),
file_type) != 1) {
failf(data, "unable to set private key");
return CURLE_SSL_CONNECT_ERROR;
@@ -304,7 +324,7 @@ cyassl_connect_step1(struct connectdata *conn,
* fail to connect if the verification fails, or if it should continue
* anyway. In the latter case the result of the verification is checked with
* SSL_get_verify_result() below. */
- SSL_CTX_set_verify(conssl->ctx,
+ SSL_CTX_set_verify(BACKEND->ctx,
SSL_CONN_CONFIG(verifypeer)?SSL_VERIFY_PEER:
SSL_VERIFY_NONE,
NULL);
@@ -323,7 +343,7 @@ cyassl_connect_step1(struct connectdata *conn,
#ifdef ENABLE_IPV6
(0 == Curl_inet_pton(AF_INET6, hostname, &addr6)) &&
#endif
- (CyaSSL_CTX_UseSNI(conssl->ctx, CYASSL_SNI_HOST_NAME, hostname,
+ (CyaSSL_CTX_UseSNI(BACKEND->ctx, CYASSL_SNI_HOST_NAME, hostname,
(unsigned short)hostname_len) != 1)) {
infof(data, "WARNING: failed to configure server name indication (SNI) "
"TLS extension\n");
@@ -336,15 +356,15 @@ cyassl_connect_step1(struct connectdata *conn,
https://github.com/wolfSSL/wolfssl/issues/366
The supported curves below are those also supported by OpenSSL 1.0.2 and
in the same order. */
- CyaSSL_CTX_UseSupportedCurve(conssl->ctx, 0x17); /* secp256r1 */
- CyaSSL_CTX_UseSupportedCurve(conssl->ctx, 0x19); /* secp521r1 */
- CyaSSL_CTX_UseSupportedCurve(conssl->ctx, 0x18); /* secp384r1 */
+ CyaSSL_CTX_UseSupportedCurve(BACKEND->ctx, 0x17); /* secp256r1 */
+ CyaSSL_CTX_UseSupportedCurve(BACKEND->ctx, 0x19); /* secp521r1 */
+ CyaSSL_CTX_UseSupportedCurve(BACKEND->ctx, 0x18); /* secp384r1 */
#endif
/* give application a chance to interfere with SSL set up. */
if(data->set.ssl.fsslctx) {
CURLcode result = CURLE_OK;
- result = (*data->set.ssl.fsslctx)(data, conssl->ctx,
+ result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
data->set.ssl.fsslctxp);
if(result) {
failf(data, "error signaled by ssl ctx callback");
@@ -362,10 +382,10 @@ cyassl_connect_step1(struct connectdata *conn,
#endif
/* Let's make an SSL structure */
- if(conssl->handle)
- SSL_free(conssl->handle);
- conssl->handle = SSL_new(conssl->ctx);
- if(!conssl->handle) {
+ if(BACKEND->handle)
+ SSL_free(BACKEND->handle);
+ BACKEND->handle = SSL_new(BACKEND->ctx);
+ if(!BACKEND->handle) {
failf(data, "SSL: couldn't create a context (handle)!");
return CURLE_OUT_OF_MEMORY;
}
@@ -388,7 +408,7 @@ cyassl_connect_step1(struct connectdata *conn,
strcpy(protocols + strlen(protocols), ALPN_HTTP_1_1);
infof(data, "ALPN, offering %s\n", ALPN_HTTP_1_1);
- if(wolfSSL_UseALPN(conssl->handle, protocols,
+ if(wolfSSL_UseALPN(BACKEND->handle, protocols,
(unsigned)strlen(protocols),
WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) != SSL_SUCCESS) {
failf(data, "SSL: failed setting ALPN protocols");
@@ -404,10 +424,10 @@ cyassl_connect_step1(struct connectdata *conn,
Curl_ssl_sessionid_lock(conn);
if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL, sockindex)) {
/* we got a session id, use it! */
- if(!SSL_set_session(conssl->handle, ssl_sessionid)) {
+ if(!SSL_set_session(BACKEND->handle, ssl_sessionid)) {
Curl_ssl_sessionid_unlock(conn);
failf(data, "SSL: SSL_set_session failed: %s",
- ERR_error_string(SSL_get_error(conssl->handle, 0),
+ ERR_error_string(SSL_get_error(BACKEND->handle, 0),
error_buffer));
return CURLE_SSL_CONNECT_ERROR;
}
@@ -418,12 +438,12 @@ cyassl_connect_step1(struct connectdata *conn,
}
/* pass the raw socket into the SSL layer */
- if(!SSL_set_fd(conssl->handle, (int)sockfd)) {
+ if(!SSL_set_fd(BACKEND->handle, (int)sockfd)) {
failf(data, "SSL: SSL_set_fd failed");
return CURLE_SSL_CONNECT_ERROR;
}
- conssl->connecting_state = ssl_connect_2;
+ connssl->connecting_state = ssl_connect_2;
return CURLE_OK;
}
@@ -434,7 +454,7 @@ cyassl_connect_step2(struct connectdata *conn,
{
int ret = -1;
struct Curl_easy *data = conn->data;
- struct ssl_connect_data* conssl = &conn->ssl[sockindex];
+ struct ssl_connect_data* connssl = &conn->ssl[sockindex];
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
const char * const dispname = SSL_IS_PROXY() ?
@@ -448,22 +468,22 @@ cyassl_connect_step2(struct connectdata *conn,
/* Enable RFC2818 checks */
if(SSL_CONN_CONFIG(verifyhost)) {
- ret = CyaSSL_check_domain_name(conssl->handle, hostname);
+ ret = CyaSSL_check_domain_name(BACKEND->handle, hostname);
if(ret == SSL_FAILURE)
return CURLE_OUT_OF_MEMORY;
}
- ret = SSL_connect(conssl->handle);
+ ret = SSL_connect(BACKEND->handle);
if(ret != 1) {
char error_buffer[CYASSL_MAX_ERROR_SZ];
- int detail = SSL_get_error(conssl->handle, ret);
+ int detail = SSL_get_error(BACKEND->handle, ret);
if(SSL_ERROR_WANT_READ == detail) {
- conssl->connecting_state = ssl_connect_2_reading;
+ connssl->connecting_state = ssl_connect_2_reading;
return CURLE_OK;
}
else if(SSL_ERROR_WANT_WRITE == detail) {
- conssl->connecting_state = ssl_connect_2_writing;
+ connssl->connecting_state = ssl_connect_2_writing;
return CURLE_OK;
}
/* There is no easy way to override only the CN matching.
@@ -524,7 +544,7 @@ cyassl_connect_step2(struct connectdata *conn,
curl_asn1Element *pubkey;
CURLcode result;
- x509 = SSL_get_peer_certificate(conssl->handle);
+ x509 = SSL_get_peer_certificate(BACKEND->handle);
if(!x509) {
failf(data, "SSL: failed retrieving server certificate");
return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
@@ -566,7 +586,7 @@ cyassl_connect_step2(struct connectdata *conn,
char *protocol = NULL;
unsigned short protocol_len = 0;
- rc = wolfSSL_ALPN_GetProtocol(conssl->handle, &protocol, &protocol_len);
+ rc = wolfSSL_ALPN_GetProtocol(BACKEND->handle, &protocol, &protocol_len);
if(rc == SSL_SUCCESS) {
infof(data, "ALPN, server accepted to use %.*s\n", protocol_len,
@@ -595,11 +615,11 @@ cyassl_connect_step2(struct connectdata *conn,
}
#endif /* HAVE_ALPN */
- conssl->connecting_state = ssl_connect_3;
+ connssl->connecting_state = ssl_connect_3;
#if (LIBCYASSL_VERSION_HEX >= 0x03009010)
infof(data, "SSL connection using %s / %s\n",
- wolfSSL_get_version(conssl->handle),
- wolfSSL_get_cipher_name(conssl->handle));
+ wolfSSL_get_version(BACKEND->handle),
+ wolfSSL_get_cipher_name(BACKEND->handle));
#else
infof(data, "SSL connected\n");
#endif
@@ -623,7 +643,7 @@ cyassl_connect_step3(struct connectdata *conn,
SSL_SESSION *our_ssl_sessionid;
void *old_ssl_sessionid = NULL;
- our_ssl_sessionid = SSL_get_session(connssl->handle);
+ our_ssl_sessionid = SSL_get_session(BACKEND->handle);
Curl_ssl_sessionid_lock(conn);
incache = !(Curl_ssl_getsessionid(conn, &old_ssl_sessionid, NULL,
@@ -660,12 +680,13 @@ static ssize_t cyassl_send(struct connectdata *conn,
size_t len,
CURLcode *curlcode)
{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
char error_buffer[CYASSL_MAX_ERROR_SZ];
int memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
- int rc = SSL_write(conn->ssl[sockindex].handle, mem, memlen);
+ int rc = SSL_write(BACKEND->handle, mem, memlen);
if(rc < 0) {
- int err = SSL_get_error(conn->ssl[sockindex].handle, rc);
+ int err = SSL_get_error(BACKEND->handle, rc);
switch(err) {
case SSL_ERROR_WANT_READ:
@@ -684,18 +705,18 @@ static ssize_t cyassl_send(struct connectdata *conn,
return rc;
}
-void Curl_cyassl_close(struct connectdata *conn, int sockindex)
+static void Curl_cyassl_close(struct connectdata *conn, int sockindex)
{
- struct ssl_connect_data *conssl = &conn->ssl[sockindex];
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- if(conssl->handle) {
- (void)SSL_shutdown(conssl->handle);
- SSL_free(conssl->handle);
- conssl->handle = NULL;
+ if(BACKEND->handle) {
+ (void)SSL_shutdown(BACKEND->handle);
+ SSL_free(BACKEND->handle);
+ BACKEND->handle = NULL;
}
- if(conssl->ctx) {
- SSL_CTX_free(conssl->ctx);
- conssl->ctx = NULL;
+ if(BACKEND->ctx) {
+ SSL_CTX_free(BACKEND->ctx);
+ BACKEND->ctx = NULL;
}
}
@@ -705,12 +726,13 @@ static ssize_t cyassl_recv(struct connectdata *conn,
size_t buffersize,
CURLcode *curlcode)
{
+ struct ssl_connect_data *connssl = &conn->ssl[num];
char error_buffer[CYASSL_MAX_ERROR_SZ];
int buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
- int nread = SSL_read(conn->ssl[num].handle, buf, buffsize);
+ int nread = SSL_read(BACKEND->handle, buf, buffsize);
if(nread < 0) {
- int err = SSL_get_error(conn->ssl[num].handle, nread);
+ int err = SSL_get_error(BACKEND->handle, nread);
switch(err) {
case SSL_ERROR_ZERO_RETURN: /* no more data */
@@ -732,14 +754,14 @@ static ssize_t cyassl_recv(struct connectdata *conn,
}
-void Curl_cyassl_session_free(void *ptr)
+static void Curl_cyassl_session_free(void *ptr)
{
(void)ptr;
/* CyaSSL reuses sessions on own, no free */
}
-size_t Curl_cyassl_version(char *buffer, size_t size)
+static size_t Curl_cyassl_version(char *buffer, size_t size)
{
#if LIBCYASSL_VERSION_HEX >= 0x03006000
return snprintf(buffer, size, "wolfSSL/%s", wolfSSL_lib_version());
@@ -753,16 +775,18 @@ size_t Curl_cyassl_version(char *buffer, size_t size)
}
-int Curl_cyassl_init(void)
+static int Curl_cyassl_init(void)
{
return (CyaSSL_Init() == SSL_SUCCESS);
}
-bool Curl_cyassl_data_pending(const struct connectdata* conn, int connindex)
+static bool Curl_cyassl_data_pending(const struct connectdata* conn,
+ int connindex)
{
- if(conn->ssl[connindex].handle) /* SSL is in use */
- return (0 != SSL_pending(conn->ssl[connindex].handle)) ? TRUE : FALSE;
+ const struct ssl_connect_data *connssl = &conn->ssl[connindex];
+ if(BACKEND->handle) /* SSL is in use */
+ return (0 != SSL_pending(BACKEND->handle)) ? TRUE : FALSE;
else
return FALSE;
}
@@ -772,14 +796,14 @@ bool Curl_cyassl_data_pending(const struct connectdata* conn, int connindex)
* This function is called to shut down the SSL layer but keep the
* socket open (CCC - Clear Command Channel)
*/
-int Curl_cyassl_shutdown(struct connectdata *conn, int sockindex)
+static int Curl_cyassl_shutdown(struct connectdata *conn, int sockindex)
{
int retval = 0;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- if(connssl->handle) {
- SSL_free(connssl->handle);
- connssl->handle = NULL;
+ if(BACKEND->handle) {
+ SSL_free(BACKEND->handle);
+ BACKEND->handle = NULL;
}
return retval;
}
@@ -804,7 +828,7 @@ cyassl_connect_common(struct connectdata *conn,
return CURLE_OK;
}
- if(ssl_connect_1==connssl->connecting_state) {
+ if(ssl_connect_1 == connssl->connecting_state) {
/* Find out how much more time we're allowed */
timeout_ms = Curl_timeleft(data, NULL, TRUE);
@@ -836,9 +860,9 @@ cyassl_connect_common(struct connectdata *conn,
if(connssl->connecting_state == ssl_connect_2_reading
|| connssl->connecting_state == ssl_connect_2_writing) {
- curl_socket_t writefd = ssl_connect_2_writing==
+ curl_socket_t writefd = ssl_connect_2_writing ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
- curl_socket_t readfd = ssl_connect_2_reading==
+ curl_socket_t readfd = ssl_connect_2_reading ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
@@ -899,18 +923,14 @@ cyassl_connect_common(struct connectdata *conn,
}
-CURLcode
-Curl_cyassl_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done)
+static CURLcode Curl_cyassl_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
return cyassl_connect_common(conn, sockindex, TRUE, done);
}
-CURLcode
-Curl_cyassl_connect(struct connectdata *conn,
- int sockindex)
+static CURLcode Curl_cyassl_connect(struct connectdata *conn, int sockindex)
{
CURLcode result;
bool done = FALSE;
@@ -924,9 +944,8 @@ Curl_cyassl_connect(struct connectdata *conn,
return CURLE_OK;
}
-CURLcode Curl_cyassl_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length)
+static CURLcode Curl_cyassl_random(struct Curl_easy *data,
+ unsigned char *entropy, size_t length)
{
RNG rng;
(void)data;
@@ -939,10 +958,10 @@ CURLcode Curl_cyassl_random(struct Curl_easy *data,
return CURLE_OK;
}
-void Curl_cyassl_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum /* output */,
- size_t unused)
+static void Curl_cyassl_sha256sum(const unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *sha256sum /* output */,
+ size_t unused)
{
Sha256 SHA256pw;
(void)unused;
@@ -951,4 +970,48 @@ void Curl_cyassl_sha256sum(const unsigned char *tmp, /* input */
Sha256Final(&SHA256pw, sha256sum);
}
+static void *Curl_cyassl_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ (void)info;
+ return BACKEND->handle;
+}
+
+const struct Curl_ssl Curl_ssl_cyassl = {
+ { CURLSSLBACKEND_WOLFSSL, "WolfSSL" }, /* info */
+
+ 0, /* have_ca_path */
+ 0, /* have_certinfo */
+#ifdef KEEP_PEER_CERT
+ 1, /* have_pinnedpubkey */
+#else
+ 0, /* have_pinnedpubkey */
+#endif
+ 1, /* have_ssl_ctx */
+ 0, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_cyassl_init, /* init */
+ Curl_none_cleanup, /* cleanup */
+ Curl_cyassl_version, /* version */
+ Curl_none_check_cxn, /* check_cxn */
+ Curl_cyassl_shutdown, /* shutdown */
+ Curl_cyassl_data_pending, /* data_pending */
+ Curl_cyassl_random, /* random */
+ Curl_none_cert_status_request, /* cert_status_request */
+ Curl_cyassl_connect, /* connect */
+ Curl_cyassl_connect_nonblocking, /* connect_nonblocking */
+ Curl_cyassl_get_internals, /* get_internals */
+ Curl_cyassl_close, /* close_one */
+ Curl_none_close_all, /* close_all */
+ Curl_cyassl_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_none_false_start, /* false_start */
+ Curl_none_md5sum, /* md5sum */
+ Curl_cyassl_sha256sum /* sha256sum */
+};
+
#endif
diff --git a/lib/vtls/cyassl.h b/lib/vtls/cyassl.h
index f47719e..01e11cc 100644
--- a/lib/vtls/cyassl.h
+++ b/lib/vtls/cyassl.h
@@ -25,68 +25,7 @@
#ifdef USE_CYASSL
-/* KEEP_PEER_CERT is a product of the presence of build time symbol
- OPENSSL_EXTRA without NO_CERTS, depending on the version. KEEP_PEER_CERT is
- in wolfSSL's settings.h, and the latter two are build time symbols in
- options.h. */
-#ifndef KEEP_PEER_CERT
-#if defined(HAVE_CYASSL_GET_PEER_CERTIFICATE) || \
- defined(HAVE_WOLFSSL_GET_PEER_CERTIFICATE) || \
- (defined(OPENSSL_EXTRA) && !defined(NO_CERTS))
-#define KEEP_PEER_CERT
-#endif
-#endif
-
-CURLcode Curl_cyassl_connect(struct connectdata *conn, int sockindex);
-bool Curl_cyassl_data_pending(const struct connectdata* conn, int connindex);
-int Curl_cyassl_shutdown(struct connectdata* conn, int sockindex);
-
- /* close a SSL connection */
-void Curl_cyassl_close(struct connectdata *conn, int sockindex);
-
-void Curl_cyassl_session_free(void *ptr);
-size_t Curl_cyassl_version(char *buffer, size_t size);
-int Curl_cyassl_shutdown(struct connectdata *conn, int sockindex);
-int Curl_cyassl_init(void);
-CURLcode Curl_cyassl_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done);
-CURLcode Curl_cyassl_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length);
-void Curl_cyassl_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum, /* output */
- size_t unused);
-
-/* Set the API backend definition to CyaSSL */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_CYASSL
-
-/* this backend supports CURLOPT_SSL_CTX_* */
-#define have_curlssl_ssl_ctx 1
-
-#ifdef KEEP_PEER_CERT
-/* this backend supports CURLOPT_PINNEDPUBLICKEY */
-#define have_curlssl_pinnedpubkey 1
-#endif
-
-/* API setup for CyaSSL */
-#define curlssl_init Curl_cyassl_init
-#define curlssl_cleanup() Curl_nop_stmt
-#define curlssl_connect Curl_cyassl_connect
-#define curlssl_connect_nonblocking Curl_cyassl_connect_nonblocking
-#define curlssl_session_free(x) Curl_cyassl_session_free(x)
-#define curlssl_close_all(x) ((void)x)
-#define curlssl_close Curl_cyassl_close
-#define curlssl_shutdown(x,y) Curl_cyassl_shutdown(x,y)
-#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN)
-#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN)
-#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL)
-#define curlssl_version Curl_cyassl_version
-#define curlssl_check_cxn(x) ((void)x, -1)
-#define curlssl_data_pending(x,y) Curl_cyassl_data_pending(x,y)
-#define curlssl_random(x,y,z) Curl_cyassl_random(x,y,z)
-#define curlssl_sha256sum(a,b,c,d) Curl_cyassl_sha256sum(a,b,c,d)
+extern const struct Curl_ssl Curl_ssl_cyassl;
#endif /* USE_CYASSL */
#endif /* HEADER_CURL_CYASSL_H */
diff --git a/lib/vtls/darwinssl.c b/lib/vtls/darwinssl.c
index 6f9c601..3169042 100644
--- a/lib/vtls/darwinssl.c
+++ b/lib/vtls/darwinssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2014, Nick Zitzmann, <nickzman@gmail.com>.
+ * Copyright (C) 2012 - 2017, Nick Zitzmann, <nickzman@gmail.com>.
* Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
@@ -22,7 +22,7 @@
***************************************************************************/
/*
- * Source file for all iOS and Mac OS X SecureTransport-specific code for the
+ * Source file for all iOS and macOS SecureTransport-specific code for the
* TLS/SSL layer. No code but vtls.c should ever call or use these functions.
*/
@@ -44,16 +44,20 @@
#endif
#include <Security/Security.h>
+/* For some reason, when building for iOS, the omnibus header above does
+ * not include SecureTransport.h as of iOS SDK 5.1. */
#include <Security/SecureTransport.h>
#include <CoreFoundation/CoreFoundation.h>
#include <CommonCrypto/CommonDigest.h>
-/* The Security framework has changed greatly between iOS and different OS X
+/* The Security framework has changed greatly between iOS and different macOS
versions, and we will try to support as many of them as we can (back to
Leopard and iOS 5) by using macros and weak-linking.
- IMPORTANT: If TLS 1.1 and 1.2 support are important for you on OS X, then
- you must build this project against the 10.8 SDK or later. */
+ In general, you want to build this using the most recent OS SDK, since some
+ features require curl to be built against the latest SDK. TLS 1.1 and 1.2
+ support, for instance, require the macOS 10.8 SDK or later. TLS 1.3
+ requires the macOS 10.13 or iOS 11 SDK or later. */
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1050
@@ -62,6 +66,7 @@
#define CURL_BUILD_IOS 0
#define CURL_BUILD_IOS_7 0
+#define CURL_BUILD_IOS_11 0
#define CURL_BUILD_MAC 1
/* This is the maximum API level we are allowed to use when building: */
#define CURL_BUILD_MAC_10_5 MAC_OS_X_VERSION_MAX_ALLOWED >= 1050
@@ -69,10 +74,11 @@
#define CURL_BUILD_MAC_10_7 MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
#define CURL_BUILD_MAC_10_8 MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
#define CURL_BUILD_MAC_10_9 MAC_OS_X_VERSION_MAX_ALLOWED >= 1090
+#define CURL_BUILD_MAC_10_13 MAC_OS_X_VERSION_MAX_ALLOWED >= 101300
/* These macros mean "the following code is present to allow runtime backward
compatibility with at least this cat or earlier":
- (You set this at build-time by setting the MACOSX_DEPLOYMENT_TARGET
- environmental variable.) */
+ (You set this at build-time using the compiler command line option
+ "-mmacos-version-min.") */
#define CURL_SUPPORT_MAC_10_5 MAC_OS_X_VERSION_MIN_REQUIRED <= 1050
#define CURL_SUPPORT_MAC_10_6 MAC_OS_X_VERSION_MIN_REQUIRED <= 1060
#define CURL_SUPPORT_MAC_10_7 MAC_OS_X_VERSION_MIN_REQUIRED <= 1070
@@ -82,11 +88,14 @@
#elif TARGET_OS_EMBEDDED || TARGET_OS_IPHONE
#define CURL_BUILD_IOS 1
#define CURL_BUILD_IOS_7 __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
+#define CURL_BUILD_IOS_11 __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
#define CURL_BUILD_MAC 0
#define CURL_BUILD_MAC_10_5 0
#define CURL_BUILD_MAC_10_6 0
#define CURL_BUILD_MAC_10_7 0
#define CURL_BUILD_MAC_10_8 0
+#define CURL_BUILD_MAC_10_9 0
+#define CURL_BUILD_MAC_10_13 0
#define CURL_SUPPORT_MAC_10_5 0
#define CURL_SUPPORT_MAC_10_6 0
#define CURL_SUPPORT_MAC_10_7 0
@@ -118,6 +127,33 @@
#define ioErr -36
#define paramErr -50
+struct ssl_backend_data {
+ SSLContextRef ssl_ctx;
+ curl_socket_t ssl_sockfd;
+ bool ssl_direction; /* true if writing, false if reading */
+ size_t ssl_write_buffered_length;
+};
+
+#define BACKEND connssl->backend
+
+/* pinned public key support tests */
+
+/* version 1 supports macOS 10.12+ and iOS 10+ */
+#if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 100000) || \
+ (!TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200))
+#define DARWIN_SSL_PINNEDPUBKEY_V1 1
+#endif
+
+/* version 2 supports MacOSX 10.7+ */
+#if (!TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
+#define DARWIN_SSL_PINNEDPUBKEY_V2 1
+#endif
+
+#if defined(DARWIN_SSL_PINNEDPUBKEY_V1) || defined(DARWIN_SSL_PINNEDPUBKEY_V2)
+/* this backend supports CURLOPT_PINNEDPUBLICKEY */
+#define DARWIN_SSL_PINNEDPUBKEY 1
+#endif /* DARWIN_SSL_PINNEDPUBKEY */
+
#ifdef DARWIN_SSL_PINNEDPUBKEY
/* both new and old APIs return rsa keys missing the spki header (not DER) */
static const unsigned char rsa4096SpkiHeader[] = {
@@ -161,7 +197,7 @@ static OSStatus SocketRead(SSLConnectionRef connection,
UInt8 *currData = (UInt8 *)data;
/*int sock = *(int *)connection;*/
struct ssl_connect_data *connssl = (struct ssl_connect_data *)connection;
- int sock = connssl->ssl_sockfd;
+ int sock = BACKEND->ssl_sockfd;
OSStatus rtn = noErr;
size_t bytesRead;
ssize_t rrtn;
@@ -190,7 +226,7 @@ static OSStatus SocketRead(SSLConnectionRef connection,
break;
case EAGAIN:
rtn = errSSLWouldBlock;
- connssl->ssl_direction = false;
+ BACKEND->ssl_direction = false;
break;
default:
rtn = ioErr;
@@ -221,7 +257,7 @@ static OSStatus SocketWrite(SSLConnectionRef connection,
size_t bytesSent = 0;
/*int sock = *(int *)connection;*/
struct ssl_connect_data *connssl = (struct ssl_connect_data *)connection;
- int sock = connssl->ssl_sockfd;
+ int sock = BACKEND->ssl_sockfd;
ssize_t length;
size_t dataLen = *dataLength;
const UInt8 *dataPtr = (UInt8 *)data;
@@ -241,7 +277,7 @@ static OSStatus SocketWrite(SSLConnectionRef connection,
theErr = errno;
if(theErr == EAGAIN) {
ortn = errSSLWouldBlock;
- connssl->ssl_direction = true;
+ BACKEND->ssl_direction = true;
}
else {
ortn = ioErr;
@@ -809,6 +845,30 @@ CF_INLINE const char *TLSCipherNameForNumber(SSLCipherSuite cipher)
return "TLS_RSA_PSK_WITH_NULL_SHA384";
break;
#endif /* CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7 */
+#if CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11
+ /* New ChaCha20+Poly1305 cipher-suites used by TLS 1.3: */
+ case TLS_AES_128_GCM_SHA256:
+ return "TLS_AES_128_GCM_SHA256";
+ break;
+ case TLS_AES_256_GCM_SHA384:
+ return "TLS_AES_256_GCM_SHA384";
+ break;
+ case TLS_CHACHA20_POLY1305_SHA256:
+ return "TLS_CHACHA20_POLY1305_SHA256";
+ break;
+ case TLS_AES_128_CCM_SHA256:
+ return "TLS_AES_128_CCM_SHA256";
+ break;
+ case TLS_AES_128_CCM_8_SHA256:
+ return "TLS_AES_128_CCM_8_SHA256";
+ break;
+ case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
+ return "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256";
+ break;
+ case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
+ return "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256";
+ break;
+#endif /* CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11 */
}
return "TLS_NULL_WITH_NULL_NULL";
}
@@ -849,7 +909,7 @@ CF_INLINE void GetDarwinVersionNumber(int *major, int *minor)
into a string. Some aren't available under iOS or newer cats. So here's
a unified function for getting a string describing the certificate that
ought to work in all cats starting with Leopard. */
-CF_INLINE CFStringRef CopyCertSubject(SecCertificateRef cert)
+CF_INLINE CFStringRef getsubject(SecCertificateRef cert)
{
CFStringRef server_cert_summary = CFSTR("(null)");
@@ -876,6 +936,54 @@ CF_INLINE CFStringRef CopyCertSubject(SecCertificateRef cert)
return server_cert_summary;
}
+static CURLcode CopyCertSubject(struct Curl_easy *data,
+ SecCertificateRef cert, char **certp)
+{
+ CFStringRef c = getsubject(cert);
+ CURLcode result = CURLE_OK;
+ const char *direct;
+ char *cbuf = NULL;
+ *certp = NULL;
+
+ if(!c) {
+ failf(data, "SSL: invalid CA certificate subject");
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ /* If the subject is already available as UTF-8 encoded (ie 'direct') then
+ use that, else convert it. */
+ direct = CFStringGetCStringPtr(c, kCFStringEncodingUTF8);
+ if(direct) {
+ *certp = strdup(direct);
+ if(!*certp) {
+ failf(data, "SSL: out of memory");
+ result = CURLE_OUT_OF_MEMORY;
+ }
+ }
+ else {
+ size_t cbuf_size = ((size_t)CFStringGetLength(c) * 4) + 1;
+ cbuf = calloc(cbuf_size, 1);
+ if(cbuf) {
+ if(!CFStringGetCString(c, cbuf, cbuf_size,
+ kCFStringEncodingUTF8)) {
+ failf(data, "SSL: invalid CA certificate subject");
+ result = CURLE_SSL_CACERT;
+ }
+ else
+ /* pass back the buffer */
+ *certp = cbuf;
+ }
+ else {
+ failf(data, "SSL: couldn't allocate %zu bytes of memory", cbuf_size);
+ result = CURLE_OUT_OF_MEMORY;
+ }
+ }
+ if(result)
+ free(cbuf);
+ CFRelease(c);
+ return result;
+}
+
#if CURL_SUPPORT_MAC_10_6
/* The SecKeychainSearch API was deprecated in Lion, and using it will raise
deprecation warnings, so let's not compile this unless it's necessary: */
@@ -968,7 +1076,7 @@ static OSStatus CopyIdentityWithLabel(char *label,
keys_list_count = CFArrayGetCount(keys_list);
*out_cert_and_key = NULL;
status = 1;
- for(i=0; i<keys_list_count; i++) {
+ for(i = 0; i<keys_list_count; i++) {
OSStatus err = noErr;
SecCertificateRef cert = NULL;
SecIdentityRef identity =
@@ -1094,6 +1202,15 @@ static CURLcode darwinssl_version_from_curl(SSLProtocol *darwinver,
*darwinver = kTLSProtocol12;
return CURLE_OK;
case CURL_SSLVERSION_TLSv1_3:
+ /* TLS 1.3 support first appeared in iOS 11 and macOS 10.13 */
+#if CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11
+ /* We can assume __builtin_available() will always work in the
+ 10.13/11.0 SDK: */
+ if(__builtin_available(macOS 10.13, iOS 11.0, *)) {
+ *darwinver = kTLSProtocol13;
+ return CURLE_OK;
+ }
+#endif /* CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11 */
break;
}
return CURLE_SSL_CONNECT_ERROR;
@@ -1107,12 +1224,27 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
long ssl_version = SSL_CONN_CONFIG(version);
long ssl_version_max = SSL_CONN_CONFIG(version_max);
+ long max_supported_version_by_os;
+
+ /* macOS 10.5-10.7 supported TLS 1.0 only.
+ macOS 10.8 and later, and iOS 5 and later, added TLS 1.1 and 1.2.
+ macOS 10.13 and later, and iOS 11 and later, added TLS 1.3. */
+#if CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11
+ if(__builtin_available(macOS 10.13, iOS 11.0, *)) {
+ max_supported_version_by_os = CURL_SSLVERSION_MAX_TLSv1_3;
+ }
+ else {
+ max_supported_version_by_os = CURL_SSLVERSION_MAX_TLSv1_2;
+ }
+#else
+ max_supported_version_by_os = CURL_SSLVERSION_MAX_TLSv1_2;
+#endif /* CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11 */
switch(ssl_version) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
ssl_version = CURL_SSLVERSION_TLSv1_0;
- ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ ssl_version_max = max_supported_version_by_os;
break;
}
@@ -1121,7 +1253,7 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
ssl_version_max = ssl_version << 16;
break;
case CURL_SSLVERSION_MAX_DEFAULT:
- ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ ssl_version_max = max_supported_version_by_os;
break;
}
@@ -1142,35 +1274,35 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
return result;
}
- (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, darwin_ver_min);
- (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, darwin_ver_max);
+ (void)SSLSetProtocolVersionMin(BACKEND->ssl_ctx, darwin_ver_min);
+ (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, darwin_ver_max);
return result;
}
else {
#if CURL_SUPPORT_MAC_10_8
long i = ssl_version;
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kSSLProtocolAll,
false);
for(; i <= (ssl_version_max >> 16); i++) {
switch(i) {
case CURL_SSLVERSION_TLSv1_0:
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kTLSProtocol1,
true);
break;
case CURL_SSLVERSION_TLSv1_1:
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kTLSProtocol11,
true);
break;
case CURL_SSLVERSION_TLSv1_2:
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kTLSProtocol12,
true);
break;
case CURL_SSLVERSION_TLSv1_3:
- failf(data, "DarwinSSL: TLS 1.3 is not yet supported");
+ failf(data, "Your version of the OS does not support TLSv1.3");
return CURLE_SSL_CONNECT_ERROR;
}
}
@@ -1211,10 +1343,10 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
if(SSLCreateContext != NULL) { /* use the newer API if avaialble */
- if(connssl->ssl_ctx)
- CFRelease(connssl->ssl_ctx);
- connssl->ssl_ctx = SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType);
- if(!connssl->ssl_ctx) {
+ if(BACKEND->ssl_ctx)
+ CFRelease(BACKEND->ssl_ctx);
+ BACKEND->ssl_ctx = SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType);
+ if(!BACKEND->ssl_ctx) {
failf(data, "SSL: couldn't create a context!");
return CURLE_OUT_OF_MEMORY;
}
@@ -1222,9 +1354,9 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
else {
/* The old ST API does not exist under iOS, so don't compile it: */
#if CURL_SUPPORT_MAC_10_8
- if(connssl->ssl_ctx)
- (void)SSLDisposeContext(connssl->ssl_ctx);
- err = SSLNewContext(false, &(connssl->ssl_ctx));
+ if(BACKEND->ssl_ctx)
+ (void)SSLDisposeContext(BACKEND->ssl_ctx);
+ err = SSLNewContext(false, &(BACKEND->ssl_ctx));
if(err != noErr) {
failf(data, "SSL: couldn't create a context: OSStatus %d", err);
return CURLE_OUT_OF_MEMORY;
@@ -1232,15 +1364,15 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
#endif /* CURL_SUPPORT_MAC_10_8 */
}
#else
- if(connssl->ssl_ctx)
- (void)SSLDisposeContext(connssl->ssl_ctx);
- err = SSLNewContext(false, &(connssl->ssl_ctx));
+ if(BACKEND->ssl_ctx)
+ (void)SSLDisposeContext(BACKEND->ssl_ctx);
+ err = SSLNewContext(false, &(BACKEND->ssl_ctx));
if(err != noErr) {
failf(data, "SSL: couldn't create a context: OSStatus %d", err);
return CURLE_OUT_OF_MEMORY;
}
#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
- connssl->ssl_write_buffered_length = 0UL; /* reset buffered write length */
+ BACKEND->ssl_write_buffered_length = 0UL; /* reset buffered write length */
/* check to see if we've been told to use an explicit SSL/TLS version */
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
@@ -1248,8 +1380,17 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
switch(conn->ssl_config.version) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
- (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kTLSProtocol1);
- (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kTLSProtocol12);
+ (void)SSLSetProtocolVersionMin(BACKEND->ssl_ctx, kTLSProtocol1);
+#if CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11
+ if(__builtin_available(macOS 10.13, iOS 11.0, *)) {
+ (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kTLSProtocol13);
+ }
+ else {
+ (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kTLSProtocol12);
+ }
+#else
+ (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kTLSProtocol12);
+#endif /* CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11 */
break;
case CURL_SSLVERSION_TLSv1_0:
case CURL_SSLVERSION_TLSv1_1:
@@ -1262,20 +1403,20 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
break;
}
case CURL_SSLVERSION_SSLv3:
- err = SSLSetProtocolVersionMin(connssl->ssl_ctx, kSSLProtocol3);
+ err = SSLSetProtocolVersionMin(BACKEND->ssl_ctx, kSSLProtocol3);
if(err != noErr) {
failf(data, "Your version of the OS does not support SSLv3");
return CURLE_SSL_CONNECT_ERROR;
}
- (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kSSLProtocol3);
+ (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kSSLProtocol3);
break;
case CURL_SSLVERSION_SSLv2:
- err = SSLSetProtocolVersionMin(connssl->ssl_ctx, kSSLProtocol2);
+ err = SSLSetProtocolVersionMin(BACKEND->ssl_ctx, kSSLProtocol2);
if(err != noErr) {
failf(data, "Your version of the OS does not support SSLv2");
return CURLE_SSL_CONNECT_ERROR;
}
- (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kSSLProtocol2);
+ (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kSSLProtocol2);
break;
default:
failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
@@ -1284,19 +1425,19 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
}
else {
#if CURL_SUPPORT_MAC_10_8
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kSSLProtocolAll,
false);
switch(conn->ssl_config.version) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kTLSProtocol1,
true);
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kTLSProtocol11,
true);
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kTLSProtocol12,
true);
break;
@@ -1311,7 +1452,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
break;
}
case CURL_SSLVERSION_SSLv3:
- err = SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ err = SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kSSLProtocol3,
true);
if(err != noErr) {
@@ -1320,7 +1461,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
}
break;
case CURL_SSLVERSION_SSLv2:
- err = SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ err = SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kSSLProtocol2,
true);
if(err != noErr) {
@@ -1340,12 +1481,12 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
" SSL/TLS version");
return CURLE_SSL_CONNECT_ERROR;
}
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kSSLProtocolAll, false);
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx, kSSLProtocolAll, false);
switch(conn->ssl_config.version) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
case CURL_SSLVERSION_TLSv1_0:
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kTLSProtocol1,
true);
break;
@@ -1359,7 +1500,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
failf(data, "Your version of the OS does not support TLSv1.3");
return CURLE_SSL_CONNECT_ERROR;
case CURL_SSLVERSION_SSLv2:
- err = SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ err = SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kSSLProtocol2,
true);
if(err != noErr) {
@@ -1368,7 +1509,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
}
break;
case CURL_SSLVERSION_SSLv3:
- err = SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ err = SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
kSSLProtocol3,
true);
if(err != noErr) {
@@ -1418,25 +1559,21 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
/* If we found one, print it out: */
err = SecIdentityCopyCertificate(cert_and_key, &cert);
if(err == noErr) {
- CFStringRef cert_summary = CopyCertSubject(cert);
- char cert_summary_c[128];
-
- if(cert_summary) {
- memset(cert_summary_c, 0, 128);
- if(CFStringGetCString(cert_summary,
- cert_summary_c,
- 128,
- kCFStringEncodingUTF8)) {
- infof(data, "Client certificate: %s\n", cert_summary_c);
- }
- CFRelease(cert_summary);
- CFRelease(cert);
+ char *certp;
+ CURLcode result = CopyCertSubject(data, cert, &certp);
+ if(!result) {
+ infof(data, "Client certificate: %s\n", certp);
+ free(certp);
}
+
+ CFRelease(cert);
+ if(result)
+ return result;
}
certs_c[0] = cert_and_key;
certs = CFArrayCreate(NULL, (const void **)certs_c, 1L,
&kCFTypeArrayCallBacks);
- err = SSLSetCertificate(connssl->ssl_ctx, certs);
+ err = SSLSetCertificate(BACKEND->ssl_ctx, certs);
if(certs)
CFRelease(certs);
if(err != noErr) {
@@ -1499,7 +1636,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
if(SSLSetSessionOption != NULL) {
#endif /* CURL_BUILD_MAC */
bool break_on_auth = !conn->ssl_config.verifypeer || ssl_cafile;
- err = SSLSetSessionOption(connssl->ssl_ctx,
+ err = SSLSetSessionOption(BACKEND->ssl_ctx,
kSSLSessionOptionBreakOnServerAuth,
break_on_auth);
if(err != noErr) {
@@ -1509,7 +1646,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
}
else {
#if CURL_SUPPORT_MAC_10_8
- err = SSLSetEnableCertVerify(connssl->ssl_ctx,
+ err = SSLSetEnableCertVerify(BACKEND->ssl_ctx,
conn->ssl_config.verifypeer?true:false);
if(err != noErr) {
failf(data, "SSL: SSLSetEnableCertVerify() failed: OSStatus %d", err);
@@ -1518,7 +1655,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
#endif /* CURL_SUPPORT_MAC_10_8 */
}
#else
- err = SSLSetEnableCertVerify(connssl->ssl_ctx,
+ err = SSLSetEnableCertVerify(BACKEND->ssl_ctx,
conn->ssl_config.verifypeer?true:false);
if(err != noErr) {
failf(data, "SSL: SSLSetEnableCertVerify() failed: OSStatus %d", err);
@@ -1539,7 +1676,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
* Both hostname check and SNI require SSLSetPeerDomainName().
* Also: the verifyhost setting influences SNI usage */
if(conn->ssl_config.verifyhost) {
- err = SSLSetPeerDomainName(connssl->ssl_ctx, hostname,
+ err = SSLSetPeerDomainName(BACKEND->ssl_ctx, hostname,
strlen(hostname));
if(err != noErr) {
@@ -1565,11 +1702,11 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
higher priority, but it's probably better that we not connect at all than
to give the user a false sense of security if the server only supports
insecure ciphers. (Note: We don't care about SSLv2-only ciphers.) */
- (void)SSLGetNumberSupportedCiphers(connssl->ssl_ctx, &all_ciphers_count);
+ (void)SSLGetNumberSupportedCiphers(BACKEND->ssl_ctx, &all_ciphers_count);
all_ciphers = malloc(all_ciphers_count*sizeof(SSLCipherSuite));
allowed_ciphers = malloc(all_ciphers_count*sizeof(SSLCipherSuite));
if(all_ciphers && allowed_ciphers &&
- SSLGetSupportedCiphers(connssl->ssl_ctx, all_ciphers,
+ SSLGetSupportedCiphers(BACKEND->ssl_ctx, all_ciphers,
&all_ciphers_count) == noErr) {
for(i = 0UL ; i < all_ciphers_count ; i++) {
#if CURL_BUILD_MAC
@@ -1651,7 +1788,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
break;
}
}
- err = SSLSetEnabledCiphers(connssl->ssl_ctx, allowed_ciphers,
+ err = SSLSetEnabledCiphers(BACKEND->ssl_ctx, allowed_ciphers,
allowed_ciphers_count);
if(err != noErr) {
failf(data, "SSL: SSLSetEnabledCiphers() failed: OSStatus %d", err);
@@ -1672,9 +1809,9 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
specifically doesn't want us doing that: */
if(SSLSetSessionOption != NULL) {
/* TODO s/data->set.ssl.enable_beast/SSL_SET_OPTION(enable_beast)/g */
- SSLSetSessionOption(connssl->ssl_ctx, kSSLSessionOptionSendOneByteRecord,
+ SSLSetSessionOption(BACKEND->ssl_ctx, kSSLSessionOptionSendOneByteRecord,
!data->set.ssl.enable_beast);
- SSLSetSessionOption(connssl->ssl_ctx, kSSLSessionOptionFalseStart,
+ SSLSetSessionOption(BACKEND->ssl_ctx, kSSLSessionOptionFalseStart,
data->set.ssl.falsestart); /* false start support */
}
#endif /* CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7 */
@@ -1688,7 +1825,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
if(!Curl_ssl_getsessionid(conn, (void **)&ssl_sessionid,
&ssl_sessionid_len, sockindex)) {
/* we got a session id, use it! */
- err = SSLSetPeerID(connssl->ssl_ctx, ssl_sessionid, ssl_sessionid_len);
+ err = SSLSetPeerID(BACKEND->ssl_ctx, ssl_sessionid, ssl_sessionid_len);
Curl_ssl_sessionid_unlock(conn);
if(err != noErr) {
failf(data, "SSL: SSLSetPeerID() failed: OSStatus %d", err);
@@ -1706,7 +1843,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
verifypeer, SSL_CONN_CONFIG(verifyhost), hostname, port);
ssl_sessionid_len = strlen(ssl_sessionid);
- err = SSLSetPeerID(connssl->ssl_ctx, ssl_sessionid, ssl_sessionid_len);
+ err = SSLSetPeerID(BACKEND->ssl_ctx, ssl_sessionid, ssl_sessionid_len);
if(err != noErr) {
Curl_ssl_sessionid_unlock(conn);
failf(data, "SSL: SSLSetPeerID() failed: OSStatus %d", err);
@@ -1723,7 +1860,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
}
}
- err = SSLSetIOFuncs(connssl->ssl_ctx, SocketRead, SocketWrite);
+ err = SSLSetIOFuncs(BACKEND->ssl_ctx, SocketRead, SocketWrite);
if(err != noErr) {
failf(data, "SSL: SSLSetIOFuncs() failed: OSStatus %d", err);
return CURLE_SSL_CONNECT_ERROR;
@@ -1733,8 +1870,8 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
/* We need to store the FD in a constant memory address, because
* SSLSetConnection() will not copy that address. I've found that
* conn->sock[sockindex] may change on its own. */
- connssl->ssl_sockfd = sockfd;
- err = SSLSetConnection(connssl->ssl_ctx, connssl);
+ BACKEND->ssl_sockfd = sockfd;
+ err = SSLSetConnection(BACKEND->ssl_ctx, connssl);
if(err != noErr) {
failf(data, "SSL: SSLSetConnection() failed: %d", err);
return CURLE_SSL_CONNECT_ERROR;
@@ -1797,7 +1934,7 @@ static int read_cert(const char *file, unsigned char **out, size_t *outlen)
{
int fd;
ssize_t n, len = 0, cap = 512;
- unsigned char buf[cap], *data;
+ unsigned char buf[512], *data;
fd = open(file, 0);
if(fd < 0)
@@ -1875,6 +2012,8 @@ static int append_cert_to_array(struct Curl_easy *data,
CFMutableArrayRef array)
{
CFDataRef certdata = CFDataCreate(kCFAllocatorDefault, buf, buflen);
+ char *certp;
+ CURLcode result;
if(!certdata) {
failf(data, "SSL: failed to allocate array for CA certificate");
return CURLE_OUT_OF_MEMORY;
@@ -1889,25 +2028,10 @@ static int append_cert_to_array(struct Curl_easy *data,
}
/* Check if cacert is valid. */
- CFStringRef subject = CopyCertSubject(cacert);
- if(subject) {
- char subject_cbuf[128];
- memset(subject_cbuf, 0, 128);
- if(!CFStringGetCString(subject,
- subject_cbuf,
- 128,
- kCFStringEncodingUTF8)) {
- CFRelease(cacert);
- failf(data, "SSL: invalid CA certificate subject");
- return CURLE_SSL_CACERT;
- }
- CFRelease(subject);
- }
- else {
- CFRelease(cacert);
- failf(data, "SSL: invalid CA certificate");
- return CURLE_SSL_CACERT;
- }
+ result = CopyCertSubject(data, cacert, &certp);
+ if(result)
+ return result;
+ free(certp);
CFArrayAppendValue(array, cacert);
CFRelease(cacert);
@@ -2155,12 +2279,12 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
|| ssl_connect_2_writing == connssl->connecting_state);
/* Here goes nothing: */
- err = SSLHandshake(connssl->ssl_ctx);
+ err = SSLHandshake(BACKEND->ssl_ctx);
if(err != noErr) {
switch(err) {
case errSSLWouldBlock: /* they're not done with us yet */
- connssl->connecting_state = connssl->ssl_direction ?
+ connssl->connecting_state = BACKEND->ssl_direction ?
ssl_connect_2_writing : ssl_connect_2_reading;
return CURLE_OK;
@@ -2169,7 +2293,7 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
case -9841:
if(SSL_CONN_CONFIG(CAfile) && SSL_CONN_CONFIG(verifypeer)) {
int res = verify_cert(SSL_CONN_CONFIG(CAfile), data,
- connssl->ssl_ctx);
+ BACKEND->ssl_ctx);
if(res != CURLE_OK)
return res;
}
@@ -2247,7 +2371,7 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
#ifdef DARWIN_SSL_PINNEDPUBKEY
if(data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]) {
- CURLcode result = pkp_pin_peer_pubkey(data, connssl->ssl_ctx,
+ CURLcode result = pkp_pin_peer_pubkey(data, BACKEND->ssl_ctx,
data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]);
if(result) {
failf(data, "SSL: public key does not match pinned public key!");
@@ -2257,8 +2381,8 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
#endif /* DARWIN_SSL_PINNEDPUBKEY */
/* Informational message */
- (void)SSLGetNegotiatedCipher(connssl->ssl_ctx, &cipher);
- (void)SSLGetNegotiatedProtocolVersion(connssl->ssl_ctx, &protocol);
+ (void)SSLGetNegotiatedCipher(BACKEND->ssl_ctx, &cipher);
+ (void)SSLGetNegotiatedProtocolVersion(BACKEND->ssl_ctx, &protocol);
switch(protocol) {
case kSSLProtocol2:
infof(data, "SSL 2.0 connection using %s\n",
@@ -2281,7 +2405,13 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
infof(data, "TLS 1.2 connection using %s\n",
TLSCipherNameForNumber(cipher));
break;
-#endif
+#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
+#if CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11
+ case kTLSProtocol13:
+ infof(data, "TLS 1.3 connection using %s\n",
+ TLSCipherNameForNumber(cipher));
+ break;
+#endif /* CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11 */
default:
infof(data, "Unknown protocol connection\n");
break;
@@ -2299,36 +2429,32 @@ show_verbose_server_cert(struct connectdata *conn,
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- CFStringRef server_cert_summary;
- char server_cert_summary_c[128];
CFArrayRef server_certs = NULL;
SecCertificateRef server_cert;
OSStatus err;
CFIndex i, count;
SecTrustRef trust = NULL;
- if(!connssl->ssl_ctx)
+ if(!BACKEND->ssl_ctx)
return;
#if CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS
#if CURL_BUILD_IOS
#pragma unused(server_certs)
- err = SSLCopyPeerTrust(connssl->ssl_ctx, &trust);
+ err = SSLCopyPeerTrust(BACKEND->ssl_ctx, &trust);
/* For some reason, SSLCopyPeerTrust() can return noErr and yet return
a null trust, so be on guard for that: */
if(err == noErr && trust) {
count = SecTrustGetCertificateCount(trust);
for(i = 0L ; i < count ; i++) {
+ CURLcode result;
+ char *certp;
server_cert = SecTrustGetCertificateAtIndex(trust, i);
- server_cert_summary = CopyCertSubject(server_cert);
- memset(server_cert_summary_c, 0, 128);
- if(CFStringGetCString(server_cert_summary,
- server_cert_summary_c,
- 128,
- kCFStringEncodingUTF8)) {
- infof(data, "Server certificate: %s\n", server_cert_summary_c);
+ result = CopyCertSubject(data, server_cert, &certp);
+ if(!result) {
+ infof(data, "Server certificate: %s\n", certp);
+ free(certp);
}
- CFRelease(server_cert_summary);
}
CFRelease(trust);
}
@@ -2341,45 +2467,40 @@ show_verbose_server_cert(struct connectdata *conn,
Lion or later. */
if(SecTrustEvaluateAsync != NULL) {
#pragma unused(server_certs)
- err = SSLCopyPeerTrust(connssl->ssl_ctx, &trust);
+ err = SSLCopyPeerTrust(BACKEND->ssl_ctx, &trust);
/* For some reason, SSLCopyPeerTrust() can return noErr and yet return
a null trust, so be on guard for that: */
if(err == noErr && trust) {
count = SecTrustGetCertificateCount(trust);
for(i = 0L ; i < count ; i++) {
+ char *certp;
+ CURLcode result;
server_cert = SecTrustGetCertificateAtIndex(trust, i);
- server_cert_summary = CopyCertSubject(server_cert);
- memset(server_cert_summary_c, 0, 128);
- if(CFStringGetCString(server_cert_summary,
- server_cert_summary_c,
- 128,
- kCFStringEncodingUTF8)) {
- infof(data, "Server certificate: %s\n", server_cert_summary_c);
+ result = CopyCertSubject(data, server_cert, &certp);
+ if(!result) {
+ infof(data, "Server certificate: %s\n", certp);
+ free(certp);
}
- CFRelease(server_cert_summary);
}
CFRelease(trust);
}
}
else {
#if CURL_SUPPORT_MAC_10_8
- err = SSLCopyPeerCertificates(connssl->ssl_ctx, &server_certs);
+ err = SSLCopyPeerCertificates(BACKEND->ssl_ctx, &server_certs);
/* Just in case SSLCopyPeerCertificates() returns null too... */
if(err == noErr && server_certs) {
count = CFArrayGetCount(server_certs);
for(i = 0L ; i < count ; i++) {
+ char *certp;
+ CURLcode result;
server_cert = (SecCertificateRef)CFArrayGetValueAtIndex(server_certs,
i);
-
- server_cert_summary = CopyCertSubject(server_cert);
- memset(server_cert_summary_c, 0, 128);
- if(CFStringGetCString(server_cert_summary,
- server_cert_summary_c,
- 128,
- kCFStringEncodingUTF8)) {
- infof(data, "Server certificate: %s\n", server_cert_summary_c);
+ result = CopyCertSubject(data, server_cert, &certp);
+ if(!result) {
+ infof(data, "Server certificate: %s\n", certp);
+ free(certp);
}
- CFRelease(server_cert_summary);
}
CFRelease(server_certs);
}
@@ -2388,20 +2509,18 @@ show_verbose_server_cert(struct connectdata *conn,
#endif /* CURL_BUILD_IOS */
#else
#pragma unused(trust)
- err = SSLCopyPeerCertificates(connssl->ssl_ctx, &server_certs);
+ err = SSLCopyPeerCertificates(BACKEND->ssl_ctx, &server_certs);
if(err == noErr) {
count = CFArrayGetCount(server_certs);
for(i = 0L ; i < count ; i++) {
+ CURLcode result;
+ char *certp;
server_cert = (SecCertificateRef)CFArrayGetValueAtIndex(server_certs, i);
- server_cert_summary = CopyCertSubject(server_cert);
- memset(server_cert_summary_c, 0, 128);
- if(CFStringGetCString(server_cert_summary,
- server_cert_summary_c,
- 128,
- kCFStringEncodingUTF8)) {
- infof(data, "Server certificate: %s\n", server_cert_summary_c);
+ result = CopyCertSubject(data, server_cert, &certp);
+ if(!result) {
+ infof(data, "Server certificate: %s\n", certp);
+ free(certp);
}
- CFRelease(server_cert_summary);
}
CFRelease(server_certs);
}
@@ -2450,7 +2569,7 @@ darwinssl_connect_common(struct connectdata *conn,
return CURLE_OK;
}
- if(ssl_connect_1==connssl->connecting_state) {
+ if(ssl_connect_1 == connssl->connecting_state) {
/* Find out how much more time we're allowed */
timeout_ms = Curl_timeleft(data, NULL, TRUE);
@@ -2545,17 +2664,13 @@ darwinssl_connect_common(struct connectdata *conn,
return CURLE_OK;
}
-CURLcode
-Curl_darwinssl_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done)
+static CURLcode Curl_darwinssl_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
return darwinssl_connect_common(conn, sockindex, TRUE, done);
}
-CURLcode
-Curl_darwinssl_connect(struct connectdata *conn,
- int sockindex)
+static CURLcode Curl_darwinssl_connect(struct connectdata *conn, int sockindex)
{
CURLcode result;
bool done = FALSE;
@@ -2570,28 +2685,28 @@ Curl_darwinssl_connect(struct connectdata *conn,
return CURLE_OK;
}
-void Curl_darwinssl_close(struct connectdata *conn, int sockindex)
+static void Curl_darwinssl_close(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- if(connssl->ssl_ctx) {
- (void)SSLClose(connssl->ssl_ctx);
+ if(BACKEND->ssl_ctx) {
+ (void)SSLClose(BACKEND->ssl_ctx);
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
if(SSLCreateContext != NULL)
- CFRelease(connssl->ssl_ctx);
+ CFRelease(BACKEND->ssl_ctx);
#if CURL_SUPPORT_MAC_10_8
else
- (void)SSLDisposeContext(connssl->ssl_ctx);
+ (void)SSLDisposeContext(BACKEND->ssl_ctx);
#endif /* CURL_SUPPORT_MAC_10_8 */
#else
- (void)SSLDisposeContext(connssl->ssl_ctx);
+ (void)SSLDisposeContext(BACKEND->ssl_ctx);
#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
- connssl->ssl_ctx = NULL;
+ BACKEND->ssl_ctx = NULL;
}
- connssl->ssl_sockfd = 0;
+ BACKEND->ssl_sockfd = 0;
}
-int Curl_darwinssl_shutdown(struct connectdata *conn, int sockindex)
+static int Curl_darwinssl_shutdown(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
struct Curl_easy *data = conn->data;
@@ -2600,7 +2715,7 @@ int Curl_darwinssl_shutdown(struct connectdata *conn, int sockindex)
int rc;
char buf[120];
- if(!connssl->ssl_ctx)
+ if(!BACKEND->ssl_ctx)
return 0;
if(data->set.ftp_ccc != CURLFTPSSL_CCC_ACTIVE)
@@ -2644,7 +2759,7 @@ int Curl_darwinssl_shutdown(struct connectdata *conn, int sockindex)
return rc;
}
-void Curl_darwinssl_session_free(void *ptr)
+static void Curl_darwinssl_session_free(void *ptr)
{
/* ST, as of iOS 5 and Mountain Lion, has no public method of deleting a
cached session ID inside the Security framework. There is a private
@@ -2655,7 +2770,7 @@ void Curl_darwinssl_session_free(void *ptr)
Curl_safefree(ptr);
}
-size_t Curl_darwinssl_version(char *buffer, size_t size)
+static size_t Curl_darwinssl_version(char *buffer, size_t size)
{
return snprintf(buffer, size, "SecureTransport");
}
@@ -2668,14 +2783,14 @@ size_t Curl_darwinssl_version(char *buffer, size_t size)
* 0 means the connection has been closed
* -1 means the connection status is unknown
*/
-int Curl_darwinssl_check_cxn(struct connectdata *conn)
+static int Curl_darwinssl_check_cxn(struct connectdata *conn)
{
struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];
OSStatus err;
SSLSessionState state;
- if(connssl->ssl_ctx) {
- err = SSLGetSessionState(connssl->ssl_ctx, &state);
+ if(BACKEND->ssl_ctx) {
+ err = SSLGetSessionState(BACKEND->ssl_ctx, &state);
if(err == noErr)
return state == kSSLConnected || state == kSSLHandshake;
return -1;
@@ -2683,15 +2798,15 @@ int Curl_darwinssl_check_cxn(struct connectdata *conn)
return 0;
}
-bool Curl_darwinssl_data_pending(const struct connectdata *conn,
- int connindex)
+static bool Curl_darwinssl_data_pending(const struct connectdata *conn,
+ int connindex)
{
const struct ssl_connect_data *connssl = &conn->ssl[connindex];
OSStatus err;
size_t buffer;
- if(connssl->ssl_ctx) { /* SSL is in use */
- err = SSLGetBufferedReadSize(connssl->ssl_ctx, &buffer);
+ if(BACKEND->ssl_ctx) { /* SSL is in use */
+ err = SSLGetBufferedReadSize(BACKEND->ssl_ctx, &buffer);
if(err == noErr)
return buffer > 0UL;
return false;
@@ -2700,14 +2815,16 @@ bool Curl_darwinssl_data_pending(const struct connectdata *conn,
return false;
}
-CURLcode Curl_darwinssl_random(unsigned char *entropy,
- size_t length)
+static CURLcode Curl_darwinssl_random(struct Curl_easy *data UNUSED_PARAM,
+ unsigned char *entropy, size_t length)
{
/* arc4random_buf() isn't available on cats older than Lion, so let's
do this manually for the benefit of the older cats. */
size_t i;
u_int32_t random_number = 0;
+ (void)data;
+
for(i = 0 ; i < length ; i++) {
if(i % sizeof(u_int32_t) == 0)
random_number = arc4random();
@@ -2718,25 +2835,26 @@ CURLcode Curl_darwinssl_random(unsigned char *entropy,
return CURLE_OK;
}
-void Curl_darwinssl_md5sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *md5sum, /* output */
- size_t md5len)
+static CURLcode Curl_darwinssl_md5sum(unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *md5sum, /* output */
+ size_t md5len)
{
(void)md5len;
(void)CC_MD5(tmp, (CC_LONG)tmplen, md5sum);
+ return CURLE_OK;
}
-void Curl_darwinssl_sha256sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum, /* output */
- size_t sha256len)
+static void Curl_darwinssl_sha256sum(const unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *sha256sum, /* output */
+ size_t sha256len)
{
- assert(sha256len >= SHA256_DIGEST_LENGTH);
+ assert(sha256len >= CURL_SHA256_DIGEST_LENGTH);
(void)CC_SHA256(tmp, (CC_LONG)tmplen, sha256sum);
}
-bool Curl_darwinssl_false_start(void)
+static bool Curl_darwinssl_false_start(void)
{
#if CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7
if(SSLSetSessionOption != NULL)
@@ -2771,15 +2889,15 @@ static ssize_t darwinssl_send(struct connectdata *conn,
over again with no new data until it quits returning errSSLWouldBlock. */
/* Do we have buffered data to write from the last time we were called? */
- if(connssl->ssl_write_buffered_length) {
+ if(BACKEND->ssl_write_buffered_length) {
/* Write the buffered data: */
- err = SSLWrite(connssl->ssl_ctx, NULL, 0UL, &processed);
+ err = SSLWrite(BACKEND->ssl_ctx, NULL, 0UL, &processed);
switch(err) {
case noErr:
/* processed is always going to be 0 because we didn't write to
the buffer, so return how much was written to the socket */
- processed = connssl->ssl_write_buffered_length;
- connssl->ssl_write_buffered_length = 0UL;
+ processed = BACKEND->ssl_write_buffered_length;
+ BACKEND->ssl_write_buffered_length = 0UL;
break;
case errSSLWouldBlock: /* argh, try again */
*curlcode = CURLE_AGAIN;
@@ -2792,13 +2910,13 @@ static ssize_t darwinssl_send(struct connectdata *conn,
}
else {
/* We've got new data to write: */
- err = SSLWrite(connssl->ssl_ctx, mem, len, &processed);
+ err = SSLWrite(BACKEND->ssl_ctx, mem, len, &processed);
if(err != noErr) {
switch(err) {
case errSSLWouldBlock:
/* Data was buffered but not sent, we have to tell the caller
to try sending again, and remember how much was buffered */
- connssl->ssl_write_buffered_length = len;
+ BACKEND->ssl_write_buffered_length = len;
*curlcode = CURLE_AGAIN;
return -1L;
default:
@@ -2820,7 +2938,7 @@ static ssize_t darwinssl_recv(struct connectdata *conn,
/*struct Curl_easy *data = conn->data;*/
struct ssl_connect_data *connssl = &conn->ssl[num];
size_t processed = 0UL;
- OSStatus err = SSLRead(connssl->ssl_ctx, buf, buffersize, &processed);
+ OSStatus err = SSLRead(BACKEND->ssl_ctx, buf, buffersize, &processed);
if(err != noErr) {
switch(err) {
@@ -2851,6 +2969,50 @@ static ssize_t darwinssl_recv(struct connectdata *conn,
return (ssize_t)processed;
}
+static void *Curl_darwinssl_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ (void)info;
+ return BACKEND->ssl_ctx;
+}
+
+const struct Curl_ssl Curl_ssl_darwinssl = {
+ { CURLSSLBACKEND_DARWINSSL, "darwinssl" }, /* info */
+
+ 0, /* have_ca_path */
+ 0, /* have_certinfo */
+#ifdef DARWIN_SSL_PINNEDPUBKEY
+ 1, /* have_pinnedpubkey */
+#else
+ 0, /* have_pinnedpubkey */
+#endif /* DARWIN_SSL_PINNEDPUBKEY */
+ 0, /* have_ssl_ctx */
+ 0, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_none_init, /* init */
+ Curl_none_cleanup, /* cleanup */
+ Curl_darwinssl_version, /* version */
+ Curl_darwinssl_check_cxn, /* check_cxn */
+ Curl_darwinssl_shutdown, /* shutdown */
+ Curl_darwinssl_data_pending, /* data_pending */
+ Curl_darwinssl_random, /* random */
+ Curl_none_cert_status_request, /* cert_status_request */
+ Curl_darwinssl_connect, /* connect */
+ Curl_darwinssl_connect_nonblocking, /* connect_nonblocking */
+ Curl_darwinssl_get_internals, /* get_internals */
+ Curl_darwinssl_close, /* close_one */
+ Curl_none_close_all, /* close_all */
+ Curl_darwinssl_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_darwinssl_false_start, /* false_start */
+ Curl_darwinssl_md5sum, /* md5sum */
+ Curl_darwinssl_sha256sum /* sha256sum */
+};
+
#ifdef __clang__
#pragma clang diagnostic pop
#endif
diff --git a/lib/vtls/darwinssl.h b/lib/vtls/darwinssl.h
index 13e7851..23c7f70 100644
--- a/lib/vtls/darwinssl.h
+++ b/lib/vtls/darwinssl.h
@@ -26,76 +26,7 @@
#ifdef USE_DARWINSSL
-CURLcode Curl_darwinssl_connect(struct connectdata *conn, int sockindex);
-
-CURLcode Curl_darwinssl_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done);
-
-/* close a SSL connection */
-void Curl_darwinssl_close(struct connectdata *conn, int sockindex);
-
-void Curl_darwinssl_session_free(void *ptr);
-size_t Curl_darwinssl_version(char *buffer, size_t size);
-int Curl_darwinssl_shutdown(struct connectdata *conn, int sockindex);
-int Curl_darwinssl_check_cxn(struct connectdata *conn);
-bool Curl_darwinssl_data_pending(const struct connectdata *conn,
- int connindex);
-
-CURLcode Curl_darwinssl_random(unsigned char *entropy,
- size_t length);
-void Curl_darwinssl_md5sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *md5sum, /* output */
- size_t md5len);
-void Curl_darwinssl_sha256sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum, /* output */
- size_t sha256len);
-bool Curl_darwinssl_false_start(void);
-
-/* Set the API backend definition to SecureTransport */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_DARWINSSL
-
-/* pinned public key support tests */
-
-/* version 1 supports macOS 10.12+ and iOS 10+ */
-#if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 100000) || \
- (!TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200))
-#define DARWIN_SSL_PINNEDPUBKEY_V1 1
-#endif
-
-/* version 2 supports MacOSX 10.7+ */
-#if (!TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
-#define DARWIN_SSL_PINNEDPUBKEY_V2 1
-#endif
-
-#if defined(DARWIN_SSL_PINNEDPUBKEY_V1) || defined(DARWIN_SSL_PINNEDPUBKEY_V2)
-/* this backend supports CURLOPT_PINNEDPUBLICKEY */
-#define DARWIN_SSL_PINNEDPUBKEY 1
-#define have_curlssl_pinnedpubkey 1
-#endif /* DARWIN_SSL_PINNEDPUBKEY */
-
-/* API setup for SecureTransport */
-#define curlssl_init() (1)
-#define curlssl_cleanup() Curl_nop_stmt
-#define curlssl_connect Curl_darwinssl_connect
-#define curlssl_connect_nonblocking Curl_darwinssl_connect_nonblocking
-#define curlssl_session_free(x) Curl_darwinssl_session_free(x)
-#define curlssl_close_all(x) ((void)x)
-#define curlssl_close Curl_darwinssl_close
-#define curlssl_shutdown(x,y) 0
-#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN)
-#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN)
-#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL)
-#define curlssl_version Curl_darwinssl_version
-#define curlssl_check_cxn Curl_darwinssl_check_cxn
-#define curlssl_data_pending(x,y) Curl_darwinssl_data_pending(x, y)
-#define curlssl_random(x,y,z) ((void)x, Curl_darwinssl_random(y,z))
-#define curlssl_md5sum(a,b,c,d) Curl_darwinssl_md5sum(a,b,c,d)
-#define curlssl_sha256sum(a,b,c,d) \
- Curl_darwinssl_sha256sum((unsigned char *)a, b, c, d)
-#define curlssl_false_start() Curl_darwinssl_false_start()
+extern const struct Curl_ssl Curl_ssl_darwinssl;
#endif /* USE_DARWINSSL */
#endif /* HEADER_CURL_DARWINSSL_H */
diff --git a/lib/vtls/gskit.c b/lib/vtls/gskit.c
index bf75bdd..de496dd 100644
--- a/lib/vtls/gskit.c
+++ b/lib/vtls/gskit.c
@@ -98,6 +98,14 @@
#define CURL_GSKPROTO_TLSV12_MASK (1 << CURL_GSKPROTO_TLSV12)
#define CURL_GSKPROTO_LAST 5
+struct ssl_backend_data {
+ gsk_handle handle;
+ int iocport;
+ int localfd;
+ int remotefd;
+};
+
+#define BACKEND connssl->backend
/* Supported ciphers. */
typedef struct {
@@ -427,7 +435,7 @@ static CURLcode set_ciphers(struct connectdata *conn,
}
-int Curl_gskit_init(void)
+static int Curl_gskit_init(void)
{
/* No initialisation needed. */
@@ -435,7 +443,7 @@ int Curl_gskit_init(void)
}
-void Curl_gskit_cleanup(void)
+static void Curl_gskit_cleanup(void)
{
/* Nothing to do. */
}
@@ -495,14 +503,14 @@ static void cancel_async_handshake(struct connectdata *conn, int sockindex)
Qso_OverlappedIO_t cstat;
if(QsoCancelOperation(conn->sock[sockindex], 0) > 0)
- QsoWaitForIOCompletion(connssl->iocport, &cstat, (struct timeval *) NULL);
+ QsoWaitForIOCompletion(BACKEND->iocport, &cstat, (struct timeval *) NULL);
}
static void close_async_handshake(struct ssl_connect_data *connssl)
{
- QsoDestroyIOCompletionPort(connssl->iocport);
- connssl->iocport = -1;
+ QsoDestroyIOCompletionPort(BACKEND->iocport);
+ BACKEND->iocport = -1;
}
/* SSL over SSL
@@ -620,12 +628,12 @@ static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
FD_ZERO(&fds_write);
n = -1;
if(directions & SOS_READ) {
- FD_SET(connssl->remotefd, &fds_write);
- n = connssl->remotefd;
+ FD_SET(BACKEND->remotefd, &fds_write);
+ n = BACKEND->remotefd;
}
if(directions & SOS_WRITE) {
- FD_SET(connssl->remotefd, &fds_read);
- n = connssl->remotefd;
+ FD_SET(BACKEND->remotefd, &fds_read);
+ n = BACKEND->remotefd;
FD_SET(conn->sock[sockindex], &fds_write);
if(n < conn->sock[sockindex])
n = conn->sock[sockindex];
@@ -634,14 +642,15 @@ static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
if(i < 0)
return -1; /* Select error. */
- if(FD_ISSET(connssl->remotefd, &fds_write)) {
+ if(FD_ISSET(BACKEND->remotefd, &fds_write)) {
/* Try getting data from HTTPS proxy and pipe it upstream. */
n = 0;
- i = gsk_secure_soc_read(connproxyssl->handle, buf, sizeof buf, &n);
+ i = gsk_secure_soc_read(connproxyssl->backend->handle,
+ buf, sizeof buf, &n);
switch(i) {
case GSK_OK:
if(n) {
- i = write(connssl->remotefd, buf, n);
+ i = write(BACKEND->remotefd, buf, n);
if(i < 0)
return -1;
ret = 1;
@@ -655,14 +664,14 @@ static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
}
}
- if(FD_ISSET(connssl->remotefd, &fds_read) &&
+ if(FD_ISSET(BACKEND->remotefd, &fds_read) &&
FD_ISSET(conn->sock[sockindex], &fds_write)) {
/* Pipe data to HTTPS proxy. */
- n = read(connssl->remotefd, buf, sizeof buf);
+ n = read(BACKEND->remotefd, buf, sizeof buf);
if(n < 0)
return -1;
if(n) {
- i = gsk_secure_soc_write(connproxyssl->handle, buf, n, &m);
+ i = gsk_secure_soc_write(connproxyssl->backend->handle, buf, n, &m);
if(i != GSK_OK || n != m)
return -1;
ret = 1;
@@ -676,23 +685,23 @@ static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
static void close_one(struct ssl_connect_data *connssl,
struct connectdata *conn, int sockindex)
{
- if(connssl->handle) {
- gskit_status(conn->data, gsk_secure_soc_close(&connssl->handle),
+ if(BACKEND->handle) {
+ gskit_status(conn->data, gsk_secure_soc_close(&BACKEND->handle),
"gsk_secure_soc_close()", 0);
/* Last chance to drain output. */
while(pipe_ssloverssl(conn, sockindex, SOS_WRITE) > 0)
;
- connssl->handle = (gsk_handle) NULL;
- if(connssl->localfd >= 0) {
- close(connssl->localfd);
- connssl->localfd = -1;
+ BACKEND->handle = (gsk_handle) NULL;
+ if(BACKEND->localfd >= 0) {
+ close(BACKEND->localfd);
+ BACKEND->localfd = -1;
}
- if(connssl->remotefd >= 0) {
- close(connssl->remotefd);
- connssl->remotefd = -1;
+ if(BACKEND->remotefd >= 0) {
+ close(BACKEND->remotefd);
+ BACKEND->remotefd = -1;
}
}
- if(connssl->iocport >= 0)
+ if(BACKEND->iocport >= 0)
close_async_handshake(connssl);
}
@@ -700,13 +709,14 @@ static void close_one(struct ssl_connect_data *connssl,
static ssize_t gskit_send(struct connectdata *conn, int sockindex,
const void *mem, size_t len, CURLcode *curlcode)
{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
struct Curl_easy *data = conn->data;
CURLcode cc = CURLE_SEND_ERROR;
int written;
if(pipe_ssloverssl(conn, sockindex, SOS_WRITE) >= 0) {
cc = gskit_status(data,
- gsk_secure_soc_write(conn->ssl[sockindex].handle,
+ gsk_secure_soc_write(BACKEND->handle,
(char *) mem, (int) len, &written),
"gsk_secure_soc_write()", CURLE_SEND_ERROR);
if(cc == CURLE_OK)
@@ -724,6 +734,7 @@ static ssize_t gskit_send(struct connectdata *conn, int sockindex,
static ssize_t gskit_recv(struct connectdata *conn, int num, char *buf,
size_t buffersize, CURLcode *curlcode)
{
+ struct ssl_connect_data *connssl = &conn->ssl[num];
struct Curl_easy *data = conn->data;
int buffsize;
int nread;
@@ -731,7 +742,7 @@ static ssize_t gskit_recv(struct connectdata *conn, int num, char *buf,
if(pipe_ssloverssl(conn, num, SOS_READ) >= 0) {
buffsize = buffersize > (size_t) INT_MAX? INT_MAX: (int) buffersize;
- cc = gskit_status(data, gsk_secure_soc_read(conn->ssl[num].handle,
+ cc = gskit_status(data, gsk_secure_soc_read(BACKEND->handle,
buf, buffsize, &nread),
"gsk_secure_soc_read()", CURLE_RECV_ERROR);
}
@@ -806,10 +817,10 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
/* Create SSL environment, start (preferably asynchronous) handshake. */
- connssl->handle = (gsk_handle) NULL;
- connssl->iocport = -1;
- connssl->localfd = -1;
- connssl->remotefd = -1;
+ BACKEND->handle = (gsk_handle) NULL;
+ BACKEND->iocport = -1;
+ BACKEND->localfd = -1;
+ BACKEND->remotefd = -1;
/* GSKit supports two ways of specifying an SSL context: either by
* application identifier (that should have been defined at the system
@@ -842,7 +853,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
}
/* Create secure session. */
- result = gskit_status(data, gsk_secure_soc_open(envir, &connssl->handle),
+ result = gskit_status(data, gsk_secure_soc_open(envir, &BACKEND->handle),
"gsk_secure_soc_open()", CURLE_SSL_CONNECT_ERROR);
gsk_environment_close(&envir);
if(result)
@@ -852,18 +863,18 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
if(conn->proxy_ssl[sockindex].use) {
if(inetsocketpair(sockpair))
return CURLE_SSL_CONNECT_ERROR;
- connssl->localfd = sockpair[0];
- connssl->remotefd = sockpair[1];
- setsockopt(connssl->localfd, SOL_SOCKET, SO_RCVBUF,
+ BACKEND->localfd = sockpair[0];
+ BACKEND->remotefd = sockpair[1];
+ setsockopt(BACKEND->localfd, SOL_SOCKET, SO_RCVBUF,
(void *) sobufsize, sizeof sobufsize);
- setsockopt(connssl->remotefd, SOL_SOCKET, SO_RCVBUF,
+ setsockopt(BACKEND->remotefd, SOL_SOCKET, SO_RCVBUF,
(void *) sobufsize, sizeof sobufsize);
- setsockopt(connssl->localfd, SOL_SOCKET, SO_SNDBUF,
+ setsockopt(BACKEND->localfd, SOL_SOCKET, SO_SNDBUF,
(void *) sobufsize, sizeof sobufsize);
- setsockopt(connssl->remotefd, SOL_SOCKET, SO_SNDBUF,
+ setsockopt(BACKEND->remotefd, SOL_SOCKET, SO_SNDBUF,
(void *) sobufsize, sizeof sobufsize);
- curlx_nonblock(connssl->localfd, TRUE);
- curlx_nonblock(connssl->remotefd, TRUE);
+ curlx_nonblock(BACKEND->localfd, TRUE);
+ curlx_nonblock(BACKEND->remotefd, TRUE);
}
/* Determine which SSL/TLS version should be enabled. */
@@ -897,7 +908,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
/* Process SNI. Ignore if not supported (on OS400 < V7R1). */
if(sni) {
- result = set_buffer(data, connssl->handle,
+ result = set_buffer(data, BACKEND->handle,
GSK_SSL_EXTN_SERVERNAME_REQUEST, sni, TRUE);
if(result == CURLE_UNSUPPORTED_PROTOCOL)
result = CURLE_OK;
@@ -911,34 +922,34 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
if(timeout < 0)
result = CURLE_OPERATION_TIMEDOUT;
else
- result = set_numeric(data, connssl->handle, GSK_HANDSHAKE_TIMEOUT,
+ result = set_numeric(data, BACKEND->handle, GSK_HANDSHAKE_TIMEOUT,
(timeout + 999) / 1000);
}
if(!result)
- result = set_numeric(data, connssl->handle, GSK_OS400_READ_TIMEOUT, 1);
+ result = set_numeric(data, BACKEND->handle, GSK_OS400_READ_TIMEOUT, 1);
if(!result)
- result = set_numeric(data, connssl->handle, GSK_FD, connssl->localfd >= 0?
- connssl->localfd: conn->sock[sockindex]);
+ result = set_numeric(data, BACKEND->handle, GSK_FD, BACKEND->localfd >= 0?
+ BACKEND->localfd: conn->sock[sockindex]);
if(!result)
- result = set_ciphers(conn, connssl->handle, &protoflags);
+ result = set_ciphers(conn, BACKEND->handle, &protoflags);
if(!protoflags) {
failf(data, "No SSL protocol/cipher combination enabled");
result = CURLE_SSL_CIPHER;
}
if(!result)
- result = set_enum(data, connssl->handle, GSK_PROTOCOL_SSLV2,
+ result = set_enum(data, BACKEND->handle, GSK_PROTOCOL_SSLV2,
(protoflags & CURL_GSKPROTO_SSLV2_MASK)?
GSK_PROTOCOL_SSLV2_ON: GSK_PROTOCOL_SSLV2_OFF, FALSE);
if(!result)
- result = set_enum(data, connssl->handle, GSK_PROTOCOL_SSLV3,
+ result = set_enum(data, BACKEND->handle, GSK_PROTOCOL_SSLV3,
(protoflags & CURL_GSKPROTO_SSLV3_MASK)?
GSK_PROTOCOL_SSLV3_ON: GSK_PROTOCOL_SSLV3_OFF, FALSE);
if(!result)
- result = set_enum(data, connssl->handle, GSK_PROTOCOL_TLSV1,
+ result = set_enum(data, BACKEND->handle, GSK_PROTOCOL_TLSV1,
(protoflags & CURL_GSKPROTO_TLSV10_MASK)?
GSK_PROTOCOL_TLSV1_ON: GSK_PROTOCOL_TLSV1_OFF, FALSE);
if(!result) {
- result = set_enum(data, connssl->handle, GSK_PROTOCOL_TLSV11,
+ result = set_enum(data, BACKEND->handle, GSK_PROTOCOL_TLSV11,
(protoflags & CURL_GSKPROTO_TLSV11_MASK)?
GSK_TRUE: GSK_FALSE, TRUE);
if(result == CURLE_UNSUPPORTED_PROTOCOL) {
@@ -950,7 +961,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
}
}
if(!result) {
- result = set_enum(data, connssl->handle, GSK_PROTOCOL_TLSV12,
+ result = set_enum(data, BACKEND->handle, GSK_PROTOCOL_TLSV12,
(protoflags & CURL_GSKPROTO_TLSV12_MASK)?
GSK_TRUE: GSK_FALSE, TRUE);
if(result == CURLE_UNSUPPORTED_PROTOCOL) {
@@ -962,18 +973,18 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
}
}
if(!result)
- result = set_enum(data, connssl->handle, GSK_SERVER_AUTH_TYPE,
+ result = set_enum(data, BACKEND->handle, GSK_SERVER_AUTH_TYPE,
verifypeer? GSK_SERVER_AUTH_FULL:
GSK_SERVER_AUTH_PASSTHRU, FALSE);
if(!result) {
/* Start handshake. Try asynchronous first. */
memset(&commarea, 0, sizeof commarea);
- connssl->iocport = QsoCreateIOCompletionPort();
- if(connssl->iocport != -1) {
+ BACKEND->iocport = QsoCreateIOCompletionPort();
+ if(BACKEND->iocport != -1) {
result = gskit_status(data,
- gsk_secure_soc_startInit(connssl->handle,
- connssl->iocport,
+ gsk_secure_soc_startInit(BACKEND->handle,
+ BACKEND->iocport,
&commarea),
"gsk_secure_soc_startInit()",
CURLE_SSL_CONNECT_ERROR);
@@ -993,7 +1004,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
}
else {
/* No more completion port available. Use synchronous IO. */
- result = gskit_status(data, gsk_secure_soc_init(connssl->handle),
+ result = gskit_status(data, gsk_secure_soc_init(BACKEND->handle),
"gsk_secure_soc_init()", CURLE_SSL_CONNECT_ERROR);
if(!result) {
connssl->connecting_state = ssl_connect_3;
@@ -1026,7 +1037,7 @@ static CURLcode gskit_connect_step2(struct connectdata *conn, int sockindex,
timeout_ms = 0;
stmv.tv_sec = timeout_ms / 1000;
stmv.tv_usec = (timeout_ms - stmv.tv_sec * 1000) * 1000;
- switch(QsoWaitForIOCompletion(connssl->iocport, &cstat, &stmv)) {
+ switch(QsoWaitForIOCompletion(BACKEND->iocport, &cstat, &stmv)) {
case 1: /* Operation complete. */
break;
case -1: /* An error occurred: handshake still in progress. */
@@ -1075,7 +1086,7 @@ static CURLcode gskit_connect_step3(struct connectdata *conn, int sockindex)
/* SSL handshake done: gather certificate info and verify host. */
- if(gskit_status(data, gsk_attribute_get_cert_info(connssl->handle,
+ if(gskit_status(data, gsk_attribute_get_cert_info(BACKEND->handle,
GSK_PARTNER_CERT_INFO,
&cdev, &cdec),
"gsk_attribute_get_cert_info()", CURLE_SSL_CONNECT_ERROR) ==
@@ -1216,9 +1227,8 @@ static CURLcode gskit_connect_common(struct connectdata *conn, int sockindex,
}
-CURLcode Curl_gskit_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done)
+static CURLcode Curl_gskit_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
CURLcode result;
@@ -1229,7 +1239,7 @@ CURLcode Curl_gskit_connect_nonblocking(struct connectdata *conn,
}
-CURLcode Curl_gskit_connect(struct connectdata *conn, int sockindex)
+static CURLcode Curl_gskit_connect(struct connectdata *conn, int sockindex)
{
CURLcode result;
bool done;
@@ -1245,14 +1255,14 @@ CURLcode Curl_gskit_connect(struct connectdata *conn, int sockindex)
}
-void Curl_gskit_close(struct connectdata *conn, int sockindex)
+static void Curl_gskit_close(struct connectdata *conn, int sockindex)
{
close_one(&conn->ssl[sockindex], conn, sockindex);
close_one(&conn->proxy_ssl[sockindex], conn, sockindex);
}
-int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
+static int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
struct Curl_easy *data = conn->data;
@@ -1261,7 +1271,7 @@ int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
int rc;
char buf[120];
- if(!connssl->handle)
+ if(!BACKEND->handle)
return 0;
if(data->set.ftp_ccc != CURLFTPSSL_CCC_ACTIVE)
@@ -1306,21 +1316,22 @@ int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
}
-size_t Curl_gskit_version(char *buffer, size_t size)
+static size_t Curl_gskit_version(char *buffer, size_t size)
{
strncpy(buffer, "GSKit", size);
return strlen(buffer);
}
-int Curl_gskit_check_cxn(struct connectdata *cxn)
+static int Curl_gskit_check_cxn(struct connectdata *cxn)
{
+ struct ssl_connect_data *connssl = &cxn->ssl[FIRSTSOCKET];
int err;
int errlen;
/* The only thing that can be tested here is at the socket level. */
- if(!cxn->ssl[FIRSTSOCKET].handle)
+ if(!BACKEND->handle)
return 0; /* connection has been closed */
err = 0;
@@ -1334,4 +1345,46 @@ int Curl_gskit_check_cxn(struct connectdata *cxn)
return -1; /* connection status unknown */
}
+static void *Curl_gskit_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ (void)info;
+ return BACKEND->handle;
+}
+
+const struct Curl_ssl Curl_ssl_gskit = {
+ { CURLSSLBACKEND_GSKIT, "gskit" }, /* info */
+
+ 0, /* have_ca_path */
+ 1, /* have_certinfo */
+ 0, /* have_pinnedpubkey */
+ 0, /* have_ssl_ctx */
+ /* TODO: convert to 1 and fix test #1014 (if need) */
+ 0, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_gskit_init, /* init */
+ Curl_gskit_cleanup, /* cleanup */
+ Curl_gskit_version, /* version */
+ Curl_gskit_check_cxn, /* check_cxn */
+ Curl_gskit_shutdown, /* shutdown */
+ Curl_none_data_pending, /* data_pending */
+ Curl_none_random, /* random */
+ Curl_none_cert_status_request, /* cert_status_request */
+ Curl_gskit_connect, /* connect */
+ Curl_gskit_connect_nonblocking, /* connect_nonblocking */
+ Curl_gskit_get_internals, /* get_internals */
+ Curl_gskit_close, /* close_one */
+ Curl_none_close_all, /* close_all */
+ /* No session handling for GSKit */
+ Curl_none_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_none_false_start, /* false_start */
+ Curl_none_md5sum, /* md5sum */
+ NULL /* sha256sum */
+};
+
#endif /* USE_GSKIT */
diff --git a/lib/vtls/gskit.h b/lib/vtls/gskit.h
index 2297592..466ee4d 100644
--- a/lib/vtls/gskit.h
+++ b/lib/vtls/gskit.h
@@ -30,44 +30,8 @@
#include "urldata.h"
#ifdef USE_GSKIT
-int Curl_gskit_init(void);
-void Curl_gskit_cleanup(void);
-CURLcode Curl_gskit_connect(struct connectdata *conn, int sockindex);
-CURLcode Curl_gskit_connect_nonblocking(struct connectdata *conn,
- int sockindex, bool *done);
-void Curl_gskit_close(struct connectdata *conn, int sockindex);
-int Curl_gskit_shutdown(struct connectdata *conn, int sockindex);
-size_t Curl_gskit_version(char *buffer, size_t size);
-int Curl_gskit_check_cxn(struct connectdata *cxn);
-
-/* Support HTTPS-proxy */
-/* TODO: add '#define HTTPS_PROXY_SUPPORT 1' and fix test #1014 (if need) */
-
-/* Set the API backend definition to GSKit */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_GSKIT
-
-/* this backend supports CURLOPT_CERTINFO */
-#define have_curlssl_certinfo 1
-
-/* API setup for GSKit */
-#define curlssl_init Curl_gskit_init
-#define curlssl_cleanup Curl_gskit_cleanup
-#define curlssl_connect Curl_gskit_connect
-#define curlssl_connect_nonblocking Curl_gskit_connect_nonblocking
-
-/* No session handling for GSKit */
-#define curlssl_session_free(x) Curl_nop_stmt
-#define curlssl_close_all(x) ((void)x)
-#define curlssl_close Curl_gskit_close
-#define curlssl_shutdown(x,y) Curl_gskit_shutdown(x,y)
-#define curlssl_set_engine(x,y) CURLE_NOT_BUILT_IN
-#define curlssl_set_engine_default(x) CURLE_NOT_BUILT_IN
-#define curlssl_engines_list(x) NULL
-#define curlssl_version Curl_gskit_version
-#define curlssl_check_cxn(x) Curl_gskit_check_cxn(x)
-#define curlssl_data_pending(x,y) 0
-#define curlssl_random(x,y,z) (x=x, y=y, z=z, CURLE_NOT_BUILT_IN)
+extern const struct Curl_ssl Curl_ssl_gskit;
#endif /* USE_GSKIT */
diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c
index d55f995..30b255b 100644
--- a/lib/vtls/gtls.c
+++ b/lib/vtls/gtls.c
@@ -107,6 +107,16 @@ static bool gtls_inited = FALSE;
# include <gnutls/ocsp.h>
#endif
+struct ssl_backend_data {
+ gnutls_session_t session;
+ gnutls_certificate_credentials_t cred;
+#ifdef USE_TLS_SRP
+ gnutls_srp_client_credentials_t srp_client_cred;
+#endif
+};
+
+#define BACKEND connssl->backend
+
/*
* Custom push and pull callback functions used by GNU TLS to read and write
* to the socket. These functions are simple wrappers to send() and recv()
@@ -186,7 +196,7 @@ static ssize_t Curl_gtls_pull_ssl(void *s, void *buf, size_t len)
* must only be called from within curl_global_init() to keep the thread
* situation under control!
*/
-int Curl_gtls_init(void)
+static int Curl_gtls_init(void)
{
int ret = 1;
if(!gtls_inited) {
@@ -200,13 +210,12 @@ int Curl_gtls_init(void)
return ret;
}
-int Curl_gtls_cleanup(void)
+static void Curl_gtls_cleanup(void)
{
if(gtls_inited) {
gnutls_global_deinit();
gtls_inited = FALSE;
}
- return 1;
}
#ifndef CURL_DISABLE_VERBOSE_STRINGS
@@ -277,7 +286,7 @@ static CURLcode handshake(struct connectdata *conn,
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- gnutls_session_t session = conn->ssl[sockindex].session;
+ gnutls_session_t session = BACKEND->session;
curl_socket_t sockfd = conn->sock[sockindex];
time_t timeout_ms;
int rc;
@@ -297,9 +306,9 @@ static CURLcode handshake(struct connectdata *conn,
if(connssl->connecting_state == ssl_connect_2_reading
|| connssl->connecting_state == ssl_connect_2_writing) {
- curl_socket_t writefd = ssl_connect_2_writing==
+ curl_socket_t writefd = ssl_connect_2_writing ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
- curl_socket_t readfd = ssl_connect_2_reading==
+ curl_socket_t readfd = ssl_connect_2_reading ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
@@ -475,6 +484,7 @@ gtls_connect_step1(struct connectdata *conn,
int sockindex)
{
struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
unsigned int init_flags;
gnutls_session_t session;
int rc;
@@ -510,7 +520,7 @@ gtls_connect_step1(struct connectdata *conn,
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
- if(conn->ssl[sockindex].state == ssl_connection_complete)
+ if(connssl->state == ssl_connection_complete)
/* to make us tolerant against being called more than once for the
same connection */
return CURLE_OK;
@@ -526,7 +536,7 @@ gtls_connect_step1(struct connectdata *conn,
sni = FALSE; /* SSLv3 has no SNI */
/* allocate a cred struct */
- rc = gnutls_certificate_allocate_credentials(&conn->ssl[sockindex].cred);
+ rc = gnutls_certificate_allocate_credentials(&BACKEND->cred);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_cert_all_cred() failed: %s", gnutls_strerror(rc));
return CURLE_SSL_CONNECT_ERROR;
@@ -537,15 +547,14 @@ gtls_connect_step1(struct connectdata *conn,
infof(data, "Using TLS-SRP username: %s\n", SSL_SET_OPTION(username));
rc = gnutls_srp_allocate_client_credentials(
- &conn->ssl[sockindex].srp_client_cred);
+ &BACKEND->srp_client_cred);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_srp_allocate_client_cred() failed: %s",
gnutls_strerror(rc));
return CURLE_OUT_OF_MEMORY;
}
- rc = gnutls_srp_set_client_credentials(conn->ssl[sockindex].
- srp_client_cred,
+ rc = gnutls_srp_set_client_credentials(BACKEND->srp_client_cred,
SSL_SET_OPTION(username),
SSL_SET_OPTION(password));
if(rc != GNUTLS_E_SUCCESS) {
@@ -558,10 +567,10 @@ gtls_connect_step1(struct connectdata *conn,
if(SSL_CONN_CONFIG(CAfile)) {
/* set the trusted CA cert bundle file */
- gnutls_certificate_set_verify_flags(conn->ssl[sockindex].cred,
+ gnutls_certificate_set_verify_flags(BACKEND->cred,
GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT);
- rc = gnutls_certificate_set_x509_trust_file(conn->ssl[sockindex].cred,
+ rc = gnutls_certificate_set_x509_trust_file(BACKEND->cred,
SSL_CONN_CONFIG(CAfile),
GNUTLS_X509_FMT_PEM);
if(rc < 0) {
@@ -578,7 +587,7 @@ gtls_connect_step1(struct connectdata *conn,
#ifdef HAS_CAPATH
if(SSL_CONN_CONFIG(CApath)) {
/* set the trusted CA cert directory */
- rc = gnutls_certificate_set_x509_trust_dir(conn->ssl[sockindex].cred,
+ rc = gnutls_certificate_set_x509_trust_dir(BACKEND->cred,
SSL_CONN_CONFIG(CApath),
GNUTLS_X509_FMT_PEM);
if(rc < 0) {
@@ -597,13 +606,13 @@ gtls_connect_step1(struct connectdata *conn,
/* use system ca certificate store as fallback */
if(SSL_CONN_CONFIG(verifypeer) &&
!(SSL_CONN_CONFIG(CAfile) || SSL_CONN_CONFIG(CApath))) {
- gnutls_certificate_set_x509_system_trust(conn->ssl[sockindex].cred);
+ gnutls_certificate_set_x509_system_trust(BACKEND->cred);
}
#endif
if(SSL_SET_OPTION(CRLfile)) {
/* set the CRL list file */
- rc = gnutls_certificate_set_x509_crl_file(conn->ssl[sockindex].cred,
+ rc = gnutls_certificate_set_x509_crl_file(BACKEND->cred,
SSL_SET_OPTION(CRLfile),
GNUTLS_X509_FMT_PEM);
if(rc < 0) {
@@ -624,14 +633,14 @@ gtls_connect_step1(struct connectdata *conn,
init_flags |= GNUTLS_NO_TICKETS;
#endif
- rc = gnutls_init(&conn->ssl[sockindex].session, init_flags);
+ rc = gnutls_init(&BACKEND->session, init_flags);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_init() failed: %d", rc);
return CURLE_SSL_CONNECT_ERROR;
}
/* convenient assign */
- session = conn->ssl[sockindex].session;
+ session = BACKEND->session;
if((0 == Curl_inet_pton(AF_INET, hostname, &addr)) &&
#ifdef ENABLE_IPV6
@@ -788,7 +797,7 @@ gtls_connect_step1(struct connectdata *conn,
GNUTLS_PKCS_USE_PBES2_AES_128 | GNUTLS_PKCS_USE_PBES2_AES_192 |
GNUTLS_PKCS_USE_PBES2_AES_256;
rc = gnutls_certificate_set_x509_key_file2(
- conn->ssl[sockindex].cred,
+ BACKEND->cred,
SSL_SET_OPTION(cert),
SSL_SET_OPTION(key) ?
SSL_SET_OPTION(key) : SSL_SET_OPTION(cert),
@@ -808,7 +817,7 @@ gtls_connect_step1(struct connectdata *conn,
}
else {
if(gnutls_certificate_set_x509_key_file(
- conn->ssl[sockindex].cred,
+ BACKEND->cred,
SSL_SET_OPTION(cert),
SSL_SET_OPTION(key) ?
SSL_SET_OPTION(key) : SSL_SET_OPTION(cert),
@@ -824,7 +833,7 @@ gtls_connect_step1(struct connectdata *conn,
/* put the credentials to the current session */
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
rc = gnutls_credentials_set(session, GNUTLS_CRD_SRP,
- conn->ssl[sockindex].srp_client_cred);
+ BACKEND->srp_client_cred);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_credentials_set() failed: %s", gnutls_strerror(rc));
return CURLE_SSL_CONNECT_ERROR;
@@ -834,7 +843,7 @@ gtls_connect_step1(struct connectdata *conn,
#endif
{
rc = gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE,
- conn->ssl[sockindex].cred);
+ BACKEND->cred);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_credentials_set() failed: %s", gnutls_strerror(rc));
return CURLE_SSL_CONNECT_ERROR;
@@ -842,7 +851,7 @@ gtls_connect_step1(struct connectdata *conn,
}
if(conn->proxy_ssl[sockindex].use) {
- transport_ptr = conn->proxy_ssl[sockindex].session;
+ transport_ptr = conn->proxy_ssl[sockindex].backend->session;
gnutls_transport_push = Curl_gtls_push_ssl;
gnutls_transport_pull = Curl_gtls_pull_ssl;
}
@@ -967,7 +976,8 @@ gtls_connect_step3(struct connectdata *conn,
time_t certclock;
const char *ptr;
struct Curl_easy *data = conn->data;
- gnutls_session_t session = conn->ssl[sockindex].session;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ gnutls_session_t session = BACKEND->session;
int rc;
#ifdef HAS_ALPN
gnutls_datum_t proto;
@@ -1198,7 +1208,7 @@ gtls_connect_step3(struct connectdata *conn,
SSL_SET_OPTION(issuercert)?SSL_SET_OPTION(issuercert):"none");
}
- size=sizeof(certbuf);
+ size = sizeof(certbuf);
rc = gnutls_x509_crt_get_dn_by_oid(x509_cert, GNUTLS_OID_X520_COMMON_NAME,
0, /* the first and only one */
FALSE,
@@ -1238,7 +1248,7 @@ gtls_connect_step3(struct connectdata *conn,
#endif
if(addrlen) {
- for(i=0; ; i++) {
+ for(i = 0; ; i++) {
certaddrlen = sizeof(certaddr);
ret = gnutls_x509_crt_get_subject_alt_name(x509_cert, i, certaddr,
&certaddrlen, NULL);
@@ -1471,7 +1481,7 @@ gtls_connect_common(struct connectdata *conn,
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
/* Initiate the connection, if not already done */
- if(ssl_connect_1==connssl->connecting_state) {
+ if(ssl_connect_1 == connssl->connecting_state) {
rc = gtls_connect_step1(conn, sockindex);
if(rc)
return rc;
@@ -1483,29 +1493,24 @@ gtls_connect_common(struct connectdata *conn,
return rc;
/* Finish connecting once the handshake is done */
- if(ssl_connect_1==connssl->connecting_state) {
+ if(ssl_connect_1 == connssl->connecting_state) {
rc = gtls_connect_step3(conn, sockindex);
if(rc)
return rc;
}
- *done = ssl_connect_1==connssl->connecting_state;
+ *done = ssl_connect_1 == connssl->connecting_state;
return CURLE_OK;
}
-CURLcode
-Curl_gtls_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done)
+static CURLcode Curl_gtls_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
return gtls_connect_common(conn, sockindex, TRUE, done);
}
-CURLcode
-Curl_gtls_connect(struct connectdata *conn,
- int sockindex)
-
+static CURLcode Curl_gtls_connect(struct connectdata *conn, int sockindex)
{
CURLcode result;
bool done = FALSE;
@@ -1519,15 +1524,18 @@ Curl_gtls_connect(struct connectdata *conn,
return CURLE_OK;
}
-bool Curl_gtls_data_pending(const struct connectdata *conn, int connindex)
+static bool Curl_gtls_data_pending(const struct connectdata *conn,
+ int connindex)
{
+ const struct ssl_connect_data *connssl = &conn->ssl[connindex];
bool res = FALSE;
- if(conn->ssl[connindex].session &&
- 0 != gnutls_record_check_pending(conn->ssl[connindex].session))
+ if(BACKEND->session &&
+ 0 != gnutls_record_check_pending(BACKEND->session))
res = TRUE;
- if(conn->proxy_ssl[connindex].session &&
- 0 != gnutls_record_check_pending(conn->proxy_ssl[connindex].session))
+ connssl = &conn->proxy_ssl[connindex];
+ if(BACKEND->session &&
+ 0 != gnutls_record_check_pending(BACKEND->session))
res = TRUE;
return res;
@@ -1539,7 +1547,8 @@ static ssize_t gtls_send(struct connectdata *conn,
size_t len,
CURLcode *curlcode)
{
- ssize_t rc = gnutls_record_send(conn->ssl[sockindex].session, mem, len);
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ ssize_t rc = gnutls_record_send(BACKEND->session, mem, len);
if(rc < 0) {
*curlcode = (rc == GNUTLS_E_AGAIN)
@@ -1552,26 +1561,26 @@ static ssize_t gtls_send(struct connectdata *conn,
return rc;
}
-static void close_one(struct ssl_connect_data *ssl)
+static void close_one(struct ssl_connect_data *connssl)
{
- if(ssl->session) {
- gnutls_bye(ssl->session, GNUTLS_SHUT_RDWR);
- gnutls_deinit(ssl->session);
- ssl->session = NULL;
+ if(BACKEND->session) {
+ gnutls_bye(BACKEND->session, GNUTLS_SHUT_RDWR);
+ gnutls_deinit(BACKEND->session);
+ BACKEND->session = NULL;
}
- if(ssl->cred) {
- gnutls_certificate_free_credentials(ssl->cred);
- ssl->cred = NULL;
+ if(BACKEND->cred) {
+ gnutls_certificate_free_credentials(BACKEND->cred);
+ BACKEND->cred = NULL;
}
#ifdef USE_TLS_SRP
- if(ssl->srp_client_cred) {
- gnutls_srp_free_client_credentials(ssl->srp_client_cred);
- ssl->srp_client_cred = NULL;
+ if(BACKEND->srp_client_cred) {
+ gnutls_srp_free_client_credentials(BACKEND->srp_client_cred);
+ BACKEND->srp_client_cred = NULL;
}
#endif
}
-void Curl_gtls_close(struct connectdata *conn, int sockindex)
+static void Curl_gtls_close(struct connectdata *conn, int sockindex)
{
close_one(&conn->ssl[sockindex]);
close_one(&conn->proxy_ssl[sockindex]);
@@ -1581,8 +1590,9 @@ void Curl_gtls_close(struct connectdata *conn, int sockindex)
* This function is called to shut down the SSL layer but keep the
* socket open (CCC - Clear Command Channel)
*/
-int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
+static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
ssize_t result;
int retval = 0;
struct Curl_easy *data = conn->data;
@@ -1595,16 +1605,16 @@ int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
we do not send one. Let's hope other servers do the same... */
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
- gnutls_bye(conn->ssl[sockindex].session, GNUTLS_SHUT_WR);
+ gnutls_bye(BACKEND->session, GNUTLS_SHUT_WR);
- if(conn->ssl[sockindex].session) {
+ if(BACKEND->session) {
while(!done) {
int what = SOCKET_READABLE(conn->sock[sockindex],
SSL_SHUTDOWN_TIMEOUT);
if(what > 0) {
/* Something to read, let's do it and hope that it is the close
notify alert from the server */
- result = gnutls_record_recv(conn->ssl[sockindex].session,
+ result = gnutls_record_recv(BACKEND->session,
buf, sizeof(buf));
switch(result) {
case 0:
@@ -1635,18 +1645,18 @@ int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
done = 1;
}
}
- gnutls_deinit(conn->ssl[sockindex].session);
+ gnutls_deinit(BACKEND->session);
}
- gnutls_certificate_free_credentials(conn->ssl[sockindex].cred);
+ gnutls_certificate_free_credentials(BACKEND->cred);
#ifdef USE_TLS_SRP
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP
&& SSL_SET_OPTION(username) != NULL)
- gnutls_srp_free_client_credentials(conn->ssl[sockindex].srp_client_cred);
+ gnutls_srp_free_client_credentials(BACKEND->srp_client_cred);
#endif
- conn->ssl[sockindex].cred = NULL;
- conn->ssl[sockindex].session = NULL;
+ BACKEND->cred = NULL;
+ BACKEND->session = NULL;
return retval;
}
@@ -1657,9 +1667,10 @@ static ssize_t gtls_recv(struct connectdata *conn, /* connection data */
size_t buffersize, /* max amount to read */
CURLcode *curlcode)
{
+ struct ssl_connect_data *connssl = &conn->ssl[num];
ssize_t ret;
- ret = gnutls_record_recv(conn->ssl[num].session, buf, buffersize);
+ ret = gnutls_record_recv(BACKEND->session, buf, buffersize);
if((ret == GNUTLS_E_AGAIN) || (ret == GNUTLS_E_INTERRUPTED)) {
*curlcode = CURLE_AGAIN;
return -1;
@@ -1679,6 +1690,7 @@ static ssize_t gtls_recv(struct connectdata *conn, /* connection data */
if(ret < 0) {
failf(conn->data, "GnuTLS recv error (%d): %s",
+
(int)ret, gnutls_strerror((int)ret));
*curlcode = CURLE_RECV_ERROR;
return -1;
@@ -1687,12 +1699,12 @@ static ssize_t gtls_recv(struct connectdata *conn, /* connection data */
return ret;
}
-void Curl_gtls_session_free(void *ptr)
+static void Curl_gtls_session_free(void *ptr)
{
free(ptr);
}
-size_t Curl_gtls_version(char *buffer, size_t size)
+static size_t Curl_gtls_version(char *buffer, size_t size)
{
return snprintf(buffer, size, "GnuTLS/%s", gnutls_check_version(NULL));
}
@@ -1722,9 +1734,8 @@ static int Curl_gtls_seed(struct Curl_easy *data)
#endif
/* data might be NULL! */
-CURLcode Curl_gtls_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length)
+static CURLcode Curl_gtls_random(struct Curl_easy *data,
+ unsigned char *entropy, size_t length)
{
#if defined(USE_GNUTLS_NETTLE)
int rc;
@@ -1739,10 +1750,10 @@ CURLcode Curl_gtls_random(struct Curl_easy *data,
return CURLE_OK;
}
-void Curl_gtls_md5sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *md5sum, /* output */
- size_t md5len)
+static CURLcode Curl_gtls_md5sum(unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *md5sum, /* output */
+ size_t md5len)
{
#if defined(USE_GNUTLS_NETTLE)
struct md5_ctx MD5pw;
@@ -1756,12 +1767,13 @@ void Curl_gtls_md5sum(unsigned char *tmp, /* input */
memcpy(md5sum, gcry_md_read(MD5pw, 0), md5len);
gcry_md_close(MD5pw);
#endif
+ return CURLE_OK;
}
-void Curl_gtls_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum, /* output */
- size_t sha256len)
+static void Curl_gtls_sha256sum(const unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *sha256sum, /* output */
+ size_t sha256len)
{
#if defined(USE_GNUTLS_NETTLE)
struct sha256_ctx SHA256pw;
@@ -1777,7 +1789,7 @@ void Curl_gtls_sha256sum(const unsigned char *tmp, /* input */
#endif
}
-bool Curl_gtls_cert_status_request(void)
+static bool Curl_gtls_cert_status_request(void)
{
#ifdef HAS_OCSP
return TRUE;
@@ -1786,4 +1798,44 @@ bool Curl_gtls_cert_status_request(void)
#endif
}
+static void *Curl_gtls_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ (void)info;
+ return BACKEND->session;
+}
+
+const struct Curl_ssl Curl_ssl_gnutls = {
+ { CURLSSLBACKEND_GNUTLS, "gnutls" }, /* info */
+
+ 1, /* have_ca_path */
+ 1, /* have_certinfo */
+ 1, /* have_pinnedpubkey */
+ 0, /* have_ssl_ctx */
+ 1, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_gtls_init, /* init */
+ Curl_gtls_cleanup, /* cleanup */
+ Curl_gtls_version, /* version */
+ Curl_none_check_cxn, /* check_cxn */
+ Curl_gtls_shutdown, /* shutdown */
+ Curl_gtls_data_pending, /* data_pending */
+ Curl_gtls_random, /* random */
+ Curl_gtls_cert_status_request, /* cert_status_request */
+ Curl_gtls_connect, /* connect */
+ Curl_gtls_connect_nonblocking, /* connect_nonblocking */
+ Curl_gtls_get_internals, /* get_internals */
+ Curl_gtls_close, /* close_one */
+ Curl_none_close_all, /* close_all */
+ Curl_gtls_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_none_false_start, /* false_start */
+ Curl_gtls_md5sum, /* md5sum */
+ Curl_gtls_sha256sum /* sha256sum */
+};
+
#endif /* USE_GNUTLS */
diff --git a/lib/vtls/gtls.h b/lib/vtls/gtls.h
index 462c048..780fc10 100644
--- a/lib/vtls/gtls.h
+++ b/lib/vtls/gtls.h
@@ -28,69 +28,7 @@
#include "urldata.h"
-int Curl_gtls_init(void);
-int Curl_gtls_cleanup(void);
-CURLcode Curl_gtls_connect(struct connectdata *conn, int sockindex);
-CURLcode Curl_gtls_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done);
-bool Curl_gtls_data_pending(const struct connectdata *conn,
- int connindex);
-
- /* close a SSL connection */
-void Curl_gtls_close(struct connectdata *conn, int sockindex);
-
-void Curl_gtls_session_free(void *ptr);
-size_t Curl_gtls_version(char *buffer, size_t size);
-int Curl_gtls_shutdown(struct connectdata *conn, int sockindex);
-CURLcode Curl_gtls_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length);
-void Curl_gtls_md5sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *md5sum, /* output */
- size_t md5len);
-void Curl_gtls_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum, /* output */
- size_t sha256len);
-
-bool Curl_gtls_cert_status_request(void);
-
-/* Support HTTPS-proxy */
-#define HTTPS_PROXY_SUPPORT 1
-
-/* Set the API backend definition to GnuTLS */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_GNUTLS
-
-/* this backend supports the CAPATH option */
-#define have_curlssl_ca_path 1
-
-/* this backend supports CURLOPT_CERTINFO */
-#define have_curlssl_certinfo 1
-
-/* this backend supports CURLOPT_PINNEDPUBLICKEY */
-#define have_curlssl_pinnedpubkey 1
-
-/* API setup for GnuTLS */
-#define curlssl_init Curl_gtls_init
-#define curlssl_cleanup Curl_gtls_cleanup
-#define curlssl_connect Curl_gtls_connect
-#define curlssl_connect_nonblocking Curl_gtls_connect_nonblocking
-#define curlssl_session_free(x) Curl_gtls_session_free(x)
-#define curlssl_close_all(x) ((void)x)
-#define curlssl_close Curl_gtls_close
-#define curlssl_shutdown(x,y) Curl_gtls_shutdown(x,y)
-#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN)
-#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN)
-#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL)
-#define curlssl_version Curl_gtls_version
-#define curlssl_check_cxn(x) ((void)x, -1)
-#define curlssl_data_pending(x,y) Curl_gtls_data_pending(x,y)
-#define curlssl_random(x,y,z) Curl_gtls_random(x,y,z)
-#define curlssl_md5sum(a,b,c,d) Curl_gtls_md5sum(a,b,c,d)
-#define curlssl_sha256sum(a,b,c,d) Curl_gtls_sha256sum(a,b,c,d)
-#define curlssl_cert_status_request() Curl_gtls_cert_status_request()
+extern const struct Curl_ssl Curl_ssl_gnutls;
#endif /* USE_GNUTLS */
#endif /* HEADER_CURL_GTLS_H */
diff --git a/lib/vtls/mbedtls.c b/lib/vtls/mbedtls.c
index 037babe..28251a3 100644
--- a/lib/vtls/mbedtls.c
+++ b/lib/vtls/mbedtls.c
@@ -61,6 +61,21 @@
#include "curl_memory.h"
#include "memdebug.h"
+struct ssl_backend_data {
+ mbedtls_ctr_drbg_context ctr_drbg;
+ mbedtls_entropy_context entropy;
+ mbedtls_ssl_context ssl;
+ int server_fd;
+ mbedtls_x509_crt cacert;
+ mbedtls_x509_crt clicert;
+ mbedtls_x509_crl crl;
+ mbedtls_pk_context pk;
+ mbedtls_ssl_config config;
+ const char *protocols[3];
+};
+
+#define BACKEND connssl->backend
+
/* apply threading? */
#if defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32)
#define THREADING_SUPPORT
@@ -214,9 +229,9 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
return result;
}
- mbedtls_ssl_conf_min_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_min_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
mbedtls_ver_min);
- mbedtls_ssl_conf_max_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_max_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
mbedtls_ver_max);
return result;
@@ -238,7 +253,7 @@ mbed_connect_step1(struct connectdata *conn,
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
int ret = -1;
char errorbuf[128];
- errorbuf[0]=0;
+ errorbuf[0] = 0;
/* mbedTLS only supports SSLv3 and TLSv1 */
if(SSL_CONN_CONFIG(version) == CURL_SSLVERSION_SSLv2) {
@@ -248,9 +263,9 @@ mbed_connect_step1(struct connectdata *conn,
#ifdef THREADING_SUPPORT
entropy_init_mutex(&ts_entropy);
- mbedtls_ctr_drbg_init(&connssl->ctr_drbg);
+ mbedtls_ctr_drbg_init(&BACKEND->ctr_drbg);
- ret = mbedtls_ctr_drbg_seed(&connssl->ctr_drbg, entropy_func_mutex,
+ ret = mbedtls_ctr_drbg_seed(&BACKEND->ctr_drbg, entropy_func_mutex,
&ts_entropy, NULL, 0);
if(ret) {
#ifdef MBEDTLS_ERROR_C
@@ -260,11 +275,11 @@ mbed_connect_step1(struct connectdata *conn,
-ret, errorbuf);
}
#else
- mbedtls_entropy_init(&connssl->entropy);
- mbedtls_ctr_drbg_init(&connssl->ctr_drbg);
+ mbedtls_entropy_init(&BACKEND->entropy);
+ mbedtls_ctr_drbg_init(&BACKEND->ctr_drbg);
- ret = mbedtls_ctr_drbg_seed(&connssl->ctr_drbg, mbedtls_entropy_func,
- &connssl->entropy, NULL, 0);
+ ret = mbedtls_ctr_drbg_seed(&BACKEND->ctr_drbg, mbedtls_entropy_func,
+ &BACKEND->entropy, NULL, 0);
if(ret) {
#ifdef MBEDTLS_ERROR_C
mbedtls_strerror(ret, errorbuf, sizeof(errorbuf));
@@ -275,10 +290,10 @@ mbed_connect_step1(struct connectdata *conn,
#endif /* THREADING_SUPPORT */
/* Load the trusted CA */
- mbedtls_x509_crt_init(&connssl->cacert);
+ mbedtls_x509_crt_init(&BACKEND->cacert);
if(ssl_cafile) {
- ret = mbedtls_x509_crt_parse_file(&connssl->cacert, ssl_cafile);
+ ret = mbedtls_x509_crt_parse_file(&BACKEND->cacert, ssl_cafile);
if(ret<0) {
#ifdef MBEDTLS_ERROR_C
@@ -293,7 +308,7 @@ mbed_connect_step1(struct connectdata *conn,
}
if(ssl_capath) {
- ret = mbedtls_x509_crt_parse_path(&connssl->cacert, ssl_capath);
+ ret = mbedtls_x509_crt_parse_path(&BACKEND->cacert, ssl_capath);
if(ret<0) {
#ifdef MBEDTLS_ERROR_C
@@ -308,10 +323,10 @@ mbed_connect_step1(struct connectdata *conn,
}
/* Load the client certificate */
- mbedtls_x509_crt_init(&connssl->clicert);
+ mbedtls_x509_crt_init(&BACKEND->clicert);
if(ssl_cert) {
- ret = mbedtls_x509_crt_parse_file(&connssl->clicert, ssl_cert);
+ ret = mbedtls_x509_crt_parse_file(&BACKEND->clicert, ssl_cert);
if(ret) {
#ifdef MBEDTLS_ERROR_C
@@ -325,12 +340,12 @@ mbed_connect_step1(struct connectdata *conn,
}
/* Load the client private key */
- mbedtls_pk_init(&connssl->pk);
+ mbedtls_pk_init(&BACKEND->pk);
if(SSL_SET_OPTION(key)) {
- ret = mbedtls_pk_parse_keyfile(&connssl->pk, SSL_SET_OPTION(key),
+ ret = mbedtls_pk_parse_keyfile(&BACKEND->pk, SSL_SET_OPTION(key),
SSL_SET_OPTION(key_passwd));
- if(ret == 0 && !mbedtls_pk_can_do(&connssl->pk, MBEDTLS_PK_RSA))
+ if(ret == 0 && !mbedtls_pk_can_do(&BACKEND->pk, MBEDTLS_PK_RSA))
ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
if(ret) {
@@ -345,10 +360,10 @@ mbed_connect_step1(struct connectdata *conn,
}
/* Load the CRL */
- mbedtls_x509_crl_init(&connssl->crl);
+ mbedtls_x509_crl_init(&BACKEND->crl);
if(ssl_crlfile) {
- ret = mbedtls_x509_crl_parse_file(&connssl->crl, ssl_crlfile);
+ ret = mbedtls_x509_crl_parse_file(&BACKEND->crl, ssl_crlfile);
if(ret) {
#ifdef MBEDTLS_ERROR_C
@@ -363,14 +378,14 @@ mbed_connect_step1(struct connectdata *conn,
infof(data, "mbedTLS: Connecting to %s:%d\n", hostname, port);
- mbedtls_ssl_config_init(&connssl->config);
+ mbedtls_ssl_config_init(&BACKEND->config);
- mbedtls_ssl_init(&connssl->ssl);
- if(mbedtls_ssl_setup(&connssl->ssl, &connssl->config)) {
+ mbedtls_ssl_init(&BACKEND->ssl);
+ if(mbedtls_ssl_setup(&BACKEND->ssl, &BACKEND->config)) {
failf(data, "mbedTLS: ssl_init failed");
return CURLE_SSL_CONNECT_ERROR;
}
- ret = mbedtls_ssl_config_defaults(&connssl->config,
+ ret = mbedtls_ssl_config_defaults(&BACKEND->config,
MBEDTLS_SSL_IS_CLIENT,
MBEDTLS_SSL_TRANSPORT_STREAM,
MBEDTLS_SSL_PRESET_DEFAULT);
@@ -380,20 +395,20 @@ mbed_connect_step1(struct connectdata *conn,
}
/* new profile with RSA min key len = 1024 ... */
- mbedtls_ssl_conf_cert_profile(&connssl->config,
+ mbedtls_ssl_conf_cert_profile(&BACKEND->config,
&mbedtls_x509_crt_profile_fr);
switch(SSL_CONN_CONFIG(version)) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
- mbedtls_ssl_conf_min_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_min_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
MBEDTLS_SSL_MINOR_VERSION_1);
infof(data, "mbedTLS: Set min SSL version to TLS 1.0\n");
break;
case CURL_SSLVERSION_SSLv3:
- mbedtls_ssl_conf_min_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_min_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
MBEDTLS_SSL_MINOR_VERSION_0);
- mbedtls_ssl_conf_max_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_max_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
MBEDTLS_SSL_MINOR_VERSION_0);
infof(data, "mbedTLS: Set SSL version to SSLv3\n");
break;
@@ -412,25 +427,25 @@ mbed_connect_step1(struct connectdata *conn,
return CURLE_SSL_CONNECT_ERROR;
}
- mbedtls_ssl_conf_authmode(&connssl->config, MBEDTLS_SSL_VERIFY_OPTIONAL);
+ mbedtls_ssl_conf_authmode(&BACKEND->config, MBEDTLS_SSL_VERIFY_OPTIONAL);
- mbedtls_ssl_conf_rng(&connssl->config, mbedtls_ctr_drbg_random,
- &connssl->ctr_drbg);
- mbedtls_ssl_set_bio(&connssl->ssl, &conn->sock[sockindex],
+ mbedtls_ssl_conf_rng(&BACKEND->config, mbedtls_ctr_drbg_random,
+ &BACKEND->ctr_drbg);
+ mbedtls_ssl_set_bio(&BACKEND->ssl, &conn->sock[sockindex],
mbedtls_net_send,
mbedtls_net_recv,
NULL /* rev_timeout() */);
- mbedtls_ssl_conf_ciphersuites(&connssl->config,
+ mbedtls_ssl_conf_ciphersuites(&BACKEND->config,
mbedtls_ssl_list_ciphersuites());
#if defined(MBEDTLS_SSL_RENEGOTIATION)
- mbedtls_ssl_conf_renegotiation(&connssl->config,
+ mbedtls_ssl_conf_renegotiation(&BACKEND->config,
MBEDTLS_SSL_RENEGOTIATION_ENABLED);
#endif
#if defined(MBEDTLS_SSL_SESSION_TICKETS)
- mbedtls_ssl_conf_session_tickets(&connssl->config,
+ mbedtls_ssl_conf_session_tickets(&BACKEND->config,
MBEDTLS_SSL_SESSION_TICKETS_DISABLED);
#endif
@@ -440,7 +455,7 @@ mbed_connect_step1(struct connectdata *conn,
Curl_ssl_sessionid_lock(conn);
if(!Curl_ssl_getsessionid(conn, &old_session, NULL, sockindex)) {
- ret = mbedtls_ssl_set_session(&connssl->ssl, old_session);
+ ret = mbedtls_ssl_set_session(&BACKEND->ssl, old_session);
if(ret) {
Curl_ssl_sessionid_unlock(conn);
failf(data, "mbedtls_ssl_set_session returned -0x%x", -ret);
@@ -451,15 +466,15 @@ mbed_connect_step1(struct connectdata *conn,
Curl_ssl_sessionid_unlock(conn);
}
- mbedtls_ssl_conf_ca_chain(&connssl->config,
- &connssl->cacert,
- &connssl->crl);
+ mbedtls_ssl_conf_ca_chain(&BACKEND->config,
+ &BACKEND->cacert,
+ &BACKEND->crl);
if(SSL_SET_OPTION(key)) {
- mbedtls_ssl_conf_own_cert(&connssl->config,
- &connssl->clicert, &connssl->pk);
+ mbedtls_ssl_conf_own_cert(&BACKEND->config,
+ &BACKEND->clicert, &BACKEND->pk);
}
- if(mbedtls_ssl_set_hostname(&connssl->ssl, hostname)) {
+ if(mbedtls_ssl_set_hostname(&BACKEND->ssl, hostname)) {
/* mbedtls_ssl_set_hostname() sets the name to use in CN/SAN checks *and*
the name to set in the SNI extension. So even if curl connects to a
host specified as an IP address, this function must be used. */
@@ -469,7 +484,7 @@ mbed_connect_step1(struct connectdata *conn,
#ifdef HAS_ALPN
if(conn->bits.tls_enable_alpn) {
- const char **p = &connssl->protocols[0];
+ const char **p = &BACKEND->protocols[0];
#ifdef USE_NGHTTP2
if(data->set.httpversion >= CURL_HTTP_VERSION_2)
*p++ = NGHTTP2_PROTO_VERSION_ID;
@@ -478,19 +493,19 @@ mbed_connect_step1(struct connectdata *conn,
*p = NULL;
/* this function doesn't clone the protocols array, which is why we need
to keep it around */
- if(mbedtls_ssl_conf_alpn_protocols(&connssl->config,
- &connssl->protocols[0])) {
+ if(mbedtls_ssl_conf_alpn_protocols(&BACKEND->config,
+ &BACKEND->protocols[0])) {
failf(data, "Failed setting ALPN protocols");
return CURLE_SSL_CONNECT_ERROR;
}
- for(p = &connssl->protocols[0]; *p; ++p)
+ for(p = &BACKEND->protocols[0]; *p; ++p)
infof(data, "ALPN, offering %s\n", *p);
}
#endif
#ifdef MBEDTLS_DEBUG
/* In order to make that work in mbedtls MBEDTLS_DEBUG_C must be defined. */
- mbedtls_ssl_conf_dbg(&connssl->config, mbed_debug, data);
+ mbedtls_ssl_conf_dbg(&BACKEND->config, mbed_debug, data);
/* - 0 No debug
* - 1 Error
* - 2 State change
@@ -502,7 +517,7 @@ mbed_connect_step1(struct connectdata *conn,
/* give application a chance to interfere with mbedTLS set up. */
if(data->set.ssl.fsslctx) {
- ret = (*data->set.ssl.fsslctx)(data, &connssl->config,
+ ret = (*data->set.ssl.fsslctx)(data, &BACKEND->config,
data->set.ssl.fsslctxp);
if(ret) {
failf(data, "error signaled by ssl ctx callback");
@@ -537,7 +552,7 @@ mbed_connect_step2(struct connectdata *conn,
conn->recv[sockindex] = mbed_recv;
conn->send[sockindex] = mbed_send;
- ret = mbedtls_ssl_handshake(&connssl->ssl);
+ ret = mbedtls_ssl_handshake(&BACKEND->ssl);
if(ret == MBEDTLS_ERR_SSL_WANT_READ) {
connssl->connecting_state = ssl_connect_2_reading;
@@ -557,10 +572,10 @@ mbed_connect_step2(struct connectdata *conn,
}
infof(data, "mbedTLS: Handshake complete, cipher is %s\n",
- mbedtls_ssl_get_ciphersuite(&conn->ssl[sockindex].ssl)
+ mbedtls_ssl_get_ciphersuite(&BACKEND->ssl)
);
- ret = mbedtls_ssl_get_verify_result(&conn->ssl[sockindex].ssl);
+ ret = mbedtls_ssl_get_verify_result(&BACKEND->ssl);
if(ret && SSL_CONN_CONFIG(verifypeer)) {
if(ret & MBEDTLS_X509_BADCERT_EXPIRED)
@@ -580,7 +595,7 @@ mbed_connect_step2(struct connectdata *conn,
return CURLE_PEER_FAILED_VERIFICATION;
}
- peercert = mbedtls_ssl_get_peer_cert(&connssl->ssl);
+ peercert = mbedtls_ssl_get_peer_cert(&BACKEND->ssl);
if(peercert && data->set.verbose) {
const size_t bufsize = 16384;
@@ -650,7 +665,7 @@ mbed_connect_step2(struct connectdata *conn,
#ifdef HAS_ALPN
if(conn->bits.tls_enable_alpn) {
- next_protocol = mbedtls_ssl_get_alpn_protocol(&connssl->ssl);
+ next_protocol = mbedtls_ssl_get_alpn_protocol(&BACKEND->ssl);
if(next_protocol) {
infof(data, "ALPN, server accepted to use %s\n", next_protocol);
@@ -700,7 +715,7 @@ mbed_connect_step3(struct connectdata *conn,
mbedtls_ssl_session_init(our_ssl_sessionid);
- ret = mbedtls_ssl_get_session(&connssl->ssl, our_ssl_sessionid);
+ ret = mbedtls_ssl_get_session(&BACKEND->ssl, our_ssl_sessionid);
if(ret) {
free(our_ssl_sessionid);
failf(data, "mbedtls_ssl_get_session returned -0x%x", -ret);
@@ -730,9 +745,10 @@ static ssize_t mbed_send(struct connectdata *conn, int sockindex,
const void *mem, size_t len,
CURLcode *curlcode)
{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
int ret = -1;
- ret = mbedtls_ssl_write(&conn->ssl[sockindex].ssl,
+ ret = mbedtls_ssl_write(&BACKEND->ssl,
(unsigned char *)mem, len);
if(ret < 0) {
@@ -744,22 +760,23 @@ static ssize_t mbed_send(struct connectdata *conn, int sockindex,
return ret;
}
-void Curl_mbedtls_close_all(struct Curl_easy *data)
+static void Curl_mbedtls_close_all(struct Curl_easy *data)
{
(void)data;
}
-void Curl_mbedtls_close(struct connectdata *conn, int sockindex)
+static void Curl_mbedtls_close(struct connectdata *conn, int sockindex)
{
- mbedtls_pk_free(&conn->ssl[sockindex].pk);
- mbedtls_x509_crt_free(&conn->ssl[sockindex].clicert);
- mbedtls_x509_crt_free(&conn->ssl[sockindex].cacert);
- mbedtls_x509_crl_free(&conn->ssl[sockindex].crl);
- mbedtls_ssl_config_free(&conn->ssl[sockindex].config);
- mbedtls_ssl_free(&conn->ssl[sockindex].ssl);
- mbedtls_ctr_drbg_free(&conn->ssl[sockindex].ctr_drbg);
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ mbedtls_pk_free(&BACKEND->pk);
+ mbedtls_x509_crt_free(&BACKEND->clicert);
+ mbedtls_x509_crt_free(&BACKEND->cacert);
+ mbedtls_x509_crl_free(&BACKEND->crl);
+ mbedtls_ssl_config_free(&BACKEND->config);
+ mbedtls_ssl_free(&BACKEND->ssl);
+ mbedtls_ctr_drbg_free(&BACKEND->ctr_drbg);
#ifndef THREADING_SUPPORT
- mbedtls_entropy_free(&conn->ssl[sockindex].entropy);
+ mbedtls_entropy_free(&BACKEND->entropy);
#endif /* THREADING_SUPPORT */
}
@@ -767,11 +784,12 @@ static ssize_t mbed_recv(struct connectdata *conn, int num,
char *buf, size_t buffersize,
CURLcode *curlcode)
{
+ struct ssl_connect_data *connssl = &conn->ssl[num];
int ret = -1;
ssize_t len = -1;
memset(buf, 0, buffersize);
- ret = mbedtls_ssl_read(&conn->ssl[num].ssl, (unsigned char *)buf,
+ ret = mbedtls_ssl_read(&BACKEND->ssl, (unsigned char *)buf,
buffersize);
if(ret <= 0) {
@@ -788,21 +806,21 @@ static ssize_t mbed_recv(struct connectdata *conn, int num,
return len;
}
-void Curl_mbedtls_session_free(void *ptr)
+static void Curl_mbedtls_session_free(void *ptr)
{
mbedtls_ssl_session_free(ptr);
free(ptr);
}
-size_t Curl_mbedtls_version(char *buffer, size_t size)
+static size_t Curl_mbedtls_version(char *buffer, size_t size)
{
unsigned int version = mbedtls_version_get_number();
return snprintf(buffer, size, "mbedTLS/%d.%d.%d", version>>24,
(version>>16)&0xff, (version>>8)&0xff);
}
-CURLcode Curl_mbedtls_random(struct Curl_easy *data, unsigned char *entropy,
- size_t length)
+static CURLcode Curl_mbedtls_random(struct Curl_easy *data,
+ unsigned char *entropy, size_t length)
{
#if defined(MBEDTLS_CTR_DRBG_C)
int ret = -1;
@@ -811,7 +829,7 @@ CURLcode Curl_mbedtls_random(struct Curl_easy *data, unsigned char *entropy,
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_entropy_init(&ctr_entropy);
mbedtls_ctr_drbg_init(&ctr_drbg);
- errorbuf[0]=0;
+ errorbuf[0] = 0;
ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func,
&ctr_entropy, NULL, 0);
@@ -869,7 +887,7 @@ mbed_connect_common(struct connectdata *conn,
return CURLE_OK;
}
- if(ssl_connect_1==connssl->connecting_state) {
+ if(ssl_connect_1 == connssl->connecting_state) {
/* Find out how much more time we're allowed */
timeout_ms = Curl_timeleft(data, NULL, TRUE);
@@ -900,9 +918,9 @@ mbed_connect_common(struct connectdata *conn,
if(connssl->connecting_state == ssl_connect_2_reading
|| connssl->connecting_state == ssl_connect_2_writing) {
- curl_socket_t writefd = ssl_connect_2_writing==
+ curl_socket_t writefd = ssl_connect_2_writing ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
- curl_socket_t readfd = ssl_connect_2_reading==
+ curl_socket_t readfd = ssl_connect_2_reading ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
@@ -942,13 +960,13 @@ mbed_connect_common(struct connectdata *conn,
} /* repeat step2 until all transactions are done. */
- if(ssl_connect_3==connssl->connecting_state) {
+ if(ssl_connect_3 == connssl->connecting_state) {
retcode = mbed_connect_step3(conn, sockindex);
if(retcode)
return retcode;
}
- if(ssl_connect_done==connssl->connecting_state) {
+ if(ssl_connect_done == connssl->connecting_state) {
connssl->state = ssl_connection_complete;
conn->recv[sockindex] = mbed_recv;
conn->send[sockindex] = mbed_send;
@@ -963,18 +981,14 @@ mbed_connect_common(struct connectdata *conn,
return CURLE_OK;
}
-CURLcode
-Curl_mbedtls_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done)
+static CURLcode Curl_mbedtls_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
return mbed_connect_common(conn, sockindex, TRUE, done);
}
-CURLcode
-Curl_mbedtls_connect(struct connectdata *conn,
- int sockindex)
+static CURLcode Curl_mbedtls_connect(struct connectdata *conn, int sockindex)
{
CURLcode retcode;
bool done = FALSE;
@@ -992,19 +1006,70 @@ Curl_mbedtls_connect(struct connectdata *conn,
* return 0 error initializing SSL
* return 1 SSL initialized successfully
*/
-int Curl_mbedtls_init(void)
+static int Curl_mbedtls_init(void)
{
return Curl_polarsslthreadlock_thread_setup();
}
-void Curl_mbedtls_cleanup(void)
+static void Curl_mbedtls_cleanup(void)
{
(void)Curl_polarsslthreadlock_thread_cleanup();
}
-int Curl_mbedtls_data_pending(const struct connectdata *conn, int sockindex)
+static bool Curl_mbedtls_data_pending(const struct connectdata *conn,
+ int sockindex)
{
- return mbedtls_ssl_get_bytes_avail(&conn->ssl[sockindex].ssl) != 0;
+ const struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ return mbedtls_ssl_get_bytes_avail(&BACKEND->ssl) != 0;
}
+static void Curl_mbedtls_sha256sum(const unsigned char *input,
+ size_t inputlen,
+ unsigned char *sha256sum,
+ size_t sha256len UNUSED_PARAM)
+{
+ (void)sha256len;
+ mbedtls_sha256(input, inputlen, sha256sum, 0);
+}
+
+static void *Curl_mbedtls_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ (void)info;
+ return &BACKEND->ssl;
+}
+
+const struct Curl_ssl Curl_ssl_mbedtls = {
+ { CURLSSLBACKEND_MBEDTLS, "mbedtls" }, /* info */
+
+ 1, /* have_ca_path */
+ 0, /* have_certinfo */
+ 1, /* have_pinnedpubkey */
+ 1, /* have_ssl_ctx */
+ 0, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_mbedtls_init, /* init */
+ Curl_mbedtls_cleanup, /* cleanup */
+ Curl_mbedtls_version, /* version */
+ Curl_none_check_cxn, /* check_cxn */
+ Curl_none_shutdown, /* shutdown */
+ Curl_mbedtls_data_pending, /* data_pending */
+ Curl_mbedtls_random, /* random */
+ Curl_none_cert_status_request, /* cert_status_request */
+ Curl_mbedtls_connect, /* connect */
+ Curl_mbedtls_connect_nonblocking, /* connect_nonblocking */
+ Curl_mbedtls_get_internals, /* get_internals */
+ Curl_mbedtls_close, /* close_one */
+ Curl_mbedtls_close_all, /* close_all */
+ Curl_mbedtls_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_none_false_start, /* false_start */
+ Curl_none_md5sum, /* md5sum */
+ Curl_mbedtls_sha256sum /* sha256sum */
+};
+
#endif /* USE_MBEDTLS */
diff --git a/lib/vtls/mbedtls.h b/lib/vtls/mbedtls.h
index 71d17a4..4a93860 100644
--- a/lib/vtls/mbedtls.h
+++ b/lib/vtls/mbedtls.h
@@ -26,57 +26,7 @@
#ifdef USE_MBEDTLS
-#include <mbedtls/sha256.h>
-
-/* Called on first use mbedTLS, setup threading if supported */
-int Curl_mbedtls_init(void);
-void Curl_mbedtls_cleanup(void);
-int Curl_mbedtls_data_pending(const struct connectdata *conn, int sockindex);
-
-CURLcode Curl_mbedtls_connect(struct connectdata *conn, int sockindex);
-
-CURLcode Curl_mbedtls_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done);
-
-/* tell mbedTLS to close down all open information regarding connections (and
- thus session ID caching etc) */
-void Curl_mbedtls_close_all(struct Curl_easy *data);
-
- /* close a SSL connection */
-void Curl_mbedtls_close(struct connectdata *conn, int sockindex);
-
-void Curl_mbedtls_session_free(void *ptr);
-size_t Curl_mbedtls_version(char *buffer, size_t size);
-int Curl_mbedtls_shutdown(struct connectdata *conn, int sockindex);
-
-CURLcode Curl_mbedtls_random(struct Curl_easy *data, unsigned char *entropy,
- size_t length);
-
-/* this backends supports CURLOPT_PINNEDPUBLICKEY */
-#define have_curlssl_pinnedpubkey 1
-
-/* this backend supports CURLOPT_SSL_CTX_* */
-#define have_curlssl_ssl_ctx 1
-
-/* API setup for mbedTLS */
-#define curlssl_init() Curl_mbedtls_init()
-#define curlssl_cleanup() Curl_mbedtls_cleanup()
-#define curlssl_connect Curl_mbedtls_connect
-#define curlssl_connect_nonblocking Curl_mbedtls_connect_nonblocking
-#define curlssl_session_free(x) Curl_mbedtls_session_free(x)
-#define curlssl_close_all Curl_mbedtls_close_all
-#define curlssl_close Curl_mbedtls_close
-#define curlssl_shutdown(x,y) 0
-#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_NOT_BUILT_IN)
-#define curlssl_set_engine_default(x) (x=x, CURLE_NOT_BUILT_IN)
-#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL)
-#define curlssl_version Curl_mbedtls_version
-#define curlssl_check_cxn(x) (x=x, -1)
-#define curlssl_data_pending(x,y) Curl_mbedtls_data_pending(x, y)
-#define CURL_SSL_BACKEND CURLSSLBACKEND_MBEDTLS
-#define curlssl_sha256sum(a,b,c,d) mbedtls_sha256(a,b,c,0)
-#define curlssl_random(x,y,z) Curl_mbedtls_random(x, y, z)
+extern const struct Curl_ssl Curl_ssl_mbedtls;
#endif /* USE_MBEDTLS */
#endif /* HEADER_CURL_MBEDTLS_H */
diff --git a/lib/vtls/nss.c b/lib/vtls/nss.c
index d1711d6..a3ef37a 100644
--- a/lib/vtls/nss.c
+++ b/lib/vtls/nss.c
@@ -78,6 +78,16 @@
/* enough to fit the string "PEM Token #[0|1]" */
#define SLOTSIZE 13
+struct ssl_backend_data {
+ PRFileDesc *handle;
+ char *client_nickname;
+ struct Curl_easy *data;
+ struct curl_llist obj_list;
+ PK11GenericObject *obj_clicert;
+};
+
+#define BACKEND connssl->backend
+
static PRLock *nss_initlock = NULL;
static PRLock *nss_crllock = NULL;
static PRLock *nss_findslot_lock = NULL;
@@ -271,7 +281,7 @@ static SECStatus set_ciphers(struct Curl_easy *data, PRFileDesc * model,
found = PR_FALSE;
- for(i=0; i<NUM_OF_CIPHERS; i++) {
+ for(i = 0; i<NUM_OF_CIPHERS; i++) {
if(strcasecompare(cipher, cipherlist[i].name)) {
cipher_state[i] = PR_TRUE;
found = PR_TRUE;
@@ -290,7 +300,7 @@ static SECStatus set_ciphers(struct Curl_easy *data, PRFileDesc * model,
}
/* Finally actually enable the selected ciphers */
- for(i=0; i<NUM_OF_CIPHERS; i++) {
+ for(i = 0; i<NUM_OF_CIPHERS; i++) {
if(!cipher_state[i])
continue;
@@ -311,7 +321,7 @@ static bool any_cipher_enabled(void)
{
unsigned int i;
- for(i=0; i<NUM_OF_CIPHERS; i++) {
+ for(i = 0; i<NUM_OF_CIPHERS; i++) {
PRInt32 policy = 0;
SSL_CipherPolicyGet(cipherlist[i].num, &policy);
if(policy)
@@ -396,7 +406,7 @@ static CURLcode insert_wrapped_ptr(struct curl_llist *list, void *ptr)
/* Call PK11_CreateGenericObject() with the given obj_class and filename. If
* the call succeeds, append the object handle to the list of objects so that
* the object can be destroyed in Curl_nss_close(). */
-static CURLcode nss_create_object(struct ssl_connect_data *ssl,
+static CURLcode nss_create_object(struct ssl_connect_data *connssl,
CK_OBJECT_CLASS obj_class,
const char *filename, bool cacert)
{
@@ -435,14 +445,14 @@ static CURLcode nss_create_object(struct ssl_connect_data *ssl,
if(!obj)
return result;
- if(insert_wrapped_ptr(&ssl->obj_list, obj) != CURLE_OK) {
+ if(insert_wrapped_ptr(&BACKEND->obj_list, obj) != CURLE_OK) {
PK11_DestroyGenericObject(obj);
return CURLE_OUT_OF_MEMORY;
}
if(!cacert && CKO_CERTIFICATE == obj_class)
/* store reference to a client certificate */
- ssl->obj_clicert = obj;
+ BACKEND->obj_clicert = obj;
return CURLE_OK;
}
@@ -992,7 +1002,7 @@ static SECStatus check_issuer_cert(PRFileDesc *sock,
char *issuer_nickname)
{
CERTCertificate *cert, *cert_issuer, *issuer;
- SECStatus res=SECSuccess;
+ SECStatus res = SECSuccess;
void *proto_win = NULL;
cert = SSL_PeerCertificate(sock);
@@ -1004,7 +1014,7 @@ static SECStatus check_issuer_cert(PRFileDesc *sock,
if((!cert_issuer) || (!issuer))
res = SECFailure;
else if(SECITEM_CompareItem(&cert_issuer->derCert,
- &issuer->derCert)!=SECEqual)
+ &issuer->derCert) != SECEqual)
res = SECFailure;
CERT_DestroyCertificate(cert);
@@ -1017,7 +1027,7 @@ static CURLcode cmp_peer_pubkey(struct ssl_connect_data *connssl,
const char *pinnedpubkey)
{
CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
- struct Curl_easy *data = connssl->data;
+ struct Curl_easy *data = BACKEND->data;
CERTCertificate *cert;
if(!pinnedpubkey)
@@ -1025,7 +1035,7 @@ static CURLcode cmp_peer_pubkey(struct ssl_connect_data *connssl,
return CURLE_OK;
/* get peer certificate */
- cert = SSL_PeerCertificate(connssl->handle);
+ cert = SSL_PeerCertificate(BACKEND->handle);
if(cert) {
/* extract public key from peer certificate */
SECKEYPublicKey *pubkey = CERT_ExtractPublicKey(cert);
@@ -1069,11 +1079,11 @@ static SECStatus SelectClientCert(void *arg, PRFileDesc *sock,
struct SECKEYPrivateKeyStr **pRetKey)
{
struct ssl_connect_data *connssl = (struct ssl_connect_data *)arg;
- struct Curl_easy *data = connssl->data;
- const char *nickname = connssl->client_nickname;
+ struct Curl_easy *data = BACKEND->data;
+ const char *nickname = BACKEND->client_nickname;
static const char pem_slotname[] = "PEM Token #1";
- if(connssl->obj_clicert) {
+ if(BACKEND->obj_clicert) {
/* use the cert/key provided by PEM reader */
SECItem cert_der = { 0, NULL, 0 };
void *proto_win = SSL_RevealPinArg(sock);
@@ -1086,7 +1096,7 @@ static SECStatus SelectClientCert(void *arg, PRFileDesc *sock,
return SECFailure;
}
- if(PK11_ReadRawAttribute(PK11_TypeGeneric, connssl->obj_clicert, CKA_VALUE,
+ if(PK11_ReadRawAttribute(PK11_TypeGeneric, BACKEND->obj_clicert, CKA_VALUE,
&cert_der) != SECSuccess) {
failf(data, "NSS: CKA_VALUE not found in PK11 generic object");
PK11_FreeSlot(slot);
@@ -1351,7 +1361,7 @@ static CURLcode nss_init(struct Curl_easy *data)
* @retval 0 error initializing SSL
* @retval 1 SSL initialized successfully
*/
-int Curl_nss_init(void)
+static int Curl_nss_init(void)
{
/* curl_global_init() is not thread-safe so this test is ok */
if(nss_initlock == NULL) {
@@ -1386,7 +1396,7 @@ CURLcode Curl_nss_force_init(struct Curl_easy *data)
}
/* Global cleanup */
-void Curl_nss_cleanup(void)
+static void Curl_nss_cleanup(void)
{
/* This function isn't required to be threadsafe and this is only done
* as a safety feature.
@@ -1426,14 +1436,14 @@ void Curl_nss_cleanup(void)
* 0 means the connection has been closed
* -1 means the connection status is unknown
*/
-int
-Curl_nss_check_cxn(struct connectdata *conn)
+static int Curl_nss_check_cxn(struct connectdata *conn)
{
+ struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];
int rc;
char buf;
rc =
- PR_Recv(conn->ssl[FIRSTSOCKET].handle, (void *)&buf, 1, PR_MSG_PEEK,
+ PR_Recv(BACKEND->handle, (void *)&buf, 1, PR_MSG_PEEK,
PR_SecondsToInterval(1));
if(rc > 0)
return 1; /* connection still in place */
@@ -1447,48 +1457,49 @@ Curl_nss_check_cxn(struct connectdata *conn)
static void nss_close(struct ssl_connect_data *connssl)
{
/* before the cleanup, check whether we are using a client certificate */
- const bool client_cert = (connssl->client_nickname != NULL)
- || (connssl->obj_clicert != NULL);
+ const bool client_cert = (BACKEND->client_nickname != NULL)
+ || (BACKEND->obj_clicert != NULL);
- free(connssl->client_nickname);
- connssl->client_nickname = NULL;
+ free(BACKEND->client_nickname);
+ BACKEND->client_nickname = NULL;
/* destroy all NSS objects in order to avoid failure of NSS shutdown */
- Curl_llist_destroy(&connssl->obj_list, NULL);
- connssl->obj_clicert = NULL;
+ Curl_llist_destroy(&BACKEND->obj_list, NULL);
+ BACKEND->obj_clicert = NULL;
- if(connssl->handle) {
+ if(BACKEND->handle) {
if(client_cert)
/* A server might require different authentication based on the
* particular path being requested by the client. To support this
* scenario, we must ensure that a connection will never reuse the
* authentication data from a previous connection. */
- SSL_InvalidateSession(connssl->handle);
+ SSL_InvalidateSession(BACKEND->handle);
- PR_Close(connssl->handle);
- connssl->handle = NULL;
+ PR_Close(BACKEND->handle);
+ BACKEND->handle = NULL;
}
}
/*
* This function is called when an SSL connection is closed.
*/
-void Curl_nss_close(struct connectdata *conn, int sockindex)
+static void Curl_nss_close(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
struct ssl_connect_data *connssl_proxy = &conn->proxy_ssl[sockindex];
- if(connssl->handle || connssl_proxy->handle) {
+ if(BACKEND->handle || connssl_proxy->backend->handle) {
/* NSS closes the socket we previously handed to it, so we must mark it
as closed to avoid double close */
fake_sclose(conn->sock[sockindex]);
conn->sock[sockindex] = CURL_SOCKET_BAD;
}
- if(connssl->handle)
- /* nss_close(connssl) will transitively close also connssl_proxy->handle
- if both are used. Clear it to avoid a double close leading to crash. */
- connssl_proxy->handle = NULL;
+ if(BACKEND->handle)
+ /* nss_close(connssl) will transitively close also
+ connssl_proxy->backend->handle if both are used. Clear it to avoid
+ a double close leading to crash. */
+ connssl_proxy->backend->handle = NULL;
nss_close(connssl);
nss_close(connssl_proxy);
@@ -1732,7 +1743,7 @@ static CURLcode nss_fail_connect(struct ssl_connect_data *connssl,
}
/* cleanup on connection failure */
- Curl_llist_destroy(&connssl->obj_list, NULL);
+ Curl_llist_destroy(&BACKEND->obj_list, NULL);
return curlerr;
}
@@ -1746,7 +1757,7 @@ static CURLcode nss_set_blocking(struct ssl_connect_data *connssl,
sock_opt.option = PR_SockOpt_Nonblocking;
sock_opt.value.non_blocking = !blocking;
- if(PR_SetSocketOption(connssl->handle, &sock_opt) != PR_SUCCESS)
+ if(PR_SetSocketOption(BACKEND->handle, &sock_opt) != PR_SUCCESS)
return nss_fail_connect(connssl, data, CURLE_SSL_CONNECT_ERROR);
return CURLE_OK;
@@ -1770,10 +1781,10 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
SSL_LIBRARY_VERSION_TLS_1_0 /* max */
};
- connssl->data = data;
+ BACKEND->data = data;
/* list of all NSS objects we need to destroy in Curl_nss_close() */
- Curl_llist_init(&connssl->obj_list, nss_destroy_object);
+ Curl_llist_init(&BACKEND->obj_list, nss_destroy_object);
/* FIXME. NSS doesn't support multiple databases open at the same time. */
PR_Lock(nss_initlock);
@@ -1882,7 +1893,7 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
char *nickname = dup_nickname(data, SSL_SET_OPTION(cert));
if(nickname) {
/* we are not going to use libnsspem.so to read the client cert */
- connssl->obj_clicert = NULL;
+ BACKEND->obj_clicert = NULL;
}
else {
CURLcode rv = cert_stuff(conn, sockindex, SSL_SET_OPTION(cert),
@@ -1895,10 +1906,10 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
}
/* store the nickname for SelectClientCert() called during handshake */
- connssl->client_nickname = nickname;
+ BACKEND->client_nickname = nickname;
}
else
- connssl->client_nickname = NULL;
+ BACKEND->client_nickname = NULL;
if(SSL_GetClientAuthDataHook(model, SelectClientCert,
(void *)connssl) != SECSuccess) {
@@ -1908,8 +1919,8 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
if(conn->proxy_ssl[sockindex].use) {
DEBUGASSERT(ssl_connection_complete == conn->proxy_ssl[sockindex].state);
- DEBUGASSERT(conn->proxy_ssl[sockindex].handle != NULL);
- nspr_io = conn->proxy_ssl[sockindex].handle;
+ DEBUGASSERT(conn->proxy_ssl[sockindex].backend->handle != NULL);
+ nspr_io = conn->proxy_ssl[sockindex].backend->handle;
second_layer = TRUE;
}
else {
@@ -1939,8 +1950,8 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
}
/* import our model socket onto the current I/O stack */
- connssl->handle = SSL_ImportFD(model, nspr_io);
- if(!connssl->handle) {
+ BACKEND->handle = SSL_ImportFD(model, nspr_io);
+ if(!BACKEND->handle) {
if(!second_layer)
PR_Close(nspr_io);
goto error;
@@ -1951,36 +1962,36 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
/* This is the password associated with the cert that we're using */
if(SSL_SET_OPTION(key_passwd)) {
- SSL_SetPKCS11PinArg(connssl->handle, SSL_SET_OPTION(key_passwd));
+ SSL_SetPKCS11PinArg(BACKEND->handle, SSL_SET_OPTION(key_passwd));
}
#ifdef SSL_ENABLE_OCSP_STAPLING
if(SSL_CONN_CONFIG(verifystatus)) {
- if(SSL_OptionSet(connssl->handle, SSL_ENABLE_OCSP_STAPLING, PR_TRUE)
+ if(SSL_OptionSet(BACKEND->handle, SSL_ENABLE_OCSP_STAPLING, PR_TRUE)
!= SECSuccess)
goto error;
}
#endif
#ifdef SSL_ENABLE_NPN
- if(SSL_OptionSet(connssl->handle, SSL_ENABLE_NPN, conn->bits.tls_enable_npn
+ if(SSL_OptionSet(BACKEND->handle, SSL_ENABLE_NPN, conn->bits.tls_enable_npn
? PR_TRUE : PR_FALSE) != SECSuccess)
goto error;
#endif
#ifdef SSL_ENABLE_ALPN
- if(SSL_OptionSet(connssl->handle, SSL_ENABLE_ALPN, conn->bits.tls_enable_alpn
+ if(SSL_OptionSet(BACKEND->handle, SSL_ENABLE_ALPN, conn->bits.tls_enable_alpn
? PR_TRUE : PR_FALSE) != SECSuccess)
goto error;
#endif
#if NSSVERNUM >= 0x030f04 /* 3.15.4 */
if(data->set.ssl.falsestart) {
- if(SSL_OptionSet(connssl->handle, SSL_ENABLE_FALSE_START, PR_TRUE)
+ if(SSL_OptionSet(BACKEND->handle, SSL_ENABLE_FALSE_START, PR_TRUE)
!= SECSuccess)
goto error;
- if(SSL_SetCanFalseStartCallback(connssl->handle, CanFalseStartCallback,
+ if(SSL_SetCanFalseStartCallback(BACKEND->handle, CanFalseStartCallback,
conn) != SECSuccess)
goto error;
}
@@ -2004,24 +2015,24 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
memcpy(&protocols[cur], ALPN_HTTP_1_1, ALPN_HTTP_1_1_LENGTH);
cur += ALPN_HTTP_1_1_LENGTH;
- if(SSL_SetNextProtoNego(connssl->handle, protocols, cur) != SECSuccess)
+ if(SSL_SetNextProtoNego(BACKEND->handle, protocols, cur) != SECSuccess)
goto error;
}
#endif
/* Force handshake on next I/O */
- if(SSL_ResetHandshake(connssl->handle, /* asServer */ PR_FALSE)
+ if(SSL_ResetHandshake(BACKEND->handle, /* asServer */ PR_FALSE)
!= SECSuccess)
goto error;
/* propagate hostname to the TLS layer */
- if(SSL_SetURL(connssl->handle, SSL_IS_PROXY() ? conn->http_proxy.host.name :
+ if(SSL_SetURL(BACKEND->handle, SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name) != SECSuccess)
goto error;
/* prevent NSS from re-using the session for a different hostname */
- if(SSL_SetSockPeerID(connssl->handle, SSL_IS_PROXY() ?
+ if(SSL_SetSockPeerID(BACKEND->handle, SSL_IS_PROXY() ?
conn->http_proxy.host.name : conn->host.name)
!= SECSuccess)
goto error;
@@ -2058,7 +2069,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
/* Force the handshake now */
timeout = PR_MillisecondsToInterval((PRUint32) time_left);
- if(SSL_ForceHandshakeWithTimeout(connssl->handle, timeout) != SECSuccess) {
+ if(SSL_ForceHandshakeWithTimeout(BACKEND->handle, timeout) != SECSuccess) {
if(PR_GetError() == PR_WOULD_BLOCK_ERROR)
/* blocking direction is updated by nss_update_connecting_state() */
return CURLE_AGAIN;
@@ -2069,7 +2080,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
goto error;
}
- result = display_conn_info(conn, connssl->handle);
+ result = display_conn_info(conn, BACKEND->handle);
if(result)
goto error;
@@ -2078,7 +2089,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
char *nickname = dup_nickname(data, SSL_SET_OPTION(issuercert));
if(nickname) {
/* we support only nicknames in case of issuercert for now */
- ret = check_issuer_cert(connssl->handle, nickname);
+ ret = check_issuer_cert(BACKEND->handle, nickname);
free(nickname);
}
@@ -2164,13 +2175,13 @@ static CURLcode nss_connect_common(struct connectdata *conn, int sockindex,
return CURLE_OK;
}
-CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex)
+static CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex)
{
return nss_connect_common(conn, sockindex, /* blocking */ NULL);
}
-CURLcode Curl_nss_connect_nonblocking(struct connectdata *conn,
- int sockindex, bool *done)
+static CURLcode Curl_nss_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
return nss_connect_common(conn, sockindex, done);
}
@@ -2186,9 +2197,9 @@ static ssize_t nss_send(struct connectdata *conn, /* connection data */
/* The SelectClientCert() hook uses this for infof() and failf() but the
handle stored in nss_setup_connect() could have already been freed. */
- connssl->data = conn->data;
+ BACKEND->data = conn->data;
- rc = PR_Send(connssl->handle, mem, (int)len, 0, PR_INTERVAL_NO_WAIT);
+ rc = PR_Send(BACKEND->handle, mem, (int)len, 0, PR_INTERVAL_NO_WAIT);
if(rc < 0) {
PRInt32 err = PR_GetError();
if(err == PR_WOULD_BLOCK_ERROR)
@@ -2223,9 +2234,9 @@ static ssize_t nss_recv(struct connectdata *conn, /* connection data */
/* The SelectClientCert() hook uses this for infof() and failf() but the
handle stored in nss_setup_connect() could have already been freed. */
- connssl->data = conn->data;
+ BACKEND->data = conn->data;
- nread = PR_Recv(connssl->handle, buf, (int)buffersize, 0,
+ nread = PR_Recv(BACKEND->handle, buf, (int)buffersize, 0,
PR_INTERVAL_NO_WAIT);
if(nread < 0) {
/* failed SSL read */
@@ -2252,22 +2263,22 @@ static ssize_t nss_recv(struct connectdata *conn, /* connection data */
return nread;
}
-size_t Curl_nss_version(char *buffer, size_t size)
+static size_t Curl_nss_version(char *buffer, size_t size)
{
return snprintf(buffer, size, "NSS/%s", NSS_VERSION);
}
/* data might be NULL */
-int Curl_nss_seed(struct Curl_easy *data)
+static int Curl_nss_seed(struct Curl_easy *data)
{
/* make sure that NSS is initialized */
return !!Curl_nss_force_init(data);
}
/* data might be NULL */
-CURLcode Curl_nss_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length)
+static CURLcode Curl_nss_random(struct Curl_easy *data,
+ unsigned char *entropy,
+ size_t length)
{
Curl_nss_seed(data); /* Initiate the seed if not already done */
@@ -2278,10 +2289,10 @@ CURLcode Curl_nss_random(struct Curl_easy *data,
return CURLE_OK;
}
-void Curl_nss_md5sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *md5sum, /* output */
- size_t md5len)
+static CURLcode Curl_nss_md5sum(unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *md5sum, /* output */
+ size_t md5len)
{
PK11Context *MD5pw = PK11_CreateDigestContext(SEC_OID_MD5);
unsigned int MD5out;
@@ -2289,12 +2300,14 @@ void Curl_nss_md5sum(unsigned char *tmp, /* input */
PK11_DigestOp(MD5pw, tmp, curlx_uztoui(tmplen));
PK11_DigestFinal(MD5pw, md5sum, &MD5out, curlx_uztoui(md5len));
PK11_DestroyContext(MD5pw, PR_TRUE);
+
+ return CURLE_OK;
}
-void Curl_nss_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum, /* output */
- size_t sha256len)
+static void Curl_nss_sha256sum(const unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *sha256sum, /* output */
+ size_t sha256len)
{
PK11Context *SHA256pw = PK11_CreateDigestContext(SEC_OID_SHA256);
unsigned int SHA256out;
@@ -2304,7 +2317,7 @@ void Curl_nss_sha256sum(const unsigned char *tmp, /* input */
PK11_DestroyContext(SHA256pw, PR_TRUE);
}
-bool Curl_nss_cert_status_request(void)
+static bool Curl_nss_cert_status_request(void)
{
#ifdef SSL_ENABLE_OCSP_STAPLING
return TRUE;
@@ -2313,7 +2326,7 @@ bool Curl_nss_cert_status_request(void)
#endif
}
-bool Curl_nss_false_start(void)
+static bool Curl_nss_false_start(void)
{
#if NSSVERNUM >= 0x030f04 /* 3.15.4 */
return TRUE;
@@ -2322,4 +2335,46 @@ bool Curl_nss_false_start(void)
#endif
}
+static void *Curl_nss_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ (void)info;
+ return BACKEND->handle;
+}
+
+const struct Curl_ssl Curl_ssl_nss = {
+ { CURLSSLBACKEND_NSS, "nss" }, /* info */
+
+ 1, /* have_ca_path */
+ 1, /* have_certinfo */
+ 1, /* have_pinnedpubkey */
+ 0, /* have_ssl_ctx */
+ 1, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_nss_init, /* init */
+ Curl_nss_cleanup, /* cleanup */
+ Curl_nss_version, /* version */
+ Curl_nss_check_cxn, /* check_cxn */
+ /* NSS has no shutdown function provided and thus always fail */
+ Curl_none_shutdown, /* shutdown */
+ Curl_none_data_pending, /* data_pending */
+ Curl_nss_random, /* random */
+ Curl_nss_cert_status_request, /* cert_status_request */
+ Curl_nss_connect, /* connect */
+ Curl_nss_connect_nonblocking, /* connect_nonblocking */
+ Curl_nss_get_internals, /* get_internals */
+ Curl_nss_close, /* close_one */
+ Curl_none_close_all, /* close_all */
+ /* NSS has its own session ID cache */
+ Curl_none_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_nss_false_start, /* false_start */
+ Curl_nss_md5sum, /* md5sum */
+ Curl_nss_sha256sum /* sha256sum */
+};
+
#endif /* USE_NSS */
diff --git a/lib/vtls/nssg.h b/lib/vtls/nssg.h
index 8c46929..41e51b0 100644
--- a/lib/vtls/nssg.h
+++ b/lib/vtls/nssg.h
@@ -30,79 +30,10 @@
#include "urldata.h"
-CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex);
-CURLcode Curl_nss_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done);
-/* close a SSL connection */
-void Curl_nss_close(struct connectdata *conn, int sockindex);
-
-int Curl_nss_init(void);
-void Curl_nss_cleanup(void);
-
-size_t Curl_nss_version(char *buffer, size_t size);
-int Curl_nss_check_cxn(struct connectdata *cxn);
-int Curl_nss_seed(struct Curl_easy *data);
-
/* initialize NSS library if not already */
CURLcode Curl_nss_force_init(struct Curl_easy *data);
-CURLcode Curl_nss_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length);
-
-void Curl_nss_md5sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *md5sum, /* output */
- size_t md5len);
-
-void Curl_nss_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum, /* output */
- size_t sha256len);
-
-bool Curl_nss_cert_status_request(void);
-
-bool Curl_nss_false_start(void);
-
-/* Support HTTPS-proxy */
-#define HTTPS_PROXY_SUPPORT 1
-
-/* Set the API backend definition to NSS */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_NSS
-
-/* this backend supports the CAPATH option */
-#define have_curlssl_ca_path 1
-
-/* this backend supports CURLOPT_CERTINFO */
-#define have_curlssl_certinfo 1
-
-/* this backends supports CURLOPT_PINNEDPUBLICKEY */
-#define have_curlssl_pinnedpubkey 1
-
-/* API setup for NSS */
-#define curlssl_init Curl_nss_init
-#define curlssl_cleanup Curl_nss_cleanup
-#define curlssl_connect Curl_nss_connect
-#define curlssl_connect_nonblocking Curl_nss_connect_nonblocking
-
-/* NSS has its own session ID cache */
-#define curlssl_session_free(x) Curl_nop_stmt
-#define curlssl_close_all(x) ((void)x)
-#define curlssl_close Curl_nss_close
-/* NSS has no shutdown function provided and thus always fail */
-#define curlssl_shutdown(x,y) ((void)x, (void)y, 1)
-#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN)
-#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN)
-#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL)
-#define curlssl_version Curl_nss_version
-#define curlssl_check_cxn(x) Curl_nss_check_cxn(x)
-#define curlssl_data_pending(x,y) ((void)x, (void)y, 0)
-#define curlssl_random(x,y,z) Curl_nss_random(x,y,z)
-#define curlssl_md5sum(a,b,c,d) Curl_nss_md5sum(a,b,c,d)
-#define curlssl_sha256sum(a,b,c,d) Curl_nss_sha256sum(a,b,c,d)
-#define curlssl_cert_status_request() Curl_nss_cert_status_request()
-#define curlssl_false_start() Curl_nss_false_start()
+extern const struct Curl_ssl Curl_ssl_nss;
#endif /* USE_NSS */
#endif /* HEADER_CURL_NSSG_H */
diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c
index 8c1d5a8..7b04edf 100644
--- a/lib/vtls/openssl.c
+++ b/lib/vtls/openssl.c
@@ -51,8 +51,10 @@
#include "strcase.h"
#include "hostcheck.h"
#include "curl_printf.h"
-
#include <openssl/ssl.h>
+#ifdef HAVE_OPENSSL_ENGINE_H
+#include <openssl/engine.h>
+#endif
#include <openssl/rand.h>
#include <openssl/x509v3.h>
#ifndef OPENSSL_NO_DSA
@@ -64,8 +66,12 @@
#include <openssl/conf.h>
#include <openssl/bn.h>
#include <openssl/rsa.h>
+#include <openssl/bio.h>
+#include <openssl/buffer.h>
-#ifdef HAVE_OPENSSL_PKCS12_H
+#ifndef OPENSSL_IS_BORINGSSL
+/* BoringSSL does not support PKCS12 */
+#define HAVE_PKCS12_SUPPORT 1
#include <openssl/pkcs12.h>
#endif
@@ -144,6 +150,19 @@ static unsigned long OpenSSL_version_num(void)
#define OPENSSL_load_builtin_modules(x)
#endif
+/*
+ * Whether SSL_CTX_set_keylog_callback is available.
+ * OpenSSL: supported since 1.1.1 https://github.com/openssl/openssl/pull/2287
+ * BoringSSL: supported since d28f59c27bac (committed 2015-11-19)
+ * LibreSSL: unsupported in at least 2.5.1 (explicitly check for it since it
+ * lies and pretends to be OpenSSL 2.0.0).
+ */
+#if (OPENSSL_VERSION_NUMBER >= 0x10101000L && \
+ !defined(LIBRESSL_VERSION_NUMBER)) || \
+ defined(OPENSSL_IS_BORINGSSL)
+#define HAVE_KEYLOG_CALLBACK
+#endif
+
#if defined(LIBRESSL_VERSION_NUMBER)
#define OSSL_PACKAGE "LibreSSL"
#elif defined(OPENSSL_IS_BORINGSSL)
@@ -152,6 +171,38 @@ static unsigned long OpenSSL_version_num(void)
#define OSSL_PACKAGE "OpenSSL"
#endif
+#if (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+/* up2date versions of OpenSSL maintain the default reasonably secure without
+ * breaking compatibility, so it is better not to override the default by curl
+ */
+#define DEFAULT_CIPHER_SELECTION NULL
+#else
+/* ... but it is not the case with old versions of OpenSSL */
+#define DEFAULT_CIPHER_SELECTION \
+ "ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH"
+#endif
+
+#ifdef ENABLE_SSLKEYLOGFILE
+typedef struct ssl_tap_state {
+ int master_key_length;
+ unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
+ unsigned char client_random[SSL3_RANDOM_SIZE];
+} ssl_tap_state_t;
+#endif /* ENABLE_SSLKEYLOGFILE */
+
+struct ssl_backend_data {
+ /* these ones requires specific SSL-types */
+ SSL_CTX* ctx;
+ SSL* handle;
+ X509* server_cert;
+#ifdef ENABLE_SSLKEYLOGFILE
+ /* tap_state holds the last seen master key if we're logging them */
+ ssl_tap_state_t tap_state;
+#endif
+};
+
+#define BACKEND connssl->backend
+
/*
* Number of bytes to read from the random number seed file. This must be
* a finite value (because some entropy "files" like /dev/urandom have
@@ -160,6 +211,112 @@ static unsigned long OpenSSL_version_num(void)
*/
#define RAND_LOAD_LENGTH 1024
+#ifdef ENABLE_SSLKEYLOGFILE
+/* The fp for the open SSLKEYLOGFILE, or NULL if not open */
+static FILE *keylog_file_fp;
+
+#ifdef HAVE_KEYLOG_CALLBACK
+static void ossl_keylog_callback(const SSL *ssl, const char *line)
+{
+ (void)ssl;
+
+ /* Using fputs here instead of fprintf since libcurl's fprintf replacement
+ may not be thread-safe. */
+ if(keylog_file_fp && line && *line) {
+ char stackbuf[256];
+ char *buf;
+ size_t linelen = strlen(line);
+
+ if(linelen <= sizeof(stackbuf) - 2)
+ buf = stackbuf;
+ else {
+ buf = malloc(linelen + 2);
+ if(!buf)
+ return;
+ }
+ strncpy(buf, line, linelen);
+ buf[linelen] = '\n';
+ buf[linelen + 1] = '\0';
+
+ fputs(buf, keylog_file_fp);
+ if(buf != stackbuf)
+ free(buf);
+ }
+}
+#else
+#define KEYLOG_PREFIX "CLIENT_RANDOM "
+#define KEYLOG_PREFIX_LEN (sizeof(KEYLOG_PREFIX) - 1)
+/*
+ * tap_ssl_key is called by libcurl to make the CLIENT_RANDOMs if the OpenSSL
+ * being used doesn't have native support for doing that.
+ */
+static void tap_ssl_key(const SSL *ssl, ssl_tap_state_t *state)
+{
+ const char *hex = "0123456789ABCDEF";
+ int pos, i;
+ char line[KEYLOG_PREFIX_LEN + 2 * SSL3_RANDOM_SIZE + 1 +
+ 2 * SSL_MAX_MASTER_KEY_LENGTH + 1 + 1];
+ const SSL_SESSION *session = SSL_get_session(ssl);
+ unsigned char client_random[SSL3_RANDOM_SIZE];
+ unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
+ int master_key_length = 0;
+
+ if(!session || !keylog_file_fp)
+ return;
+
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ /* ssl->s3 is not checked in openssl 1.1.0-pre6, but let's assume that
+ * we have a valid SSL context if we have a non-NULL session. */
+ SSL_get_client_random(ssl, client_random, SSL3_RANDOM_SIZE);
+ master_key_length =
+ SSL_SESSION_get_master_key(session, master_key, SSL_MAX_MASTER_KEY_LENGTH);
+#else
+ if(ssl->s3 && session->master_key_length > 0) {
+ master_key_length = session->master_key_length;
+ memcpy(master_key, session->master_key, session->master_key_length);
+ memcpy(client_random, ssl->s3->client_random, SSL3_RANDOM_SIZE);
+ }
+#endif
+
+ if(master_key_length <= 0)
+ return;
+
+ /* Skip writing keys if there is no key or it did not change. */
+ if(state->master_key_length == master_key_length &&
+ !memcmp(state->master_key, master_key, master_key_length) &&
+ !memcmp(state->client_random, client_random, SSL3_RANDOM_SIZE)) {
+ return;
+ }
+
+ state->master_key_length = master_key_length;
+ memcpy(state->master_key, master_key, master_key_length);
+ memcpy(state->client_random, client_random, SSL3_RANDOM_SIZE);
+
+ memcpy(line, KEYLOG_PREFIX, KEYLOG_PREFIX_LEN);
+ pos = KEYLOG_PREFIX_LEN;
+
+ /* Client Random for SSLv3/TLS */
+ for(i = 0; i < SSL3_RANDOM_SIZE; i++) {
+ line[pos++] = hex[client_random[i] >> 4];
+ line[pos++] = hex[client_random[i] & 0xF];
+ }
+ line[pos++] = ' ';
+
+ /* Master Secret (size is at most SSL_MAX_MASTER_KEY_LENGTH) */
+ for(i = 0; i < master_key_length; i++) {
+ line[pos++] = hex[master_key[i] >> 4];
+ line[pos++] = hex[master_key[i] & 0xF];
+ }
+ line[pos++] = '\n';
+ line[pos] = '\0';
+
+ /* Using fputs here instead of fprintf since libcurl's fprintf replacement
+ may not be thread-safe. */
+ fputs(line, keylog_file_fp);
+}
+#endif /* !HAVE_KEYLOG_CALLBACK */
+#endif /* ENABLE_SSLKEYLOGFILE */
+
static const char *SSL_ERROR_to_str(int err)
{
switch(err) {
@@ -214,7 +371,7 @@ static int passwd_callback(char *buf, int num, int encrypting,
if(!encrypting) {
int klen = curlx_uztosi(strlen((char *)global_passwd));
if(num > klen) {
- memcpy(buf, global_passwd, klen+1);
+ memcpy(buf, global_passwd, klen + 1);
return klen;
}
}
@@ -289,14 +446,14 @@ static CURLcode Curl_ossl_seed(struct Curl_easy *data)
size_t len = sizeof(randb);
size_t i, i_max;
for(i = 0, i_max = len / sizeof(struct curltime); i < i_max; ++i) {
- struct curltime tv = curlx_tvnow();
+ struct curltime tv = Curl_now();
Curl_wait_ms(1);
tv.tv_sec *= i + 1;
tv.tv_usec *= (unsigned int)i + 2;
- tv.tv_sec ^= ((curlx_tvnow().tv_sec + curlx_tvnow().tv_usec) *
+ tv.tv_sec ^= ((Curl_now().tv_sec + Curl_now().tv_usec) *
(i + 3)) << 8;
- tv.tv_usec ^= (unsigned int) ((curlx_tvnow().tv_sec +
- curlx_tvnow().tv_usec) *
+ tv.tv_usec ^= (unsigned int) ((Curl_now().tv_sec +
+ Curl_now().tv_usec) *
(i + 4)) << 16;
memcpy(&randb[i * sizeof(struct curltime)], &tv,
sizeof(struct curltime));
@@ -305,7 +462,7 @@ static CURLcode Curl_ossl_seed(struct Curl_easy *data)
} while(!rand_enough());
/* generates a default path for the random seed file */
- fname[0]=0; /* blank it first */
+ fname[0] = 0; /* blank it first */
RAND_file_name(fname, sizeof(fname));
if(fname[0]) {
/* we got a file name to try */
@@ -393,6 +550,7 @@ int cert_stuff(struct connectdata *conn,
{
struct Curl_easy *data = conn->data;
char error_buffer[256];
+ bool check_privkey = TRUE;
int file_type = do_file_type(cert_type);
@@ -496,7 +654,7 @@ int cert_stuff(struct connectdata *conn,
case SSL_FILETYPE_PKCS12:
{
-#ifdef HAVE_OPENSSL_PKCS12_H
+#ifdef HAVE_PKCS12_SUPPORT
FILE *f;
PKCS12 *p12;
EVP_PKEY *pri;
@@ -601,7 +759,7 @@ int cert_stuff(struct connectdata *conn,
break;
if(!key_file)
/* cert & key can only be in PEM case in the same file */
- key_file=cert_file;
+ key_file = cert_file;
/* FALLTHROUGH */
case SSL_FILETYPE_ASN1:
if(SSL_CTX_use_PrivateKey_file(ctx, key_file, file_type) != 1) {
@@ -664,13 +822,13 @@ int cert_stuff(struct connectdata *conn,
return 0;
}
- ssl=SSL_new(ctx);
+ ssl = SSL_new(ctx);
if(!ssl) {
failf(data, "unable to create an SSL structure");
return 0;
}
- x509=SSL_get_certificate(ssl);
+ x509 = SSL_get_certificate(ssl);
/* This version was provided by Evan Jordan and is supposed to not
leak memory as the previous version: */
@@ -680,17 +838,38 @@ int cert_stuff(struct connectdata *conn,
EVP_PKEY_free(pktmp);
}
+#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_IS_BORINGSSL)
+ {
+ /* If RSA is used, don't check the private key if its flags indicate
+ * it doesn't support it. */
+ EVP_PKEY *priv_key = SSL_get_privatekey(ssl);
+ int pktype;
+#ifdef HAVE_OPAQUE_EVP_PKEY
+ pktype = EVP_PKEY_id(priv_key);
+#else
+ pktype = priv_key->type;
+#endif
+ if(pktype == EVP_PKEY_RSA) {
+ RSA *rsa = EVP_PKEY_get1_RSA(priv_key);
+ if(RSA_flags(rsa) & RSA_METHOD_FLAG_NO_CHECK)
+ check_privkey = FALSE;
+ RSA_free(rsa); /* Decrement reference count */
+ }
+ }
+#endif
+
SSL_free(ssl);
/* If we are using DSA, we can copy the parameters from
* the private key */
-
- /* Now we know that a key and cert have been set against
- * the SSL context */
- if(!SSL_CTX_check_private_key(ctx)) {
- failf(data, "Private key does not match the certificate public key");
- return 0;
+ if(check_privkey == TRUE) {
+ /* Now we know that a key and cert have been set against
+ * the SSL context */
+ if(!SSL_CTX_check_private_key(ctx)) {
+ failf(data, "Private key does not match the certificate public key");
+ return 0;
+ }
}
}
return 1;
@@ -718,7 +897,7 @@ static int x509_name_oneline(X509_NAME *a, char *buf, size_t size)
size--; /* don't overwrite the buffer end */
memcpy(buf, biomem->data, size);
- buf[size]=0;
+ buf[size] = 0;
BIO_free(bio_out);
@@ -732,8 +911,12 @@ static int x509_name_oneline(X509_NAME *a, char *buf, size_t size)
* @retval 0 error initializing SSL
* @retval 1 SSL initialized successfully
*/
-int Curl_ossl_init(void)
+static int Curl_ossl_init(void)
{
+#ifdef ENABLE_SSLKEYLOGFILE
+ const char *keylog_file_name;
+#endif
+
OPENSSL_load_builtin_modules();
#ifdef HAVE_ENGINE_LOAD_BUILTIN_ENGINES
@@ -770,11 +953,24 @@ int Curl_ossl_init(void)
OpenSSL_add_all_algorithms();
#endif
+#ifdef ENABLE_SSLKEYLOGFILE
+ keylog_file_name = curl_getenv("SSLKEYLOGFILE");
+ if(keylog_file_name && !keylog_file_fp) {
+ keylog_file_fp = fopen(keylog_file_name, FOPEN_APPENDTEXT);
+ if(keylog_file_fp) {
+ if(setvbuf(keylog_file_fp, NULL, _IOLBF, 4096)) {
+ fclose(keylog_file_fp);
+ keylog_file_fp = NULL;
+ }
+ }
+ }
+#endif
+
return 1;
}
/* Global cleanup */
-void Curl_ossl_cleanup(void)
+static void Curl_ossl_cleanup(void)
{
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && \
!defined(LIBRESSL_VERSION_NUMBER)
@@ -806,6 +1002,13 @@ void Curl_ossl_cleanup(void)
SSL_COMP_free_compression_methods();
#endif
#endif
+
+#ifdef ENABLE_SSLKEYLOGFILE
+ if(keylog_file_fp) {
+ fclose(keylog_file_fp);
+ keylog_file_fp = NULL;
+ }
+#endif
}
/*
@@ -816,7 +1019,7 @@ void Curl_ossl_cleanup(void)
* 0 means the connection has been closed
* -1 means the connection status is unknown
*/
-int Curl_ossl_check_cxn(struct connectdata *conn)
+static int Curl_ossl_check_cxn(struct connectdata *conn)
{
/* SSL_peek takes data out of the raw recv buffer without peeking so we use
recv MSG_PEEK instead. Bug #795 */
@@ -862,7 +1065,8 @@ int Curl_ossl_check_cxn(struct connectdata *conn)
/* Selects an OpenSSL crypto engine
*/
-CURLcode Curl_ossl_set_engine(struct Curl_easy *data, const char *engine)
+static CURLcode Curl_ossl_set_engine(struct Curl_easy *data,
+ const char *engine)
{
#if defined(USE_OPENSSL) && defined(HAVE_OPENSSL_ENGINE_H)
ENGINE *e;
@@ -907,7 +1111,7 @@ CURLcode Curl_ossl_set_engine(struct Curl_easy *data, const char *engine)
/* Sets engine as default for all SSL operations
*/
-CURLcode Curl_ossl_set_engine_default(struct Curl_easy *data)
+static CURLcode Curl_ossl_set_engine_default(struct Curl_easy *data)
{
#ifdef HAVE_OPENSSL_ENGINE_H
if(data->state.engine) {
@@ -929,7 +1133,7 @@ CURLcode Curl_ossl_set_engine_default(struct Curl_easy *data)
/* Return list of OpenSSL crypto engine names.
*/
-struct curl_slist *Curl_ossl_engines_list(struct Curl_easy *data)
+static struct curl_slist *Curl_ossl_engines_list(struct Curl_easy *data)
{
struct curl_slist *list = NULL;
#if defined(USE_OPENSSL) && defined(HAVE_OPENSSL_ENGINE_H)
@@ -952,23 +1156,23 @@ struct curl_slist *Curl_ossl_engines_list(struct Curl_easy *data)
static void ossl_close(struct ssl_connect_data *connssl)
{
- if(connssl->handle) {
- (void)SSL_shutdown(connssl->handle);
- SSL_set_connect_state(connssl->handle);
+ if(BACKEND->handle) {
+ (void)SSL_shutdown(BACKEND->handle);
+ SSL_set_connect_state(BACKEND->handle);
- SSL_free(connssl->handle);
- connssl->handle = NULL;
+ SSL_free(BACKEND->handle);
+ BACKEND->handle = NULL;
}
- if(connssl->ctx) {
- SSL_CTX_free(connssl->ctx);
- connssl->ctx = NULL;
+ if(BACKEND->ctx) {
+ SSL_CTX_free(BACKEND->ctx);
+ BACKEND->ctx = NULL;
}
}
/*
* This function is called when an SSL connection is closed.
*/
-void Curl_ossl_close(struct connectdata *conn, int sockindex)
+static void Curl_ossl_close(struct connectdata *conn, int sockindex)
{
ossl_close(&conn->ssl[sockindex]);
ossl_close(&conn->proxy_ssl[sockindex]);
@@ -978,7 +1182,7 @@ void Curl_ossl_close(struct connectdata *conn, int sockindex)
* This function is called to shut down the SSL layer but keep the
* socket open (CCC - Clear Command Channel)
*/
-int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
+static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
{
int retval = 0;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
@@ -997,9 +1201,9 @@ int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
we do not send one. Let's hope other servers do the same... */
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
- (void)SSL_shutdown(connssl->handle);
+ (void)SSL_shutdown(BACKEND->handle);
- if(connssl->handle) {
+ if(BACKEND->handle) {
buffsize = (int)sizeof(buf);
while(!done) {
int what = SOCKET_READABLE(conn->sock[sockindex],
@@ -1009,9 +1213,8 @@ int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
/* Something to read, let's do it and hope that it is the close
notify alert from the server */
- nread = (ssize_t)SSL_read(conn->ssl[sockindex].handle, buf,
- buffsize);
- err = SSL_get_error(conn->ssl[sockindex].handle, (int)nread);
+ nread = (ssize_t)SSL_read(BACKEND->handle, buf, buffsize);
+ err = SSL_get_error(BACKEND->handle, (int)nread);
switch(err) {
case SSL_ERROR_NONE: /* this is not an error */
@@ -1056,7 +1259,7 @@ int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
if(data->set.verbose) {
#ifdef HAVE_SSL_GET_SHUTDOWN
- switch(SSL_get_shutdown(connssl->handle)) {
+ switch(SSL_get_shutdown(BACKEND->handle)) {
case SSL_SENT_SHUTDOWN:
infof(data, "SSL_get_shutdown() returned SSL_SENT_SHUTDOWN\n");
break;
@@ -1071,13 +1274,13 @@ int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
#endif
}
- SSL_free(connssl->handle);
- connssl->handle = NULL;
+ SSL_free(BACKEND->handle);
+ BACKEND->handle = NULL;
}
return retval;
}
-void Curl_ossl_session_free(void *ptr)
+static void Curl_ossl_session_free(void *ptr)
{
/* free the ID */
SSL_SESSION_free(ptr);
@@ -1087,7 +1290,7 @@ void Curl_ossl_session_free(void *ptr)
* This function is called when the 'data' struct is going away. Close
* down everything and free all resources!
*/
-void Curl_ossl_close_all(struct Curl_easy *data)
+static void Curl_ossl_close_all(struct Curl_easy *data)
{
#ifdef HAVE_OPENSSL_ENGINE_H
if(data->state.engine) {
@@ -1179,7 +1382,7 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
numalts = sk_GENERAL_NAME_num(altnames);
/* loop through all alternatives - until a dnsmatch */
- for(i=0; (i < numalts) && !dnsmatched; i++) {
+ for(i = 0; (i < numalts) && !dnsmatched; i++) {
/* get a handle to alternative name number i */
const GENERAL_NAME *check = sk_GENERAL_NAME_value(altnames, i);
@@ -1248,7 +1451,7 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
else {
/* we have to look to the last occurrence of a commonName in the
distinguished one to get the most significant one. */
- int j, i=-1;
+ int j, i = -1;
/* The following is done because of a bug in 0.9.6b */
@@ -1257,14 +1460,14 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
X509_NAME *name = X509_get_subject_name(server_cert);
if(name)
- while((j = X509_NAME_get_index_by_NID(name, NID_commonName, i))>=0)
- i=j;
+ while((j = X509_NAME_get_index_by_NID(name, NID_commonName, i)) >= 0)
+ i = j;
/* we have the name entry and we will now convert this to a string
that we can use for comparison. Doing this we support BMPstring,
UTF8 etc. */
- if(i>=0) {
+ if(i >= 0) {
ASN1_STRING *tmp =
X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i));
@@ -1277,7 +1480,7 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
if(ASN1_STRING_type(tmp) == V_ASN1_UTF8STRING) {
j = ASN1_STRING_length(tmp);
if(j >= 0) {
- peer_CN = OPENSSL_malloc(j+1);
+ peer_CN = OPENSSL_malloc(j + 1);
if(peer_CN) {
memcpy(peer_CN, ASN1_STRING_get0_data(tmp), j);
peer_CN[j] = '\0';
@@ -1300,7 +1503,8 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
peer_CN = NULL;
else {
/* convert peer_CN from UTF8 */
- CURLcode rc = Curl_convert_from_utf8(data, peer_CN, strlen(peer_CN));
+ CURLcode rc = Curl_convert_from_utf8(data, (char *)peer_CN,
+ strlen((char *)peer_CN));
/* Curl_convert_from_utf8 calls failf if unsuccessful */
if(rc) {
OPENSSL_free(peer_CN);
@@ -1346,7 +1550,7 @@ static CURLcode verifystatus(struct connectdata *conn,
X509_STORE *st = NULL;
STACK_OF(X509) *ch = NULL;
- long len = SSL_get_tlsext_status_ocsp_resp(connssl->handle, &p);
+ long len = SSL_get_tlsext_status_ocsp_resp(BACKEND->handle, &p);
if(!p) {
failf(data, "No OCSP response received");
@@ -1376,8 +1580,8 @@ static CURLcode verifystatus(struct connectdata *conn,
goto end;
}
- ch = SSL_get_peer_cert_chain(connssl->handle);
- st = SSL_CTX_get_cert_store(connssl->ctx);
+ ch = SSL_get_peer_cert_chain(BACKEND->handle);
+ st = SSL_CTX_get_cert_store(BACKEND->ctx);
#if ((OPENSSL_VERSION_NUMBER <= 0x1000201fL) /* Fixed after 1.0.2a */ || \
(defined(LIBRESSL_VERSION_NUMBER) && \
@@ -1768,7 +1972,7 @@ set_ssl_version_min_max(long *ctx_options, struct connectdata *conn,
#ifdef TLS1_3_VERSION
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- SSL_CTX_set_max_proto_version(connssl->ctx, TLS1_3_VERSION);
+ SSL_CTX_set_max_proto_version(BACKEND->ctx, TLS1_3_VERSION);
*ctx_options |= SSL_OP_NO_TLSv1_2;
}
#else
@@ -1919,25 +2123,25 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
return CURLE_SSL_CONNECT_ERROR;
}
- if(connssl->ctx)
- SSL_CTX_free(connssl->ctx);
- connssl->ctx = SSL_CTX_new(req_method);
+ if(BACKEND->ctx)
+ SSL_CTX_free(BACKEND->ctx);
+ BACKEND->ctx = SSL_CTX_new(req_method);
- if(!connssl->ctx) {
+ if(!BACKEND->ctx) {
failf(data, "SSL: couldn't create a context: %s",
ossl_strerror(ERR_peek_error(), error_buffer, sizeof(error_buffer)));
return CURLE_OUT_OF_MEMORY;
}
#ifdef SSL_MODE_RELEASE_BUFFERS
- SSL_CTX_set_mode(connssl->ctx, SSL_MODE_RELEASE_BUFFERS);
+ SSL_CTX_set_mode(BACKEND->ctx, SSL_MODE_RELEASE_BUFFERS);
#endif
#ifdef SSL_CTRL_SET_MSG_CALLBACK
if(data->set.fdebug && data->set.verbose) {
/* the SSL trace callback is only used for verbose logging */
- SSL_CTX_set_msg_callback(connssl->ctx, ssl_tls_trace);
- SSL_CTX_set_msg_callback_arg(connssl->ctx, conn);
+ SSL_CTX_set_msg_callback(BACKEND->ctx, ssl_tls_trace);
+ SSL_CTX_set_msg_callback_arg(BACKEND->ctx, conn);
}
#endif
@@ -2054,11 +2258,11 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
return CURLE_SSL_CONNECT_ERROR;
}
- SSL_CTX_set_options(connssl->ctx, ctx_options);
+ SSL_CTX_set_options(BACKEND->ctx, ctx_options);
#ifdef HAS_NPN
if(conn->bits.tls_enable_npn)
- SSL_CTX_set_next_proto_select_cb(connssl->ctx, select_next_proto_cb, conn);
+ SSL_CTX_set_next_proto_select_cb(BACKEND->ctx, select_next_proto_cb, conn);
#endif
#ifdef HAS_ALPN
@@ -2086,12 +2290,12 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
/* expects length prefixed preference ordered list of protocols in wire
* format
*/
- SSL_CTX_set_alpn_protos(connssl->ctx, protocols, cur);
+ SSL_CTX_set_alpn_protos(BACKEND->ctx, protocols, cur);
}
#endif
if(ssl_cert || ssl_cert_type) {
- if(!cert_stuff(conn, connssl->ctx, ssl_cert, ssl_cert_type,
+ if(!cert_stuff(conn, BACKEND->ctx, ssl_cert, ssl_cert_type,
SSL_SET_OPTION(key), SSL_SET_OPTION(key_type),
SSL_SET_OPTION(key_passwd))) {
/* failf() is already done in cert_stuff() */
@@ -2102,11 +2306,13 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
ciphers = SSL_CONN_CONFIG(cipher_list);
if(!ciphers)
ciphers = (char *)DEFAULT_CIPHER_SELECTION;
- if(!SSL_CTX_set_cipher_list(connssl->ctx, ciphers)) {
- failf(data, "failed setting cipher list: %s", ciphers);
- return CURLE_SSL_CIPHER;
+ if(ciphers) {
+ if(!SSL_CTX_set_cipher_list(BACKEND->ctx, ciphers)) {
+ failf(data, "failed setting cipher list: %s", ciphers);
+ return CURLE_SSL_CIPHER;
+ }
+ infof(data, "Cipher selection: %s\n", ciphers);
}
- infof(data, "Cipher selection: %s\n", ciphers);
#ifdef USE_TLS_SRP
if(ssl_authtype == CURL_TLSAUTH_SRP) {
@@ -2114,18 +2320,18 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
infof(data, "Using TLS-SRP username: %s\n", ssl_username);
- if(!SSL_CTX_set_srp_username(connssl->ctx, ssl_username)) {
+ if(!SSL_CTX_set_srp_username(BACKEND->ctx, ssl_username)) {
failf(data, "Unable to set SRP user name");
return CURLE_BAD_FUNCTION_ARGUMENT;
}
- if(!SSL_CTX_set_srp_password(connssl->ctx, SSL_SET_OPTION(password))) {
+ if(!SSL_CTX_set_srp_password(BACKEND->ctx, SSL_SET_OPTION(password))) {
failf(data, "failed setting SRP password");
return CURLE_BAD_FUNCTION_ARGUMENT;
}
if(!SSL_CONN_CONFIG(cipher_list)) {
infof(data, "Setting cipher list SRP\n");
- if(!SSL_CTX_set_cipher_list(connssl->ctx, "SRP")) {
+ if(!SSL_CTX_set_cipher_list(BACKEND->ctx, "SRP")) {
failf(data, "failed setting SRP cipher list");
return CURLE_SSL_CIPHER;
}
@@ -2136,7 +2342,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
if(ssl_cafile || ssl_capath) {
/* tell SSL where to find CA certificates that are used to verify
the servers certificate. */
- if(!SSL_CTX_load_verify_locations(connssl->ctx, ssl_cafile, ssl_capath)) {
+ if(!SSL_CTX_load_verify_locations(BACKEND->ctx, ssl_cafile, ssl_capath)) {
if(verifypeer) {
/* Fail if we insist on successfully verifying the server. */
failf(data, "error setting certificate verify locations:\n"
@@ -2164,14 +2370,14 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
else if(verifypeer) {
/* verfying the peer without any CA certificates won't
work so use openssl's built in default as fallback */
- SSL_CTX_set_default_verify_paths(connssl->ctx);
+ SSL_CTX_set_default_verify_paths(BACKEND->ctx);
}
#endif
if(ssl_crlfile) {
/* tell SSL where to find CRL file that is used to check certificate
* revocation */
- lookup=X509_STORE_add_lookup(SSL_CTX_get_cert_store(connssl->ctx),
+ lookup = X509_STORE_add_lookup(SSL_CTX_get_cert_store(BACKEND->ctx),
X509_LOOKUP_file());
if(!lookup ||
(!X509_load_crl_file(lookup, ssl_crlfile, X509_FILETYPE_PEM)) ) {
@@ -2180,7 +2386,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
}
/* Everything is fine. */
infof(data, "successfully load CRL file:\n");
- X509_STORE_set_flags(SSL_CTX_get_cert_store(connssl->ctx),
+ X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
infof(data, " CRLfile: %s\n", ssl_crlfile);
@@ -2195,7 +2401,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
*/
#if defined(X509_V_FLAG_TRUSTED_FIRST) && !defined(X509_V_FLAG_NO_ALT_CHAINS)
if(verifypeer) {
- X509_STORE_set_flags(SSL_CTX_get_cert_store(connssl->ctx),
+ X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
X509_V_FLAG_TRUSTED_FIRST);
}
#endif
@@ -2204,12 +2410,19 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
* fail to connect if the verification fails, or if it should continue
* anyway. In the latter case the result of the verification is checked with
* SSL_get_verify_result() below. */
- SSL_CTX_set_verify(connssl->ctx,
+ SSL_CTX_set_verify(BACKEND->ctx,
verifypeer ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
+ /* Enable logging of secrets to the file specified in env SSLKEYLOGFILE. */
+#if defined(ENABLE_SSLKEYLOGFILE) && defined(HAVE_KEYLOG_CALLBACK)
+ if(keylog_file) {
+ SSL_CTX_set_keylog_callback(connssl->ctx, ossl_keylog_callback);
+ }
+#endif
+
/* give application a chance to interfere with SSL set up. */
if(data->set.ssl.fsslctx) {
- result = (*data->set.ssl.fsslctx)(data, connssl->ctx,
+ result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
data->set.ssl.fsslctxp);
if(result) {
failf(data, "error signaled by ssl ctx callback");
@@ -2218,10 +2431,10 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
}
/* Lets make an SSL structure */
- if(connssl->handle)
- SSL_free(connssl->handle);
- connssl->handle = SSL_new(connssl->ctx);
- if(!connssl->handle) {
+ if(BACKEND->handle)
+ SSL_free(BACKEND->handle);
+ BACKEND->handle = SSL_new(BACKEND->ctx);
+ if(!BACKEND->handle) {
failf(data, "SSL: couldn't create a context (handle)!");
return CURLE_OUT_OF_MEMORY;
}
@@ -2229,19 +2442,19 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
#if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \
!defined(OPENSSL_NO_OCSP)
if(SSL_CONN_CONFIG(verifystatus))
- SSL_set_tlsext_status_type(connssl->handle, TLSEXT_STATUSTYPE_ocsp);
+ SSL_set_tlsext_status_type(BACKEND->handle, TLSEXT_STATUSTYPE_ocsp);
#endif
- SSL_set_connect_state(connssl->handle);
+ SSL_set_connect_state(BACKEND->handle);
- connssl->server_cert = 0x0;
+ BACKEND->server_cert = 0x0;
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
if((0 == Curl_inet_pton(AF_INET, hostname, &addr)) &&
#ifdef ENABLE_IPV6
(0 == Curl_inet_pton(AF_INET6, hostname, &addr)) &&
#endif
sni &&
- !SSL_set_tlsext_host_name(connssl->handle, hostname))
+ !SSL_set_tlsext_host_name(BACKEND->handle, hostname))
infof(data, "WARNING: failed to configure server name indication (SNI) "
"TLS extension\n");
#endif
@@ -2253,7 +2466,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
Curl_ssl_sessionid_lock(conn);
if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL, sockindex)) {
/* we got a session id, use it! */
- if(!SSL_set_session(connssl->handle, ssl_sessionid)) {
+ if(!SSL_set_session(BACKEND->handle, ssl_sessionid)) {
Curl_ssl_sessionid_unlock(conn);
failf(data, "SSL: SSL_set_session failed: %s",
ossl_strerror(ERR_get_error(), error_buffer,
@@ -2268,13 +2481,14 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
if(conn->proxy_ssl[sockindex].use) {
BIO *const bio = BIO_new(BIO_f_ssl());
+ SSL *handle = conn->proxy_ssl[sockindex].backend->handle;
DEBUGASSERT(ssl_connection_complete == conn->proxy_ssl[sockindex].state);
- DEBUGASSERT(conn->proxy_ssl[sockindex].handle != NULL);
+ DEBUGASSERT(handle != NULL);
DEBUGASSERT(bio != NULL);
- BIO_set_ssl(bio, conn->proxy_ssl[sockindex].handle, FALSE);
- SSL_set_bio(connssl->handle, bio, bio);
+ BIO_set_ssl(bio, handle, FALSE);
+ SSL_set_bio(BACKEND->handle, bio, bio);
}
- else if(!SSL_set_fd(connssl->handle, (int)sockfd)) {
+ else if(!SSL_set_fd(BACKEND->handle, (int)sockfd)) {
/* pass the raw socket into the SSL layers */
failf(data, "SSL: SSL_set_fd failed: %s",
ossl_strerror(ERR_get_error(), error_buffer, sizeof(error_buffer)));
@@ -2299,13 +2513,18 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
ERR_clear_error();
- err = SSL_connect(connssl->handle);
+ err = SSL_connect(BACKEND->handle);
+ /* If keylogging is enabled but the keylog callback is not supported then log
+ secrets here, immediately after SSL_connect by using tap_ssl_key. */
+#if defined(ENABLE_SSLKEYLOGFILE) && !defined(HAVE_KEYLOG_CALLBACK)
+ tap_ssl_key(BACKEND->handle, &BACKEND->tap_state);
+#endif
/* 1 is fine
0 is "not successful but was shut down controlled"
<0 is "handshake was not successful, because a fatal error occurred" */
if(1 != err) {
- int detail = SSL_get_error(connssl->handle, err);
+ int detail = SSL_get_error(BACKEND->handle, err);
if(SSL_ERROR_WANT_READ == detail) {
connssl->connecting_state = ssl_connect_2_reading;
@@ -2339,7 +2558,7 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
(reason == SSL_R_CERTIFICATE_VERIFY_FAILED)) {
result = CURLE_SSL_CACERT;
- lerr = SSL_get_verify_result(connssl->handle);
+ lerr = SSL_get_verify_result(BACKEND->handle);
if(lerr != X509_V_OK) {
*certverifyresult = lerr;
snprintf(error_buffer, sizeof(error_buffer),
@@ -2383,8 +2602,8 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
/* Informational message */
infof(data, "SSL connection using %s / %s\n",
- get_ssl_version_txt(connssl->handle),
- SSL_get_cipher(connssl->handle));
+ get_ssl_version_txt(BACKEND->handle),
+ SSL_get_cipher(BACKEND->handle));
#ifdef HAS_ALPN
/* Sets data and len to negotiated protocol, len is 0 if no protocol was
@@ -2393,7 +2612,7 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
if(conn->bits.tls_enable_alpn) {
const unsigned char *neg_protocol;
unsigned int len;
- SSL_get0_alpn_selected(connssl->handle, &neg_protocol, &len);
+ SSL_get0_alpn_selected(BACKEND->handle, &neg_protocol, &len);
if(len != 0) {
infof(data, "ALPN, server accepted to use %.*s\n", len, neg_protocol);
@@ -2438,7 +2657,7 @@ static int asn1_object_dump(ASN1_OBJECT *a, char *buf, size_t len)
do { \
long info_len = BIO_get_mem_data(mem, &ptr); \
Curl_ssl_push_certinfo_len(data, _num, _label, ptr, info_len); \
- if(1!=BIO_reset(mem)) \
+ if(1 != BIO_reset(mem)) \
break; \
} WHILE_FALSE
@@ -2486,12 +2705,12 @@ static int X509V3_ext(struct Curl_easy *data,
/* no extensions, bail out */
return 1;
- for(i=0; i < (int)sk_X509_EXTENSION_num(exts); i++) {
+ for(i = 0; i < (int)sk_X509_EXTENSION_num(exts); i++) {
ASN1_OBJECT *obj;
X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
BUF_MEM *biomem;
char buf[512];
- char *ptr=buf;
+ char *ptr = buf;
char namebuf[128];
BIO *bio_out = BIO_new(BIO_s_mem());
@@ -2508,16 +2727,16 @@ static int X509V3_ext(struct Curl_easy *data,
BIO_get_mem_ptr(bio_out, &biomem);
for(j = 0; j < (size_t)biomem->length; j++) {
- const char *sep="";
+ const char *sep = "";
if(biomem->data[j] == '\n') {
- sep=", ";
+ sep = ", ";
j++; /* skip the newline */
};
while((j<(size_t)biomem->length) && (biomem->data[j] == ' '))
j++;
if(j<(size_t)biomem->length)
- ptr+=snprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep,
- biomem->data[j]);
+ ptr += snprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep,
+ biomem->data[j]);
}
Curl_ssl_push_certinfo(data, certnum, namebuf, buf);
@@ -2539,7 +2758,7 @@ static CURLcode get_cert_chain(struct connectdata *conn,
int numcerts;
BIO *mem;
- sk = SSL_get_peer_cert_chain(connssl->handle);
+ sk = SSL_get_peer_cert_chain(BACKEND->handle);
if(!sk) {
return CURLE_OUT_OF_MEMORY;
}
@@ -2556,7 +2775,7 @@ static CURLcode get_cert_chain(struct connectdata *conn,
for(i = 0; i < numcerts; i++) {
ASN1_INTEGER *num;
X509 *x = sk_X509_value(sk, i);
- EVP_PKEY *pubkey=NULL;
+ EVP_PKEY *pubkey = NULL;
int j;
char *ptr;
const ASN1_BIT_STRING *psig = NULL;
@@ -2829,8 +3048,8 @@ static CURLcode servercert(struct connectdata *conn,
/* we've been asked to gather certificate info! */
(void)get_cert_chain(conn, connssl);
- connssl->server_cert = SSL_get_peer_certificate(connssl->handle);
- if(!connssl->server_cert) {
+ BACKEND->server_cert = SSL_get_peer_certificate(BACKEND->handle);
+ if(!BACKEND->server_cert) {
BIO_free(mem);
if(!strict)
return CURLE_OK;
@@ -2841,32 +3060,32 @@ static CURLcode servercert(struct connectdata *conn,
infof(data, "%s certificate:\n", SSL_IS_PROXY() ? "Proxy" : "Server");
- rc = x509_name_oneline(X509_get_subject_name(connssl->server_cert),
+ rc = x509_name_oneline(X509_get_subject_name(BACKEND->server_cert),
buffer, sizeof(buffer));
infof(data, " subject: %s\n", rc?"[NONE]":buffer);
- ASN1_TIME_print(mem, X509_get0_notBefore(connssl->server_cert));
+ ASN1_TIME_print(mem, X509_get0_notBefore(BACKEND->server_cert));
len = BIO_get_mem_data(mem, (char **) &ptr);
infof(data, " start date: %.*s\n", len, ptr);
- rc = BIO_reset(mem);
+ (void)BIO_reset(mem);
- ASN1_TIME_print(mem, X509_get0_notAfter(connssl->server_cert));
+ ASN1_TIME_print(mem, X509_get0_notAfter(BACKEND->server_cert));
len = BIO_get_mem_data(mem, (char **) &ptr);
infof(data, " expire date: %.*s\n", len, ptr);
- rc = BIO_reset(mem);
+ (void)BIO_reset(mem);
BIO_free(mem);
if(SSL_CONN_CONFIG(verifyhost)) {
- result = verifyhost(conn, connssl->server_cert);
+ result = verifyhost(conn, BACKEND->server_cert);
if(result) {
- X509_free(connssl->server_cert);
- connssl->server_cert = NULL;
+ X509_free(BACKEND->server_cert);
+ BACKEND->server_cert = NULL;
return result;
}
}
- rc = x509_name_oneline(X509_get_issuer_name(connssl->server_cert),
+ rc = x509_name_oneline(X509_get_issuer_name(BACKEND->server_cert),
buffer, sizeof(buffer));
if(rc) {
if(strict)
@@ -2886,8 +3105,8 @@ static CURLcode servercert(struct connectdata *conn,
if(strict)
failf(data, "SSL: Unable to open issuer cert (%s)",
SSL_SET_OPTION(issuercert));
- X509_free(connssl->server_cert);
- connssl->server_cert = NULL;
+ X509_free(BACKEND->server_cert);
+ BACKEND->server_cert = NULL;
return CURLE_SSL_ISSUER_ERROR;
}
@@ -2896,7 +3115,7 @@ static CURLcode servercert(struct connectdata *conn,
if(strict)
failf(data, "SSL: Unable to read issuer cert (%s)",
SSL_SET_OPTION(issuercert));
- X509_free(connssl->server_cert);
+ X509_free(BACKEND->server_cert);
X509_free(issuer);
fclose(fp);
return CURLE_SSL_ISSUER_ERROR;
@@ -2904,13 +3123,13 @@ static CURLcode servercert(struct connectdata *conn,
fclose(fp);
- if(X509_check_issued(issuer, connssl->server_cert) != X509_V_OK) {
+ if(X509_check_issued(issuer, BACKEND->server_cert) != X509_V_OK) {
if(strict)
failf(data, "SSL: Certificate issuer check failed (%s)",
SSL_SET_OPTION(issuercert));
- X509_free(connssl->server_cert);
+ X509_free(BACKEND->server_cert);
X509_free(issuer);
- connssl->server_cert = NULL;
+ BACKEND->server_cert = NULL;
return CURLE_SSL_ISSUER_ERROR;
}
@@ -2919,7 +3138,7 @@ static CURLcode servercert(struct connectdata *conn,
X509_free(issuer);
}
- lerr = *certverifyresult = SSL_get_verify_result(connssl->handle);
+ lerr = *certverifyresult = SSL_get_verify_result(BACKEND->handle);
if(*certverifyresult != X509_V_OK) {
if(SSL_CONN_CONFIG(verifypeer)) {
@@ -2944,8 +3163,8 @@ static CURLcode servercert(struct connectdata *conn,
if(SSL_CONN_CONFIG(verifystatus)) {
result = verifystatus(conn, connssl);
if(result) {
- X509_free(connssl->server_cert);
- connssl->server_cert = NULL;
+ X509_free(BACKEND->server_cert);
+ BACKEND->server_cert = NULL;
return result;
}
}
@@ -2958,13 +3177,13 @@ static CURLcode servercert(struct connectdata *conn,
ptr = SSL_IS_PROXY() ? data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
if(!result && ptr) {
- result = pkp_pin_peer_pubkey(data, connssl->server_cert, ptr);
+ result = pkp_pin_peer_pubkey(data, BACKEND->server_cert, ptr);
if(result)
failf(data, "SSL: public key does not match pinned public key!");
}
- X509_free(connssl->server_cert);
- connssl->server_cert = NULL;
+ X509_free(BACKEND->server_cert);
+ BACKEND->server_cert = NULL;
connssl->connecting_state = ssl_connect_done;
return result;
@@ -2983,7 +3202,7 @@ static CURLcode ossl_connect_step3(struct connectdata *conn, int sockindex)
SSL_SESSION *our_ssl_sessionid;
void *old_ssl_sessionid = NULL;
- our_ssl_sessionid = SSL_get1_session(connssl->handle);
+ our_ssl_sessionid = SSL_get1_session(BACKEND->handle);
/* SSL_get1_session() will increment the reference count and the session
will stay in memory until explicitly freed with SSL_SESSION_free(3),
@@ -3088,9 +3307,9 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
if(connssl->connecting_state == ssl_connect_2_reading ||
connssl->connecting_state == ssl_connect_2_writing) {
- curl_socket_t writefd = ssl_connect_2_writing==
+ curl_socket_t writefd = ssl_connect_2_writing ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
- curl_socket_t readfd = ssl_connect_2_reading==
+ curl_socket_t readfd = ssl_connect_2_reading ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
@@ -3148,14 +3367,14 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
return CURLE_OK;
}
-CURLcode Curl_ossl_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done)
+static CURLcode Curl_ossl_connect_nonblocking(struct connectdata *conn,
+ int sockindex,
+ bool *done)
{
return ossl_connect_common(conn, sockindex, TRUE, done);
}
-CURLcode Curl_ossl_connect(struct connectdata *conn, int sockindex)
+static CURLcode Curl_ossl_connect(struct connectdata *conn, int sockindex)
{
CURLcode result;
bool done = FALSE;
@@ -3169,17 +3388,22 @@ CURLcode Curl_ossl_connect(struct connectdata *conn, int sockindex)
return CURLE_OK;
}
-bool Curl_ossl_data_pending(const struct connectdata *conn, int connindex)
+static bool Curl_ossl_data_pending(const struct connectdata *conn,
+ int connindex)
{
- if(conn->ssl[connindex].handle)
+ const struct ssl_connect_data *connssl = &conn->ssl[connindex];
+ const struct ssl_connect_data *proxyssl = &conn->proxy_ssl[connindex];
+ if(BACKEND->handle)
/* SSL is in use */
- return (0 != SSL_pending(conn->ssl[connindex].handle) ||
- (conn->proxy_ssl[connindex].handle &&
- 0 != SSL_pending(conn->proxy_ssl[connindex].handle))) ?
+ return (0 != SSL_pending(BACKEND->handle) ||
+ (proxyssl->backend->handle &&
+ 0 != SSL_pending(proxyssl->backend->handle))) ?
TRUE : FALSE;
return FALSE;
}
+static size_t Curl_ossl_version(char *buffer, size_t size);
+
static ssize_t ossl_send(struct connectdata *conn,
int sockindex,
const void *mem,
@@ -3193,14 +3417,15 @@ static ssize_t ossl_send(struct connectdata *conn,
unsigned long sslerror;
int memlen;
int rc;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
ERR_clear_error();
memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
- rc = SSL_write(conn->ssl[sockindex].handle, mem, memlen);
+ rc = SSL_write(BACKEND->handle, mem, memlen);
if(rc <= 0) {
- err = SSL_get_error(conn->ssl[sockindex].handle, rc);
+ err = SSL_get_error(BACKEND->handle, rc);
switch(err) {
case SSL_ERROR_WANT_READ:
@@ -3254,14 +3479,15 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
unsigned long sslerror;
ssize_t nread;
int buffsize;
+ struct ssl_connect_data *connssl = &conn->ssl[num];
ERR_clear_error();
buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
- nread = (ssize_t)SSL_read(conn->ssl[num].handle, buf, buffsize);
+ nread = (ssize_t)SSL_read(BACKEND->handle, buf, buffsize);
if(nread <= 0) {
/* failed SSL_read */
- int err = SSL_get_error(conn->ssl[num].handle, (int)nread);
+ int err = SSL_get_error(BACKEND->handle, (int)nread);
switch(err) {
case SSL_ERROR_NONE: /* this is not an error */
@@ -3293,7 +3519,7 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
return nread;
}
-size_t Curl_ossl_version(char *buffer, size_t size)
+static size_t Curl_ossl_version(char *buffer, size_t size)
{
#ifdef OPENSSL_IS_BORINGSSL
return snprintf(buffer, size, OSSL_PACKAGE);
@@ -3302,9 +3528,9 @@ size_t Curl_ossl_version(char *buffer, size_t size)
unsigned long ssleay_value;
sub[2]='\0';
sub[1]='\0';
- ssleay_value=OpenSSL_version_num();
+ ssleay_value = OpenSSL_version_num();
if(ssleay_value < 0x906000) {
- ssleay_value=SSLEAY_VERSION_NUMBER;
+ ssleay_value = SSLEAY_VERSION_NUMBER;
sub[0]='\0';
}
else {
@@ -3333,8 +3559,8 @@ size_t Curl_ossl_version(char *buffer, size_t size)
}
/* can be called with data == NULL */
-CURLcode Curl_ossl_random(struct Curl_easy *data, unsigned char *entropy,
- size_t length)
+static CURLcode Curl_ossl_random(struct Curl_easy *data,
+ unsigned char *entropy, size_t length)
{
int rc;
if(data) {
@@ -3350,23 +3576,24 @@ CURLcode Curl_ossl_random(struct Curl_easy *data, unsigned char *entropy,
return (rc == 1 ? CURLE_OK : CURLE_FAILED_INIT);
}
-void Curl_ossl_md5sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *md5sum /* output */,
- size_t unused)
+static CURLcode Curl_ossl_md5sum(unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *md5sum /* output */,
+ size_t unused)
{
MD5_CTX MD5pw;
(void)unused;
MD5_Init(&MD5pw);
MD5_Update(&MD5pw, tmp, tmplen);
MD5_Final(md5sum, &MD5pw);
+ return CURLE_OK;
}
#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
-void Curl_ossl_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum /* output */,
- size_t unused)
+static void Curl_ossl_sha256sum(const unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *sha256sum /* output */,
+ size_t unused)
{
SHA256_CTX SHA256pw;
(void)unused;
@@ -3376,7 +3603,7 @@ void Curl_ossl_sha256sum(const unsigned char *tmp, /* input */
}
#endif
-bool Curl_ossl_cert_status_request(void)
+static bool Curl_ossl_cert_status_request(void)
{
#if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \
!defined(OPENSSL_NO_OCSP)
@@ -3385,4 +3612,50 @@ bool Curl_ossl_cert_status_request(void)
return FALSE;
#endif
}
+
+static void *Curl_ossl_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info)
+{
+ /* Legacy: CURLINFO_TLS_SESSION must return an SSL_CTX pointer. */
+ return info == CURLINFO_TLS_SESSION ?
+ (void *)BACKEND->ctx : (void *)BACKEND->handle;
+}
+
+const struct Curl_ssl Curl_ssl_openssl = {
+ { CURLSSLBACKEND_OPENSSL, "openssl" }, /* info */
+
+ 1, /* have_ca_path */
+ 1, /* have_certinfo */
+ 1, /* have_pinnedpubkey */
+ 1, /* have_ssl_ctx */
+ 1, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_ossl_init, /* init */
+ Curl_ossl_cleanup, /* cleanup */
+ Curl_ossl_version, /* version */
+ Curl_ossl_check_cxn, /* check_cxn */
+ Curl_ossl_shutdown, /* shutdown */
+ Curl_ossl_data_pending, /* data_pending */
+ Curl_ossl_random, /* random */
+ Curl_ossl_cert_status_request, /* cert_status_request */
+ Curl_ossl_connect, /* connect */
+ Curl_ossl_connect_nonblocking, /* connect_nonblocking */
+ Curl_ossl_get_internals, /* get_internals */
+ Curl_ossl_close, /* close_one */
+ Curl_ossl_close_all, /* close_all */
+ Curl_ossl_session_free, /* session_free */
+ Curl_ossl_set_engine, /* set_engine */
+ Curl_ossl_set_engine_default, /* set_engine_default */
+ Curl_ossl_engines_list, /* engines_list */
+ Curl_none_false_start, /* false_start */
+ Curl_ossl_md5sum, /* md5sum */
+#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
+ Curl_ossl_sha256sum /* sha256sum */
+#else
+ NULL /* sha256sum */
+#endif
+};
+
#endif /* USE_OPENSSL */
diff --git a/lib/vtls/openssl.h b/lib/vtls/openssl.h
index b9648d5..114dc4b 100644
--- a/lib/vtls/openssl.h
+++ b/lib/vtls/openssl.h
@@ -31,96 +31,7 @@
#include "urldata.h"
-CURLcode Curl_ossl_connect(struct connectdata *conn, int sockindex);
-CURLcode Curl_ossl_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done);
-
-/* close a SSL connection */
-void Curl_ossl_close(struct connectdata *conn, int sockindex);
-
-/* tell OpenSSL to close down all open information regarding connections (and
- thus session ID caching etc) */
-void Curl_ossl_close_all(struct Curl_easy *data);
-
-/* Sets an OpenSSL engine */
-CURLcode Curl_ossl_set_engine(struct Curl_easy *data, const char *engine);
-
-/* function provided for the generic SSL-layer, called when a session id
- should be freed */
-void Curl_ossl_session_free(void *ptr);
-
-/* Sets engine as default for all SSL operations */
-CURLcode Curl_ossl_set_engine_default(struct Curl_easy *data);
-
-/* Build list of OpenSSL engines */
-struct curl_slist *Curl_ossl_engines_list(struct Curl_easy *data);
-
-int Curl_ossl_init(void);
-void Curl_ossl_cleanup(void);
-
-size_t Curl_ossl_version(char *buffer, size_t size);
-int Curl_ossl_check_cxn(struct connectdata *cxn);
-int Curl_ossl_shutdown(struct connectdata *conn, int sockindex);
-bool Curl_ossl_data_pending(const struct connectdata *conn,
- int connindex);
-
-/* return 0 if a find random is filled in */
-CURLcode Curl_ossl_random(struct Curl_easy *data, unsigned char *entropy,
- size_t length);
-void Curl_ossl_md5sum(unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *md5sum /* output */,
- size_t unused);
-void Curl_ossl_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum /* output */,
- size_t unused);
-
-bool Curl_ossl_cert_status_request(void);
-
-/* Support HTTPS-proxy */
-#define HTTPS_PROXY_SUPPORT 1
-
-/* Set the API backend definition to OpenSSL */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_OPENSSL
-
-/* this backend supports the CAPATH option */
-#define have_curlssl_ca_path 1
-
-/* this backend supports CURLOPT_CERTINFO */
-#define have_curlssl_certinfo 1
-
-/* this backend supports CURLOPT_SSL_CTX_* */
-#define have_curlssl_ssl_ctx 1
-
-/* this backend supports CURLOPT_PINNEDPUBLICKEY */
-#define have_curlssl_pinnedpubkey 1
-
-/* API setup for OpenSSL */
-#define curlssl_init Curl_ossl_init
-#define curlssl_cleanup Curl_ossl_cleanup
-#define curlssl_connect Curl_ossl_connect
-#define curlssl_connect_nonblocking Curl_ossl_connect_nonblocking
-#define curlssl_session_free(x) Curl_ossl_session_free(x)
-#define curlssl_close_all Curl_ossl_close_all
-#define curlssl_close Curl_ossl_close
-#define curlssl_shutdown(x,y) Curl_ossl_shutdown(x,y)
-#define curlssl_set_engine(x,y) Curl_ossl_set_engine(x,y)
-#define curlssl_set_engine_default(x) Curl_ossl_set_engine_default(x)
-#define curlssl_engines_list(x) Curl_ossl_engines_list(x)
-#define curlssl_version Curl_ossl_version
-#define curlssl_check_cxn Curl_ossl_check_cxn
-#define curlssl_data_pending(x,y) Curl_ossl_data_pending(x,y)
-#define curlssl_random(x,y,z) Curl_ossl_random(x,y,z)
-#define curlssl_md5sum(a,b,c,d) Curl_ossl_md5sum(a,b,c,d)
-#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
-#define curlssl_sha256sum(a,b,c,d) Curl_ossl_sha256sum(a,b,c,d)
-#endif
-#define curlssl_cert_status_request() Curl_ossl_cert_status_request()
-
-#define DEFAULT_CIPHER_SELECTION \
- "ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH"
+extern const struct Curl_ssl Curl_ssl_openssl;
#endif /* USE_OPENSSL */
#endif /* HEADER_CURL_SSLUSE_H */
diff --git a/lib/vtls/polarssl.c b/lib/vtls/polarssl.c
index 669091c..df29fa9 100644
--- a/lib/vtls/polarssl.c
+++ b/lib/vtls/polarssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010 - 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
*
* This software is licensed as described in the file COPYING, which
@@ -30,7 +30,6 @@
#include "curl_setup.h"
#ifdef USE_POLARSSL
-
#include <polarssl/net.h>
#include <polarssl/ssl.h>
#include <polarssl/certs.h>
@@ -70,6 +69,19 @@
#define PUB_DER_MAX_BYTES (RSA_PUB_DER_MAX_BYTES > ECP_PUB_DER_MAX_BYTES ? \
RSA_PUB_DER_MAX_BYTES : ECP_PUB_DER_MAX_BYTES)
+struct ssl_backend_data {
+ ctr_drbg_context ctr_drbg;
+ entropy_context entropy;
+ ssl_context ssl;
+ int server_fd;
+ x509_crt cacert;
+ x509_crt clicert;
+ x509_crl crl;
+ rsa_context rsa;
+};
+
+#define BACKEND connssl->backend
+
/* apply threading? */
#if defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32)
#define THREADING_SUPPORT
@@ -197,8 +209,8 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
return result;
}
- ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3, ssl_min_ver);
- ssl_set_max_version(&connssl->ssl, SSL_MAJOR_VERSION_3, ssl_max_ver);
+ ssl_set_min_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3, ssl_min_ver);
+ ssl_set_max_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3, ssl_max_ver);
return result;
}
@@ -215,7 +227,7 @@ polarssl_connect_step1(struct connectdata *conn,
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
int ret = -1;
char errorbuf[128];
- errorbuf[0]=0;
+ errorbuf[0] = 0;
/* PolarSSL only supports SSLv3 and TLSv1 */
if(SSL_CONN_CONFIG(version) == CURL_SSLVERSION_SSLv2) {
@@ -226,16 +238,16 @@ polarssl_connect_step1(struct connectdata *conn,
#ifdef THREADING_SUPPORT
entropy_init_mutex(&entropy);
- if((ret = ctr_drbg_init(&connssl->ctr_drbg, entropy_func_mutex, &entropy,
+ if((ret = ctr_drbg_init(&BACKEND->ctr_drbg, entropy_func_mutex, &entropy,
NULL, 0)) != 0) {
error_strerror(ret, errorbuf, sizeof(errorbuf));
failf(data, "Failed - PolarSSL: ctr_drbg_init returned (-0x%04X) %s\n",
-ret, errorbuf);
}
#else
- entropy_init(&connssl->entropy);
+ entropy_init(&BACKEND->entropy);
- if((ret = ctr_drbg_init(&connssl->ctr_drbg, entropy_func, &connssl->entropy,
+ if((ret = ctr_drbg_init(&BACKEND->ctr_drbg, entropy_func, &BACKEND->entropy,
NULL, 0)) != 0) {
error_strerror(ret, errorbuf, sizeof(errorbuf));
failf(data, "Failed - PolarSSL: ctr_drbg_init returned (-0x%04X) %s\n",
@@ -244,10 +256,10 @@ polarssl_connect_step1(struct connectdata *conn,
#endif /* THREADING_SUPPORT */
/* Load the trusted CA */
- memset(&connssl->cacert, 0, sizeof(x509_crt));
+ memset(&BACKEND->cacert, 0, sizeof(x509_crt));
if(SSL_CONN_CONFIG(CAfile)) {
- ret = x509_crt_parse_file(&connssl->cacert,
+ ret = x509_crt_parse_file(&BACKEND->cacert,
SSL_CONN_CONFIG(CAfile));
if(ret<0) {
@@ -261,7 +273,7 @@ polarssl_connect_step1(struct connectdata *conn,
}
if(capath) {
- ret = x509_crt_parse_path(&connssl->cacert, capath);
+ ret = x509_crt_parse_path(&BACKEND->cacert, capath);
if(ret<0) {
error_strerror(ret, errorbuf, sizeof(errorbuf));
@@ -274,10 +286,10 @@ polarssl_connect_step1(struct connectdata *conn,
}
/* Load the client certificate */
- memset(&connssl->clicert, 0, sizeof(x509_crt));
+ memset(&BACKEND->clicert, 0, sizeof(x509_crt));
if(SSL_SET_OPTION(cert)) {
- ret = x509_crt_parse_file(&connssl->clicert,
+ ret = x509_crt_parse_file(&BACKEND->clicert,
SSL_SET_OPTION(cert));
if(ret) {
@@ -298,9 +310,9 @@ polarssl_connect_step1(struct connectdata *conn,
if(ret == 0 && !pk_can_do(&pk, POLARSSL_PK_RSA))
ret = POLARSSL_ERR_PK_TYPE_MISMATCH;
if(ret == 0)
- rsa_copy(&connssl->rsa, pk_rsa(pk));
+ rsa_copy(&BACKEND->rsa, pk_rsa(pk));
else
- rsa_free(&connssl->rsa);
+ rsa_free(&BACKEND->rsa);
pk_free(&pk);
if(ret) {
@@ -313,10 +325,10 @@ polarssl_connect_step1(struct connectdata *conn,
}
/* Load the CRL */
- memset(&connssl->crl, 0, sizeof(x509_crl));
+ memset(&BACKEND->crl, 0, sizeof(x509_crl));
if(SSL_SET_OPTION(CRLfile)) {
- ret = x509_crl_parse_file(&connssl->crl,
+ ret = x509_crl_parse_file(&BACKEND->crl,
SSL_SET_OPTION(CRLfile));
if(ret) {
@@ -330,7 +342,7 @@ polarssl_connect_step1(struct connectdata *conn,
infof(data, "PolarSSL: Connecting to %s:%d\n", hostname, port);
- if(ssl_init(&connssl->ssl)) {
+ if(ssl_init(&BACKEND->ssl)) {
failf(data, "PolarSSL: ssl_init failed");
return CURLE_SSL_CONNECT_ERROR;
}
@@ -338,13 +350,13 @@ polarssl_connect_step1(struct connectdata *conn,
switch(SSL_CONN_CONFIG(version)) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
- ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3,
+ ssl_set_min_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3,
SSL_MINOR_VERSION_1);
break;
case CURL_SSLVERSION_SSLv3:
- ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3,
+ ssl_set_min_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3,
SSL_MINOR_VERSION_0);
- ssl_set_max_version(&connssl->ssl, SSL_MAJOR_VERSION_3,
+ ssl_set_max_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3,
SSL_MINOR_VERSION_0);
infof(data, "PolarSSL: Forced min. SSL Version to be SSLv3\n");
break;
@@ -363,16 +375,16 @@ polarssl_connect_step1(struct connectdata *conn,
return CURLE_SSL_CONNECT_ERROR;
}
- ssl_set_endpoint(&connssl->ssl, SSL_IS_CLIENT);
- ssl_set_authmode(&connssl->ssl, SSL_VERIFY_OPTIONAL);
+ ssl_set_endpoint(&BACKEND->ssl, SSL_IS_CLIENT);
+ ssl_set_authmode(&BACKEND->ssl, SSL_VERIFY_OPTIONAL);
- ssl_set_rng(&connssl->ssl, ctr_drbg_random,
- &connssl->ctr_drbg);
- ssl_set_bio(&connssl->ssl,
+ ssl_set_rng(&BACKEND->ssl, ctr_drbg_random,
+ &BACKEND->ctr_drbg);
+ ssl_set_bio(&BACKEND->ssl,
net_recv, &conn->sock[sockindex],
net_send, &conn->sock[sockindex]);
- ssl_set_ciphersuites(&connssl->ssl, ssl_list_ciphersuites());
+ ssl_set_ciphersuites(&BACKEND->ssl, ssl_list_ciphersuites());
/* Check if there's a cached ID we can/should use here! */
if(SSL_SET_OPTION(primary.sessionid)) {
@@ -380,7 +392,7 @@ polarssl_connect_step1(struct connectdata *conn,
Curl_ssl_sessionid_lock(conn);
if(!Curl_ssl_getsessionid(conn, &old_session, NULL, sockindex)) {
- ret = ssl_set_session(&connssl->ssl, old_session);
+ ret = ssl_set_session(&BACKEND->ssl, old_session);
if(ret) {
Curl_ssl_sessionid_unlock(conn);
failf(data, "ssl_set_session returned -0x%x", -ret);
@@ -391,15 +403,15 @@ polarssl_connect_step1(struct connectdata *conn,
Curl_ssl_sessionid_unlock(conn);
}
- ssl_set_ca_chain(&connssl->ssl,
- &connssl->cacert,
- &connssl->crl,
+ ssl_set_ca_chain(&BACKEND->ssl,
+ &BACKEND->cacert,
+ &BACKEND->crl,
hostname);
- ssl_set_own_cert_rsa(&connssl->ssl,
- &connssl->clicert, &connssl->rsa);
+ ssl_set_own_cert_rsa(&BACKEND->ssl,
+ &BACKEND->clicert, &BACKEND->rsa);
- if(ssl_set_hostname(&connssl->ssl, hostname)) {
+ if(ssl_set_hostname(&BACKEND->ssl, hostname)) {
/* ssl_set_hostname() sets the name to use in CN/SAN checks *and* the name
to set in the SNI extension. So even if curl connects to a host
specified as an IP address, this function must be used. */
@@ -424,12 +436,12 @@ polarssl_connect_step1(struct connectdata *conn,
protocols[cur] = NULL;
- ssl_set_alpn_protocols(&connssl->ssl, protocols);
+ ssl_set_alpn_protocols(&BACKEND->ssl, protocols);
}
#endif
#ifdef POLARSSL_DEBUG
- ssl_set_dbg(&connssl->ssl, polarssl_debug, data);
+ ssl_set_dbg(&BACKEND->ssl, polarssl_debug, data);
#endif
connssl->connecting_state = ssl_connect_2;
@@ -456,7 +468,7 @@ polarssl_connect_step2(struct connectdata *conn,
conn->recv[sockindex] = polarssl_recv;
conn->send[sockindex] = polarssl_send;
- ret = ssl_handshake(&connssl->ssl);
+ ret = ssl_handshake(&BACKEND->ssl);
switch(ret) {
case 0:
@@ -478,9 +490,9 @@ polarssl_connect_step2(struct connectdata *conn,
}
infof(data, "PolarSSL: Handshake complete, cipher is %s\n",
- ssl_get_ciphersuite(&conn->ssl[sockindex].ssl) );
+ ssl_get_ciphersuite(&BACKEND->ssl) );
- ret = ssl_get_verify_result(&conn->ssl[sockindex].ssl);
+ ret = ssl_get_verify_result(&BACKEND->ssl);
if(ret && SSL_CONN_CONFIG(verifypeer)) {
if(ret & BADCERT_EXPIRED)
@@ -500,12 +512,12 @@ polarssl_connect_step2(struct connectdata *conn,
return CURLE_PEER_FAILED_VERIFICATION;
}
- if(ssl_get_peer_cert(&(connssl->ssl))) {
+ if(ssl_get_peer_cert(&(BACKEND->ssl))) {
/* If the session was resumed, there will be no peer certs */
memset(buffer, 0, sizeof(buffer));
if(x509_crt_info(buffer, sizeof(buffer), (char *)"* ",
- ssl_get_peer_cert(&(connssl->ssl))) != -1)
+ ssl_get_peer_cert(&(BACKEND->ssl))) != -1)
infof(data, "Dumping cert info:\n%s\n", buffer);
}
@@ -517,7 +529,7 @@ polarssl_connect_step2(struct connectdata *conn,
unsigned char pubkey[PUB_DER_MAX_BYTES];
const x509_crt *peercert;
- peercert = ssl_get_peer_cert(&connssl->ssl);
+ peercert = ssl_get_peer_cert(&BACKEND->ssl);
if(!peercert || !peercert->raw.p || !peercert->raw.len) {
failf(data, "Failed due to missing peer certificate");
@@ -566,7 +578,7 @@ polarssl_connect_step2(struct connectdata *conn,
#ifdef HAS_ALPN
if(conn->bits.tls_enable_alpn) {
- const char *next_protocol = ssl_get_alpn_protocol(&connssl->ssl);
+ const char *next_protocol = ssl_get_alpn_protocol(&BACKEND->ssl);
if(next_protocol != NULL) {
infof(data, "ALPN, server accepted to use %s\n", next_protocol);
@@ -614,7 +626,7 @@ polarssl_connect_step3(struct connectdata *conn,
memset(our_ssl_sessionid, 0, sizeof(ssl_session));
- ret = ssl_get_session(&connssl->ssl, our_ssl_sessionid);
+ ret = ssl_get_session(&BACKEND->ssl, our_ssl_sessionid);
if(ret) {
failf(data, "ssl_get_session returned -0x%x", -ret);
return CURLE_SSL_CONNECT_ERROR;
@@ -645,9 +657,10 @@ static ssize_t polarssl_send(struct connectdata *conn,
size_t len,
CURLcode *curlcode)
{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
int ret = -1;
- ret = ssl_write(&conn->ssl[sockindex].ssl,
+ ret = ssl_write(&BACKEND->ssl,
(unsigned char *)mem, len);
if(ret < 0) {
@@ -659,13 +672,14 @@ static ssize_t polarssl_send(struct connectdata *conn,
return ret;
}
-void Curl_polarssl_close(struct connectdata *conn, int sockindex)
+static void Curl_polarssl_close(struct connectdata *conn, int sockindex)
{
- rsa_free(&conn->ssl[sockindex].rsa);
- x509_crt_free(&conn->ssl[sockindex].clicert);
- x509_crt_free(&conn->ssl[sockindex].cacert);
- x509_crl_free(&conn->ssl[sockindex].crl);
- ssl_free(&conn->ssl[sockindex].ssl);
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ rsa_free(&BACKEND->rsa);
+ x509_crt_free(&BACKEND->clicert);
+ x509_crt_free(&BACKEND->cacert);
+ x509_crl_free(&BACKEND->crl);
+ ssl_free(&BACKEND->ssl);
}
static ssize_t polarssl_recv(struct connectdata *conn,
@@ -674,11 +688,12 @@ static ssize_t polarssl_recv(struct connectdata *conn,
size_t buffersize,
CURLcode *curlcode)
{
+ struct ssl_connect_data *connssl = &conn->ssl[num];
int ret = -1;
ssize_t len = -1;
memset(buf, 0, buffersize);
- ret = ssl_read(&conn->ssl[num].ssl, (unsigned char *)buf, buffersize);
+ ret = ssl_read(&BACKEND->ssl, (unsigned char *)buf, buffersize);
if(ret <= 0) {
if(ret == POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY)
@@ -694,7 +709,7 @@ static ssize_t polarssl_recv(struct connectdata *conn,
return len;
}
-void Curl_polarssl_session_free(void *ptr)
+static void Curl_polarssl_session_free(void *ptr)
{
ssl_session_free(ptr);
free(ptr);
@@ -703,7 +718,7 @@ void Curl_polarssl_session_free(void *ptr)
/* 1.3.10 was the first rebranded version. All new releases (in 1.3 branch and
higher) will be mbed TLS branded.. */
-size_t Curl_polarssl_version(char *buffer, size_t size)
+static size_t Curl_polarssl_version(char *buffer, size_t size)
{
unsigned int version = version_get_number();
return snprintf(buffer, size, "%s/%d.%d.%d",
@@ -762,9 +777,9 @@ polarssl_connect_common(struct connectdata *conn,
if(connssl->connecting_state == ssl_connect_2_reading ||
connssl->connecting_state == ssl_connect_2_writing) {
- curl_socket_t writefd = ssl_connect_2_writing==
+ curl_socket_t writefd = ssl_connect_2_writing ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
- curl_socket_t readfd = ssl_connect_2_reading==
+ curl_socket_t readfd = ssl_connect_2_reading ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
@@ -825,18 +840,14 @@ polarssl_connect_common(struct connectdata *conn,
return CURLE_OK;
}
-CURLcode
-Curl_polarssl_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done)
+static CURLcode Curl_polarssl_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
return polarssl_connect_common(conn, sockindex, TRUE, done);
}
-CURLcode
-Curl_polarssl_connect(struct connectdata *conn,
- int sockindex)
+static CURLcode Curl_polarssl_connect(struct connectdata *conn, int sockindex)
{
CURLcode result;
bool done = FALSE;
@@ -854,20 +865,73 @@ Curl_polarssl_connect(struct connectdata *conn,
* return 0 error initializing SSL
* return 1 SSL initialized successfully
*/
-int Curl_polarssl_init(void)
+static int Curl_polarssl_init(void)
{
return Curl_polarsslthreadlock_thread_setup();
}
-void Curl_polarssl_cleanup(void)
+static void Curl_polarssl_cleanup(void)
{
(void)Curl_polarsslthreadlock_thread_cleanup();
}
+static bool Curl_polarssl_data_pending(const struct connectdata *conn,
+ int sockindex)
+{
+ const struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ return ssl_get_bytes_avail(&BACKEND->ssl) != 0;
+}
+
+static void Curl_polarssl_sha256sum(const unsigned char *input,
+ size_t inputlen,
+ unsigned char *sha256sum,
+ size_t sha256len UNUSED_PARAM)
+{
+ (void)sha256len;
+ sha256(input, inputlen, sha256sum, 0);
+}
-int Curl_polarssl_data_pending(const struct connectdata *conn, int sockindex)
+static void *Curl_polarssl_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
{
- return ssl_get_bytes_avail(&conn->ssl[sockindex].ssl) != 0;
+ (void)info;
+ return &BACKEND->ssl;
}
+const struct Curl_ssl Curl_ssl_polarssl = {
+ { CURLSSLBACKEND_POLARSSL, "polarssl" }, /* info */
+
+ 1, /* have_ca_path */
+ 0, /* have_certinfo */
+ 1, /* have_pinnedpubkey */
+ 0, /* have_ssl_ctx */
+ 0, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_polarssl_init, /* init */
+ Curl_polarssl_cleanup, /* cleanup */
+ Curl_polarssl_version, /* version */
+ Curl_none_check_cxn, /* check_cxn */
+ Curl_none_shutdown, /* shutdown */
+ Curl_polarssl_data_pending, /* data_pending */
+ /* This might cause libcurl to use a weeker random!
+ * TODO: use Polarssl's CTR-DRBG or HMAC-DRBG
+ */
+ Curl_none_random, /* random */
+ Curl_none_cert_status_request, /* cert_status_request */
+ Curl_polarssl_connect, /* connect */
+ Curl_polarssl_connect_nonblocking, /* connect_nonblocking */
+ Curl_polarssl_get_internals, /* get_internals */
+ Curl_polarssl_close, /* close_one */
+ Curl_none_close_all, /* close_all */
+ Curl_polarssl_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_none_false_start, /* false_start */
+ Curl_none_md5sum, /* md5sum */
+ Curl_polarssl_sha256sum /* sha256sum */
+};
+
#endif /* USE_POLARSSL */
diff --git a/lib/vtls/polarssl.h b/lib/vtls/polarssl.h
index 47af7b4..23c3636 100644
--- a/lib/vtls/polarssl.h
+++ b/lib/vtls/polarssl.h
@@ -26,57 +26,7 @@
#ifdef USE_POLARSSL
-#include <polarssl/sha256.h>
-
-/* Called on first use PolarSSL, setup threading if supported */
-int Curl_polarssl_init(void);
-void Curl_polarssl_cleanup(void);
-int Curl_polarssl_data_pending(const struct connectdata *conn, int sockindex);
-
-
-CURLcode Curl_polarssl_connect(struct connectdata *conn, int sockindex);
-
-CURLcode Curl_polarssl_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done);
-
- /* close a SSL connection */
-void Curl_polarssl_close(struct connectdata *conn, int sockindex);
-
-void Curl_polarssl_session_free(void *ptr);
-size_t Curl_polarssl_version(char *buffer, size_t size);
-int Curl_polarssl_shutdown(struct connectdata *conn, int sockindex);
-
-/* Set the API backend definition to PolarSSL */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_POLARSSL
-
-/* this backend supports the CAPATH option */
-#define have_curlssl_ca_path 1
-
-/* this backends supports CURLOPT_PINNEDPUBLICKEY */
-#define have_curlssl_pinnedpubkey 1
-
-/* API setup for PolarSSL */
-#define curlssl_init() Curl_polarssl_init()
-#define curlssl_cleanup() Curl_polarssl_cleanup()
-#define curlssl_connect Curl_polarssl_connect
-#define curlssl_connect_nonblocking Curl_polarssl_connect_nonblocking
-#define curlssl_session_free(x) Curl_polarssl_session_free(x)
-#define curlssl_close_all(x) ((void)x)
-#define curlssl_close Curl_polarssl_close
-#define curlssl_shutdown(x,y) 0
-#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN)
-#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN)
-#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL)
-#define curlssl_version Curl_polarssl_version
-#define curlssl_check_cxn(x) ((void)x, -1)
-#define curlssl_data_pending(x,y) Curl_polarssl_data_pending(x, y)
-#define curlssl_sha256sum(a,b,c,d) sha256(a,b,c,0)
-
-/* This might cause libcurl to use a weeker random!
- TODO: implement proper use of Polarssl's CTR-DRBG or HMAC-DRBG and use that
-*/
-#define curlssl_random(x,y,z) ((void)x, (void)y, (void)z, CURLE_NOT_BUILT_IN)
+extern const struct Curl_ssl Curl_ssl_polarssl;
#endif /* USE_POLARSSL */
#endif /* HEADER_CURL_POLARSSL_H */
diff --git a/lib/vtls/polarssl_threadlock.c b/lib/vtls/polarssl_threadlock.c
index b1eb7b7..dd5fbd7 100644
--- a/lib/vtls/polarssl_threadlock.c
+++ b/lib/vtls/polarssl_threadlock.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013-2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013-2017, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
*
* This software is licensed as described in the file COPYING, which
@@ -114,7 +114,7 @@ int Curl_polarsslthreadlock_lock_function(int n)
}
#elif defined(HAVE_PROCESS_H)
if(n < NUMT) {
- ret = (WaitForSingleObject(mutex_buf[n], INFINITE)==WAIT_FAILED?1:0);
+ ret = (WaitForSingleObject(mutex_buf[n], INFINITE) == WAIT_FAILED?1:0);
if(ret) {
DEBUGF(fprintf(stderr,
"Error: polarsslthreadlock_lock_function failed\n"));
diff --git a/lib/vtls/schannel.c b/lib/vtls/schannel.c
index 9460301..85c64cf 100644
--- a/lib/vtls/schannel.c
+++ b/lib/vtls/schannel.c
@@ -46,6 +46,8 @@
# error "Can't compile SCHANNEL support without SSPI."
#endif
+#include <schnlsp.h>
+#include <schannel.h>
#include "curl_sspi.h"
#include "schannel.h"
#include "vtls.h"
@@ -74,11 +76,92 @@
# define HAS_ALPN 1
#endif
+#ifndef UNISP_NAME_A
+#define UNISP_NAME_A "Microsoft Unified Security Protocol Provider"
+#endif
+
+#ifndef UNISP_NAME_W
+#define UNISP_NAME_W L"Microsoft Unified Security Protocol Provider"
+#endif
+
+#ifndef UNISP_NAME
+#ifdef UNICODE
+#define UNISP_NAME UNISP_NAME_W
+#else
+#define UNISP_NAME UNISP_NAME_A
+#endif
+#endif
+
+#ifndef SP_PROT_SSL2_CLIENT
+#define SP_PROT_SSL2_CLIENT 0x00000008
+#endif
+
+#ifndef SP_PROT_SSL3_CLIENT
+#define SP_PROT_SSL3_CLIENT 0x00000008
+#endif
+
+#ifndef SP_PROT_TLS1_CLIENT
+#define SP_PROT_TLS1_CLIENT 0x00000080
+#endif
+
+#ifndef SP_PROT_TLS1_0_CLIENT
+#define SP_PROT_TLS1_0_CLIENT SP_PROT_TLS1_CLIENT
+#endif
+
+#ifndef SP_PROT_TLS1_1_CLIENT
+#define SP_PROT_TLS1_1_CLIENT 0x00000200
+#endif
+
+#ifndef SP_PROT_TLS1_2_CLIENT
+#define SP_PROT_TLS1_2_CLIENT 0x00000800
+#endif
+
+#ifndef SECBUFFER_ALERT
+#define SECBUFFER_ALERT 17
+#endif
+
+/* Both schannel buffer sizes must be > 0 */
+#define CURL_SCHANNEL_BUFFER_INIT_SIZE 4096
+#define CURL_SCHANNEL_BUFFER_FREE_SIZE 1024
+
/* Uncomment to force verbose output
* #define infof(x, y, ...) printf(y, __VA_ARGS__)
* #define failf(x, y, ...) printf(y, __VA_ARGS__)
*/
+/* Structs to store Schannel handles */
+struct curl_schannel_cred {
+ CredHandle cred_handle;
+ TimeStamp time_stamp;
+ int refcount;
+};
+
+struct curl_schannel_ctxt {
+ CtxtHandle ctxt_handle;
+ TimeStamp time_stamp;
+};
+
+struct ssl_backend_data {
+ struct curl_schannel_cred *cred;
+ struct curl_schannel_ctxt *ctxt;
+ SecPkgContext_StreamSizes stream_sizes;
+ size_t encdata_length, decdata_length;
+ size_t encdata_offset, decdata_offset;
+ unsigned char *encdata_buffer, *decdata_buffer;
+ /* encdata_is_incomplete: if encdata contains only a partial record that
+ can't be decrypted without another Curl_read_plain (that is, status is
+ SEC_E_INCOMPLETE_MESSAGE) then set this true. after Curl_read_plain writes
+ more bytes into encdata then set this back to false. */
+ bool encdata_is_incomplete;
+ unsigned long req_flags, ret_flags;
+ CURLcode recv_unrecoverable_err; /* schannel_recv had an unrecoverable err */
+ bool recv_sspi_close_notify; /* true if connection closed by close_notify */
+ bool recv_connection_closed; /* true if connection closed, regardless how */
+ bool use_alpn; /* true if ALPN is used for this connection */
+};
+
+#define BACKEND connssl->backend
+
static Curl_recv schannel_recv;
static Curl_send schannel_send;
@@ -176,33 +259,33 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
#ifdef HAS_ALPN
/* ALPN is only supported on Windows 8.1 / Server 2012 R2 and above.
Also it doesn't seem to be supported for Wine, see curl bug #983. */
- connssl->use_alpn = conn->bits.tls_enable_alpn &&
+ BACKEND->use_alpn = conn->bits.tls_enable_alpn &&
!GetProcAddress(GetModuleHandleA("ntdll"),
"wine_get_version") &&
Curl_verify_windows_version(6, 3, PLATFORM_WINNT,
VERSION_GREATER_THAN_EQUAL);
#else
- connssl->use_alpn = false;
+ BACKEND->use_alpn = false;
#endif
- connssl->cred = NULL;
+ BACKEND->cred = NULL;
/* check for an existing re-usable credential handle */
if(SSL_SET_OPTION(primary.sessionid)) {
Curl_ssl_sessionid_lock(conn);
if(!Curl_ssl_getsessionid(conn, (void **)&old_cred, NULL, sockindex)) {
- connssl->cred = old_cred;
+ BACKEND->cred = old_cred;
infof(data, "schannel: re-using existing credential handle\n");
/* increment the reference counter of the credential/session handle */
- connssl->cred->refcount++;
+ BACKEND->cred->refcount++;
infof(data, "schannel: incremented credential handle refcount = %d\n",
- connssl->cred->refcount);
+ BACKEND->cred->refcount);
}
Curl_ssl_sessionid_unlock(conn);
}
- if(!connssl->cred) {
+ if(!BACKEND->cred) {
/* setup Schannel API options */
memset(&schannel_cred, 0, sizeof(schannel_cred));
schannel_cred.dwVersion = SCHANNEL_CRED_VERSION;
@@ -272,14 +355,14 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
}
/* allocate memory for the re-usable credential handle */
- connssl->cred = (struct curl_schannel_cred *)
+ BACKEND->cred = (struct curl_schannel_cred *)
malloc(sizeof(struct curl_schannel_cred));
- if(!connssl->cred) {
+ if(!BACKEND->cred) {
failf(data, "schannel: unable to allocate memory");
return CURLE_OUT_OF_MEMORY;
}
- memset(connssl->cred, 0, sizeof(struct curl_schannel_cred));
- connssl->cred->refcount = 1;
+ memset(BACKEND->cred, 0, sizeof(struct curl_schannel_cred));
+ BACKEND->cred->refcount = 1;
/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa374716.aspx
*/
@@ -287,8 +370,8 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
s_pSecFn->AcquireCredentialsHandle(NULL, (TCHAR *)UNISP_NAME,
SECPKG_CRED_OUTBOUND, NULL,
&schannel_cred, NULL, NULL,
- &connssl->cred->cred_handle,
- &connssl->cred->time_stamp);
+ &BACKEND->cred->cred_handle,
+ &BACKEND->cred->time_stamp);
if(sspi_status != SEC_E_OK) {
if(sspi_status == SEC_E_WRONG_PRINCIPAL)
@@ -297,7 +380,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
else
failf(data, "schannel: AcquireCredentialsHandle failed: %s",
Curl_sspi_strerror(conn, sspi_status));
- Curl_safefree(connssl->cred);
+ Curl_safefree(BACKEND->cred);
return CURLE_SSL_CONNECT_ERROR;
}
}
@@ -312,7 +395,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
}
#ifdef HAS_ALPN
- if(connssl->use_alpn) {
+ if(BACKEND->use_alpn) {
int cur = 0;
int list_start_index = 0;
unsigned int *extension_len = NULL;
@@ -370,18 +453,18 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
InitSecBufferDesc(&outbuf_desc, &outbuf, 1);
/* setup request flags */
- connssl->req_flags = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT |
+ BACKEND->req_flags = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT |
ISC_REQ_CONFIDENTIALITY | ISC_REQ_ALLOCATE_MEMORY |
ISC_REQ_STREAM;
/* allocate memory for the security context handle */
- connssl->ctxt = (struct curl_schannel_ctxt *)
+ BACKEND->ctxt = (struct curl_schannel_ctxt *)
malloc(sizeof(struct curl_schannel_ctxt));
- if(!connssl->ctxt) {
+ if(!BACKEND->ctxt) {
failf(data, "schannel: unable to allocate memory");
return CURLE_OUT_OF_MEMORY;
}
- memset(connssl->ctxt, 0, sizeof(struct curl_schannel_ctxt));
+ memset(BACKEND->ctxt, 0, sizeof(struct curl_schannel_ctxt));
host_name = Curl_convert_UTF8_to_tchar(hostname);
if(!host_name)
@@ -395,10 +478,10 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
us problems with inbuf regardless. https://github.com/curl/curl/issues/983
*/
sspi_status = s_pSecFn->InitializeSecurityContext(
- &connssl->cred->cred_handle, NULL, host_name, connssl->req_flags, 0, 0,
- (connssl->use_alpn ? &inbuf_desc : NULL),
- 0, &connssl->ctxt->ctxt_handle,
- &outbuf_desc, &connssl->ret_flags, &connssl->ctxt->time_stamp);
+ &BACKEND->cred->cred_handle, NULL, host_name, BACKEND->req_flags, 0, 0,
+ (BACKEND->use_alpn ? &inbuf_desc : NULL),
+ 0, &BACKEND->ctxt->ctxt_handle,
+ &outbuf_desc, &BACKEND->ret_flags, &BACKEND->ctxt->time_stamp);
Curl_unicodefree(host_name);
@@ -409,7 +492,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
else
failf(data, "schannel: initial InitializeSecurityContext failed: %s",
Curl_sspi_strerror(conn, sspi_status));
- Curl_safefree(connssl->ctxt);
+ Curl_safefree(BACKEND->ctxt);
return CURLE_SSL_CONNECT_ERROR;
}
@@ -429,10 +512,10 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
infof(data, "schannel: sent initial handshake data: "
"sent %zd bytes\n", written);
- connssl->recv_unrecoverable_err = CURLE_OK;
- connssl->recv_sspi_close_notify = false;
- connssl->recv_connection_closed = false;
- connssl->encdata_is_incomplete = false;
+ BACKEND->recv_unrecoverable_err = CURLE_OK;
+ BACKEND->recv_sspi_close_notify = false;
+ BACKEND->recv_connection_closed = false;
+ BACKEND->encdata_is_incomplete = false;
/* continue to second handshake step */
connssl->connecting_state = ssl_connect_2;
@@ -465,39 +548,39 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
infof(data, "schannel: SSL/TLS connection with %s port %hu (step 2/3)\n",
hostname, conn->remote_port);
- if(!connssl->cred || !connssl->ctxt)
+ if(!BACKEND->cred || !BACKEND->ctxt)
return CURLE_SSL_CONNECT_ERROR;
/* buffer to store previously received and decrypted data */
- if(connssl->decdata_buffer == NULL) {
- connssl->decdata_offset = 0;
- connssl->decdata_length = CURL_SCHANNEL_BUFFER_INIT_SIZE;
- connssl->decdata_buffer = malloc(connssl->decdata_length);
- if(connssl->decdata_buffer == NULL) {
+ if(BACKEND->decdata_buffer == NULL) {
+ BACKEND->decdata_offset = 0;
+ BACKEND->decdata_length = CURL_SCHANNEL_BUFFER_INIT_SIZE;
+ BACKEND->decdata_buffer = malloc(BACKEND->decdata_length);
+ if(BACKEND->decdata_buffer == NULL) {
failf(data, "schannel: unable to allocate memory");
return CURLE_OUT_OF_MEMORY;
}
}
/* buffer to store previously received and encrypted data */
- if(connssl->encdata_buffer == NULL) {
- connssl->encdata_is_incomplete = false;
- connssl->encdata_offset = 0;
- connssl->encdata_length = CURL_SCHANNEL_BUFFER_INIT_SIZE;
- connssl->encdata_buffer = malloc(connssl->encdata_length);
- if(connssl->encdata_buffer == NULL) {
+ if(BACKEND->encdata_buffer == NULL) {
+ BACKEND->encdata_is_incomplete = false;
+ BACKEND->encdata_offset = 0;
+ BACKEND->encdata_length = CURL_SCHANNEL_BUFFER_INIT_SIZE;
+ BACKEND->encdata_buffer = malloc(BACKEND->encdata_length);
+ if(BACKEND->encdata_buffer == NULL) {
failf(data, "schannel: unable to allocate memory");
return CURLE_OUT_OF_MEMORY;
}
}
/* if we need a bigger buffer to read a full message, increase buffer now */
- if(connssl->encdata_length - connssl->encdata_offset <
+ if(BACKEND->encdata_length - BACKEND->encdata_offset <
CURL_SCHANNEL_BUFFER_FREE_SIZE) {
/* increase internal encrypted data buffer */
- reallocated_length = connssl->encdata_offset +
+ reallocated_length = BACKEND->encdata_offset +
CURL_SCHANNEL_BUFFER_FREE_SIZE;
- reallocated_buffer = realloc(connssl->encdata_buffer,
+ reallocated_buffer = realloc(BACKEND->encdata_buffer,
reallocated_length);
if(reallocated_buffer == NULL) {
@@ -505,8 +588,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
return CURLE_OUT_OF_MEMORY;
}
else {
- connssl->encdata_buffer = reallocated_buffer;
- connssl->encdata_length = reallocated_length;
+ BACKEND->encdata_buffer = reallocated_buffer;
+ BACKEND->encdata_length = reallocated_length;
}
}
@@ -514,10 +597,10 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
if(doread) {
/* read encrypted handshake data from socket */
result = Curl_read_plain(conn->sock[sockindex],
- (char *) (connssl->encdata_buffer +
- connssl->encdata_offset),
- connssl->encdata_length -
- connssl->encdata_offset,
+ (char *) (BACKEND->encdata_buffer +
+ BACKEND->encdata_offset),
+ BACKEND->encdata_length -
+ BACKEND->encdata_offset,
&nread);
if(result == CURLE_AGAIN) {
if(connssl->connecting_state != ssl_connect_2_writing)
@@ -533,17 +616,17 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
}
/* increase encrypted data buffer offset */
- connssl->encdata_offset += nread;
- connssl->encdata_is_incomplete = false;
+ BACKEND->encdata_offset += nread;
+ BACKEND->encdata_is_incomplete = false;
infof(data, "schannel: encrypted data got %zd\n", nread);
}
infof(data, "schannel: encrypted data buffer: offset %zu length %zu\n",
- connssl->encdata_offset, connssl->encdata_length);
+ BACKEND->encdata_offset, BACKEND->encdata_length);
/* setup input buffers */
- InitSecBuffer(&inbuf[0], SECBUFFER_TOKEN, malloc(connssl->encdata_offset),
- curlx_uztoul(connssl->encdata_offset));
+ InitSecBuffer(&inbuf[0], SECBUFFER_TOKEN, malloc(BACKEND->encdata_offset),
+ curlx_uztoul(BACKEND->encdata_offset));
InitSecBuffer(&inbuf[1], SECBUFFER_EMPTY, NULL, 0);
InitSecBufferDesc(&inbuf_desc, inbuf, 2);
@@ -559,8 +642,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
}
/* copy received handshake data into input buffer */
- memcpy(inbuf[0].pvBuffer, connssl->encdata_buffer,
- connssl->encdata_offset);
+ memcpy(inbuf[0].pvBuffer, BACKEND->encdata_buffer,
+ BACKEND->encdata_offset);
host_name = Curl_convert_UTF8_to_tchar(hostname);
if(!host_name)
@@ -569,9 +652,9 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa375924.aspx
*/
sspi_status = s_pSecFn->InitializeSecurityContext(
- &connssl->cred->cred_handle, &connssl->ctxt->ctxt_handle,
- host_name, connssl->req_flags, 0, 0, &inbuf_desc, 0, NULL,
- &outbuf_desc, &connssl->ret_flags, &connssl->ctxt->time_stamp);
+ &BACKEND->cred->cred_handle, &BACKEND->ctxt->ctxt_handle,
+ host_name, BACKEND->req_flags, 0, 0, &inbuf_desc, 0, NULL,
+ &outbuf_desc, &BACKEND->ret_flags, &BACKEND->ctxt->time_stamp);
Curl_unicodefree(host_name);
@@ -580,7 +663,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
/* check if the handshake was incomplete */
if(sspi_status == SEC_E_INCOMPLETE_MESSAGE) {
- connssl->encdata_is_incomplete = true;
+ BACKEND->encdata_is_incomplete = true;
connssl->connecting_state = ssl_connect_2_reading;
infof(data, "schannel: received incomplete message, need more data\n");
return CURLE_OK;
@@ -590,8 +673,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
the handshake without one. This will allow connections to servers which
request a client certificate but do not require it. */
if(sspi_status == SEC_I_INCOMPLETE_CREDENTIALS &&
- !(connssl->req_flags & ISC_REQ_USE_SUPPLIED_CREDS)) {
- connssl->req_flags |= ISC_REQ_USE_SUPPLIED_CREDS;
+ !(BACKEND->req_flags & ISC_REQ_USE_SUPPLIED_CREDS)) {
+ BACKEND->req_flags |= ISC_REQ_USE_SUPPLIED_CREDS;
connssl->connecting_state = ssl_connect_2_writing;
infof(data, "schannel: a client certificate has been requested\n");
return CURLE_OK;
@@ -631,7 +714,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
failf(data, "schannel: next InitializeSecurityContext failed: %s",
Curl_sspi_strerror(conn, sspi_status));
return sspi_status == SEC_E_UNTRUSTED_ROOT ?
- CURLE_SSL_CACERT_BADFILE : CURLE_SSL_CONNECT_ERROR;
+ CURLE_SSL_CACERT : CURLE_SSL_CONNECT_ERROR;
}
/* check if there was additional remaining encrypted data */
@@ -649,11 +732,11 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
*/
/* check if the remaining data is less than the total amount
and therefore begins after the already processed data */
- if(connssl->encdata_offset > inbuf[1].cbBuffer) {
- memmove(connssl->encdata_buffer,
- (connssl->encdata_buffer + connssl->encdata_offset) -
+ if(BACKEND->encdata_offset > inbuf[1].cbBuffer) {
+ memmove(BACKEND->encdata_buffer,
+ (BACKEND->encdata_buffer + BACKEND->encdata_offset) -
inbuf[1].cbBuffer, inbuf[1].cbBuffer);
- connssl->encdata_offset = inbuf[1].cbBuffer;
+ BACKEND->encdata_offset = inbuf[1].cbBuffer;
if(sspi_status == SEC_I_CONTINUE_NEEDED) {
doread = FALSE;
continue;
@@ -661,7 +744,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
}
}
else {
- connssl->encdata_offset = 0;
+ BACKEND->encdata_offset = 0;
}
break;
}
@@ -709,27 +792,27 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
infof(data, "schannel: SSL/TLS connection with %s port %hu (step 3/3)\n",
hostname, conn->remote_port);
- if(!connssl->cred)
+ if(!BACKEND->cred)
return CURLE_SSL_CONNECT_ERROR;
/* check if the required context attributes are met */
- if(connssl->ret_flags != connssl->req_flags) {
- if(!(connssl->ret_flags & ISC_RET_SEQUENCE_DETECT))
+ if(BACKEND->ret_flags != BACKEND->req_flags) {
+ if(!(BACKEND->ret_flags & ISC_RET_SEQUENCE_DETECT))
failf(data, "schannel: failed to setup sequence detection");
- if(!(connssl->ret_flags & ISC_RET_REPLAY_DETECT))
+ if(!(BACKEND->ret_flags & ISC_RET_REPLAY_DETECT))
failf(data, "schannel: failed to setup replay detection");
- if(!(connssl->ret_flags & ISC_RET_CONFIDENTIALITY))
+ if(!(BACKEND->ret_flags & ISC_RET_CONFIDENTIALITY))
failf(data, "schannel: failed to setup confidentiality");
- if(!(connssl->ret_flags & ISC_RET_ALLOCATED_MEMORY))
+ if(!(BACKEND->ret_flags & ISC_RET_ALLOCATED_MEMORY))
failf(data, "schannel: failed to setup memory allocation");
- if(!(connssl->ret_flags & ISC_RET_STREAM))
+ if(!(BACKEND->ret_flags & ISC_RET_STREAM))
failf(data, "schannel: failed to setup stream orientation");
return CURLE_SSL_CONNECT_ERROR;
}
#ifdef HAS_ALPN
- if(connssl->use_alpn) {
- sspi_status = s_pSecFn->QueryContextAttributes(&connssl->ctxt->ctxt_handle,
+ if(BACKEND->use_alpn) {
+ sspi_status = s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
SECPKG_ATTR_APPLICATION_PROTOCOL, &alpn_result);
if(sspi_status != SEC_E_OK) {
@@ -771,7 +854,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
incache = !(Curl_ssl_getsessionid(conn, (void **)&old_cred, NULL,
sockindex));
if(incache) {
- if(old_cred != connssl->cred) {
+ if(old_cred != BACKEND->cred) {
infof(data, "schannel: old credential handle is stale, removing\n");
/* we're not taking old_cred ownership here, no refcount++ is needed */
Curl_ssl_delsessionid(conn, (void *)old_cred);
@@ -779,7 +862,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
}
}
if(!incache) {
- result = Curl_ssl_addsessionid(conn, (void *)connssl->cred,
+ result = Curl_ssl_addsessionid(conn, (void *)BACKEND->cred,
sizeof(struct curl_schannel_cred),
sockindex);
if(result) {
@@ -789,7 +872,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
}
else {
/* this cred session is now also referenced by sessionid cache */
- connssl->cred->refcount++;
+ BACKEND->cred->refcount++;
infof(data, "schannel: stored credential handle in session cache\n");
}
}
@@ -797,7 +880,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
}
if(data->set.ssl.certinfo) {
- sspi_status = s_pSecFn->QueryContextAttributes(&connssl->ctxt->ctxt_handle,
+ sspi_status = s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
SECPKG_ATTR_REMOTE_CERT_CONTEXT, &ccert_context);
if((sspi_status != SEC_E_OK) || (ccert_context == NULL)) {
@@ -951,11 +1034,11 @@ schannel_send(struct connectdata *conn, int sockindex,
CURLcode result;
/* check if the maximum stream sizes were queried */
- if(connssl->stream_sizes.cbMaximumMessage == 0) {
+ if(BACKEND->stream_sizes.cbMaximumMessage == 0) {
sspi_status = s_pSecFn->QueryContextAttributes(
- &connssl->ctxt->ctxt_handle,
+ &BACKEND->ctxt->ctxt_handle,
SECPKG_ATTR_STREAM_SIZES,
- &connssl->stream_sizes);
+ &BACKEND->stream_sizes);
if(sspi_status != SEC_E_OK) {
*err = CURLE_SEND_ERROR;
return -1;
@@ -963,14 +1046,13 @@ schannel_send(struct connectdata *conn, int sockindex,
}
/* check if the buffer is longer than the maximum message length */
- if(len > connssl->stream_sizes.cbMaximumMessage) {
- *err = CURLE_SEND_ERROR;
- return -1;
+ if(len > BACKEND->stream_sizes.cbMaximumMessage) {
+ len = BACKEND->stream_sizes.cbMaximumMessage;
}
/* calculate the complete message length and allocate a buffer for it */
- data_len = connssl->stream_sizes.cbHeader + len +
- connssl->stream_sizes.cbTrailer;
+ data_len = BACKEND->stream_sizes.cbHeader + len +
+ BACKEND->stream_sizes.cbTrailer;
data = (unsigned char *) malloc(data_len);
if(data == NULL) {
*err = CURLE_OUT_OF_MEMORY;
@@ -979,12 +1061,12 @@ schannel_send(struct connectdata *conn, int sockindex,
/* setup output buffers (header, data, trailer, empty) */
InitSecBuffer(&outbuf[0], SECBUFFER_STREAM_HEADER,
- data, connssl->stream_sizes.cbHeader);
+ data, BACKEND->stream_sizes.cbHeader);
InitSecBuffer(&outbuf[1], SECBUFFER_DATA,
- data + connssl->stream_sizes.cbHeader, curlx_uztoul(len));
+ data + BACKEND->stream_sizes.cbHeader, curlx_uztoul(len));
InitSecBuffer(&outbuf[2], SECBUFFER_STREAM_TRAILER,
- data + connssl->stream_sizes.cbHeader + len,
- connssl->stream_sizes.cbTrailer);
+ data + BACKEND->stream_sizes.cbHeader + len,
+ BACKEND->stream_sizes.cbTrailer);
InitSecBuffer(&outbuf[3], SECBUFFER_EMPTY, NULL, 0);
InitSecBufferDesc(&outbuf_desc, outbuf, 4);
@@ -992,7 +1074,7 @@ schannel_send(struct connectdata *conn, int sockindex,
memcpy(outbuf[1].pvBuffer, buf, len);
/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa375390.aspx */
- sspi_status = s_pSecFn->EncryptMessage(&connssl->ctxt->ctxt_handle, 0,
+ sspi_status = s_pSecFn->EncryptMessage(&BACKEND->ctxt->ctxt_handle, 0,
&outbuf_desc, 0);
/* check if the message was encrypted */
@@ -1102,7 +1184,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
size_t min_encdata_length = len + CURL_SCHANNEL_BUFFER_FREE_SIZE;
/****************************************************************************
- * Don't return or set connssl->recv_unrecoverable_err unless in the cleanup.
+ * Don't return or set BACKEND->recv_unrecoverable_err unless in the cleanup.
* The pattern for return error is set *err, optional infof, goto cleanup.
*
* Our priority is to always return as much decrypted data to the caller as
@@ -1114,16 +1196,16 @@ schannel_recv(struct connectdata *conn, int sockindex,
infof(data, "schannel: client wants to read %zu bytes\n", len);
*err = CURLE_OK;
- if(len && len <= connssl->decdata_offset) {
+ if(len && len <= BACKEND->decdata_offset) {
infof(data, "schannel: enough decrypted data is already available\n");
goto cleanup;
}
- else if(connssl->recv_unrecoverable_err) {
- *err = connssl->recv_unrecoverable_err;
+ else if(BACKEND->recv_unrecoverable_err) {
+ *err = BACKEND->recv_unrecoverable_err;
infof(data, "schannel: an unrecoverable error occurred in a prior call\n");
goto cleanup;
}
- else if(connssl->recv_sspi_close_notify) {
+ else if(BACKEND->recv_sspi_close_notify) {
/* once a server has indicated shutdown there is no more encrypted data */
infof(data, "schannel: server indicated shutdown in a prior call\n");
goto cleanup;
@@ -1135,17 +1217,17 @@ schannel_recv(struct connectdata *conn, int sockindex,
*/
; /* do nothing */
}
- else if(!connssl->recv_connection_closed) {
+ else if(!BACKEND->recv_connection_closed) {
/* increase enc buffer in order to fit the requested amount of data */
- size = connssl->encdata_length - connssl->encdata_offset;
+ size = BACKEND->encdata_length - BACKEND->encdata_offset;
if(size < CURL_SCHANNEL_BUFFER_FREE_SIZE ||
- connssl->encdata_length < min_encdata_length) {
- reallocated_length = connssl->encdata_offset +
+ BACKEND->encdata_length < min_encdata_length) {
+ reallocated_length = BACKEND->encdata_offset +
CURL_SCHANNEL_BUFFER_FREE_SIZE;
if(reallocated_length < min_encdata_length) {
reallocated_length = min_encdata_length;
}
- reallocated_buffer = realloc(connssl->encdata_buffer,
+ reallocated_buffer = realloc(BACKEND->encdata_buffer,
reallocated_length);
if(reallocated_buffer == NULL) {
*err = CURLE_OUT_OF_MEMORY;
@@ -1153,20 +1235,20 @@ schannel_recv(struct connectdata *conn, int sockindex,
goto cleanup;
}
- connssl->encdata_buffer = reallocated_buffer;
- connssl->encdata_length = reallocated_length;
- size = connssl->encdata_length - connssl->encdata_offset;
+ BACKEND->encdata_buffer = reallocated_buffer;
+ BACKEND->encdata_length = reallocated_length;
+ size = BACKEND->encdata_length - BACKEND->encdata_offset;
infof(data, "schannel: encdata_buffer resized %zu\n",
- connssl->encdata_length);
+ BACKEND->encdata_length);
}
infof(data, "schannel: encrypted data buffer: offset %zu length %zu\n",
- connssl->encdata_offset, connssl->encdata_length);
+ BACKEND->encdata_offset, BACKEND->encdata_length);
/* read encrypted data from socket */
*err = Curl_read_plain(conn->sock[sockindex],
- (char *)(connssl->encdata_buffer +
- connssl->encdata_offset),
+ (char *)(BACKEND->encdata_buffer +
+ BACKEND->encdata_offset),
size, &nread);
if(*err) {
nread = -1;
@@ -1178,26 +1260,26 @@ schannel_recv(struct connectdata *conn, int sockindex,
infof(data, "schannel: Curl_read_plain returned error %d\n", *err);
}
else if(nread == 0) {
- connssl->recv_connection_closed = true;
+ BACKEND->recv_connection_closed = true;
infof(data, "schannel: server closed the connection\n");
}
else if(nread > 0) {
- connssl->encdata_offset += (size_t)nread;
- connssl->encdata_is_incomplete = false;
+ BACKEND->encdata_offset += (size_t)nread;
+ BACKEND->encdata_is_incomplete = false;
infof(data, "schannel: encrypted data got %zd\n", nread);
}
}
infof(data, "schannel: encrypted data buffer: offset %zu length %zu\n",
- connssl->encdata_offset, connssl->encdata_length);
+ BACKEND->encdata_offset, BACKEND->encdata_length);
/* decrypt loop */
- while(connssl->encdata_offset > 0 && sspi_status == SEC_E_OK &&
- (!len || connssl->decdata_offset < len ||
- connssl->recv_connection_closed)) {
+ while(BACKEND->encdata_offset > 0 && sspi_status == SEC_E_OK &&
+ (!len || BACKEND->decdata_offset < len ||
+ BACKEND->recv_connection_closed)) {
/* prepare data buffer for DecryptMessage call */
- InitSecBuffer(&inbuf[0], SECBUFFER_DATA, connssl->encdata_buffer,
- curlx_uztoul(connssl->encdata_offset));
+ InitSecBuffer(&inbuf[0], SECBUFFER_DATA, BACKEND->encdata_buffer,
+ curlx_uztoul(BACKEND->encdata_offset));
/* we need 3 more empty input buffers for possible output */
InitSecBuffer(&inbuf[1], SECBUFFER_EMPTY, NULL, 0);
@@ -1207,7 +1289,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa375348.aspx
*/
- sspi_status = s_pSecFn->DecryptMessage(&connssl->ctxt->ctxt_handle,
+ sspi_status = s_pSecFn->DecryptMessage(&BACKEND->ctxt->ctxt_handle,
&inbuf_desc, 0, NULL);
/* check if everything went fine (server may want to renegotiate
@@ -1223,36 +1305,36 @@ schannel_recv(struct connectdata *conn, int sockindex,
/* increase buffer in order to fit the received amount of data */
size = inbuf[1].cbBuffer > CURL_SCHANNEL_BUFFER_FREE_SIZE ?
inbuf[1].cbBuffer : CURL_SCHANNEL_BUFFER_FREE_SIZE;
- if(connssl->decdata_length - connssl->decdata_offset < size ||
- connssl->decdata_length < len) {
+ if(BACKEND->decdata_length - BACKEND->decdata_offset < size ||
+ BACKEND->decdata_length < len) {
/* increase internal decrypted data buffer */
- reallocated_length = connssl->decdata_offset + size;
+ reallocated_length = BACKEND->decdata_offset + size;
/* make sure that the requested amount of data fits */
if(reallocated_length < len) {
reallocated_length = len;
}
- reallocated_buffer = realloc(connssl->decdata_buffer,
+ reallocated_buffer = realloc(BACKEND->decdata_buffer,
reallocated_length);
if(reallocated_buffer == NULL) {
*err = CURLE_OUT_OF_MEMORY;
failf(data, "schannel: unable to re-allocate memory");
goto cleanup;
}
- connssl->decdata_buffer = reallocated_buffer;
- connssl->decdata_length = reallocated_length;
+ BACKEND->decdata_buffer = reallocated_buffer;
+ BACKEND->decdata_length = reallocated_length;
}
/* copy decrypted data to internal buffer */
size = inbuf[1].cbBuffer;
if(size) {
- memcpy(connssl->decdata_buffer + connssl->decdata_offset,
+ memcpy(BACKEND->decdata_buffer + BACKEND->decdata_offset,
inbuf[1].pvBuffer, size);
- connssl->decdata_offset += size;
+ BACKEND->decdata_offset += size;
}
infof(data, "schannel: decrypted data added: %zu\n", size);
infof(data, "schannel: decrypted data cached: offset %zu length %zu\n",
- connssl->decdata_offset, connssl->decdata_length);
+ BACKEND->decdata_offset, BACKEND->decdata_length);
}
/* check for remaining encrypted data */
@@ -1263,21 +1345,21 @@ schannel_recv(struct connectdata *conn, int sockindex,
/* check if the remaining data is less than the total amount
* and therefore begins after the already processed data
*/
- if(connssl->encdata_offset > inbuf[3].cbBuffer) {
+ if(BACKEND->encdata_offset > inbuf[3].cbBuffer) {
/* move remaining encrypted data forward to the beginning of
buffer */
- memmove(connssl->encdata_buffer,
- (connssl->encdata_buffer + connssl->encdata_offset) -
+ memmove(BACKEND->encdata_buffer,
+ (BACKEND->encdata_buffer + BACKEND->encdata_offset) -
inbuf[3].cbBuffer, inbuf[3].cbBuffer);
- connssl->encdata_offset = inbuf[3].cbBuffer;
+ BACKEND->encdata_offset = inbuf[3].cbBuffer;
}
infof(data, "schannel: encrypted data cached: offset %zu length %zu\n",
- connssl->encdata_offset, connssl->encdata_length);
+ BACKEND->encdata_offset, BACKEND->encdata_length);
}
else {
/* reset encrypted buffer offset, because there is no data remaining */
- connssl->encdata_offset = 0;
+ BACKEND->encdata_offset = 0;
}
/* check if server wants to renegotiate the connection context */
@@ -1287,7 +1369,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
infof(data, "schannel: can't renogotiate, an error is pending\n");
goto cleanup;
}
- if(connssl->encdata_offset) {
+ if(BACKEND->encdata_offset) {
*err = CURLE_RECV_ERROR;
infof(data, "schannel: can't renogotiate, "
"encrypted data available\n");
@@ -1311,16 +1393,16 @@ schannel_recv(struct connectdata *conn, int sockindex,
else if(sspi_status == SEC_I_CONTEXT_EXPIRED) {
/* In Windows 2000 SEC_I_CONTEXT_EXPIRED (close_notify) is not
returned so we have to work around that in cleanup. */
- connssl->recv_sspi_close_notify = true;
- if(!connssl->recv_connection_closed) {
- connssl->recv_connection_closed = true;
+ BACKEND->recv_sspi_close_notify = true;
+ if(!BACKEND->recv_connection_closed) {
+ BACKEND->recv_connection_closed = true;
infof(data, "schannel: server closed the connection\n");
}
goto cleanup;
}
}
else if(sspi_status == SEC_E_INCOMPLETE_MESSAGE) {
- connssl->encdata_is_incomplete = true;
+ BACKEND->encdata_is_incomplete = true;
if(!*err)
*err = CURLE_AGAIN;
infof(data, "schannel: failed to decrypt data, need more data\n");
@@ -1335,10 +1417,10 @@ schannel_recv(struct connectdata *conn, int sockindex,
}
infof(data, "schannel: encrypted data buffer: offset %zu length %zu\n",
- connssl->encdata_offset, connssl->encdata_length);
+ BACKEND->encdata_offset, BACKEND->encdata_length);
infof(data, "schannel: decrypted data buffer: offset %zu length %zu\n",
- connssl->decdata_offset, connssl->decdata_length);
+ BACKEND->decdata_offset, BACKEND->decdata_length);
cleanup:
/* Warning- there is no guarantee the encdata state is valid at this point */
@@ -1352,13 +1434,13 @@ cleanup:
return close_notify. In that case if the connection was closed we assume it
was graceful (close_notify) since there doesn't seem to be a way to tell.
*/
- if(len && !connssl->decdata_offset && connssl->recv_connection_closed &&
- !connssl->recv_sspi_close_notify) {
+ if(len && !BACKEND->decdata_offset && BACKEND->recv_connection_closed &&
+ !BACKEND->recv_sspi_close_notify) {
bool isWin2k = Curl_verify_windows_version(5, 0, PLATFORM_WINNT,
VERSION_EQUAL);
if(isWin2k && sspi_status == SEC_E_OK)
- connssl->recv_sspi_close_notify = true;
+ BACKEND->recv_sspi_close_notify = true;
else {
*err = CURLE_RECV_ERROR;
infof(data, "schannel: server closed abruptly (missing close_notify)\n");
@@ -1367,23 +1449,23 @@ cleanup:
/* Any error other than CURLE_AGAIN is an unrecoverable error. */
if(*err && *err != CURLE_AGAIN)
- connssl->recv_unrecoverable_err = *err;
+ BACKEND->recv_unrecoverable_err = *err;
- size = len < connssl->decdata_offset ? len : connssl->decdata_offset;
+ size = len < BACKEND->decdata_offset ? len : BACKEND->decdata_offset;
if(size) {
- memcpy(buf, connssl->decdata_buffer, size);
- memmove(connssl->decdata_buffer, connssl->decdata_buffer + size,
- connssl->decdata_offset - size);
- connssl->decdata_offset -= size;
+ memcpy(buf, BACKEND->decdata_buffer, size);
+ memmove(BACKEND->decdata_buffer, BACKEND->decdata_buffer + size,
+ BACKEND->decdata_offset - size);
+ BACKEND->decdata_offset -= size;
infof(data, "schannel: decrypted data returned %zu\n", size);
infof(data, "schannel: decrypted data buffer: offset %zu length %zu\n",
- connssl->decdata_offset, connssl->decdata_length);
+ BACKEND->decdata_offset, BACKEND->decdata_length);
*err = CURLE_OK;
return (ssize_t)size;
}
- if(!*err && !connssl->recv_connection_closed)
+ if(!*err && !BACKEND->recv_connection_closed)
*err = CURLE_AGAIN;
/* It's debatable what to return when !len. We could return whatever error we
@@ -1395,15 +1477,13 @@ cleanup:
return *err ? -1 : 0;
}
-CURLcode
-Curl_schannel_connect_nonblocking(struct connectdata *conn, int sockindex,
- bool *done)
+static CURLcode Curl_schannel_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
return schannel_connect_common(conn, sockindex, TRUE, done);
}
-CURLcode
-Curl_schannel_connect(struct connectdata *conn, int sockindex)
+static CURLcode Curl_schannel_connect(struct connectdata *conn, int sockindex)
{
CURLcode result;
bool done = FALSE;
@@ -1417,25 +1497,38 @@ Curl_schannel_connect(struct connectdata *conn, int sockindex)
return CURLE_OK;
}
-bool Curl_schannel_data_pending(const struct connectdata *conn, int sockindex)
+static bool Curl_schannel_data_pending(const struct connectdata *conn,
+ int sockindex)
{
const struct ssl_connect_data *connssl = &conn->ssl[sockindex];
if(connssl->use) /* SSL/TLS is in use */
- return (connssl->decdata_offset > 0 ||
- (connssl->encdata_offset > 0 && !connssl->encdata_is_incomplete));
+ return (BACKEND->decdata_offset > 0 ||
+ (BACKEND->encdata_offset > 0 && !BACKEND->encdata_is_incomplete));
else
return FALSE;
}
-void Curl_schannel_close(struct connectdata *conn, int sockindex)
+static void Curl_schannel_close(struct connectdata *conn, int sockindex)
{
if(conn->ssl[sockindex].use)
/* if the SSL/TLS channel hasn't been shut down yet, do that now. */
Curl_ssl_shutdown(conn, sockindex);
}
-int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
+static void Curl_schannel_session_free(void *ptr)
+{
+ /* this is expected to be called under sessionid lock */
+ struct curl_schannel_cred *cred = ptr;
+
+ cred->refcount--;
+ if(cred->refcount == 0) {
+ s_pSecFn->FreeCredentialsHandle(&cred->cred_handle);
+ Curl_safefree(cred);
+ }
+}
+
+static int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
{
/* See https://msdn.microsoft.com/en-us/library/windows/desktop/aa380138.aspx
* Shutting Down an Schannel Connection
@@ -1448,7 +1541,7 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
infof(data, "schannel: shutting down SSL/TLS connection with %s port %hu\n",
hostname, conn->remote_port);
- if(connssl->cred && connssl->ctxt) {
+ if(BACKEND->cred && BACKEND->ctxt) {
SecBufferDesc BuffDesc;
SecBuffer Buffer;
SECURITY_STATUS sspi_status;
@@ -1461,7 +1554,7 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
InitSecBuffer(&Buffer, SECBUFFER_TOKEN, &dwshut, sizeof(dwshut));
InitSecBufferDesc(&BuffDesc, &Buffer, 1);
- sspi_status = s_pSecFn->ApplyControlToken(&connssl->ctxt->ctxt_handle,
+ sspi_status = s_pSecFn->ApplyControlToken(&BACKEND->ctxt->ctxt_handle,
&BuffDesc);
if(sspi_status != SEC_E_OK)
@@ -1477,18 +1570,18 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
InitSecBufferDesc(&outbuf_desc, &outbuf, 1);
sspi_status = s_pSecFn->InitializeSecurityContext(
- &connssl->cred->cred_handle,
- &connssl->ctxt->ctxt_handle,
+ &BACKEND->cred->cred_handle,
+ &BACKEND->ctxt->ctxt_handle,
host_name,
- connssl->req_flags,
+ BACKEND->req_flags,
0,
0,
NULL,
0,
- &connssl->ctxt->ctxt_handle,
+ &BACKEND->ctxt->ctxt_handle,
&outbuf_desc,
- &connssl->ret_flags,
- &connssl->ctxt->time_stamp);
+ &BACKEND->ret_flags,
+ &BACKEND->ctxt->time_stamp);
Curl_unicodefree(host_name);
@@ -1507,71 +1600,62 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
}
/* free SSPI Schannel API security context handle */
- if(connssl->ctxt) {
+ if(BACKEND->ctxt) {
infof(data, "schannel: clear security context handle\n");
- s_pSecFn->DeleteSecurityContext(&connssl->ctxt->ctxt_handle);
- Curl_safefree(connssl->ctxt);
+ s_pSecFn->DeleteSecurityContext(&BACKEND->ctxt->ctxt_handle);
+ Curl_safefree(BACKEND->ctxt);
}
/* free SSPI Schannel API credential handle */
- if(connssl->cred) {
+ if(BACKEND->cred) {
Curl_ssl_sessionid_lock(conn);
- Curl_schannel_session_free(connssl->cred);
+ Curl_schannel_session_free(BACKEND->cred);
Curl_ssl_sessionid_unlock(conn);
- connssl->cred = NULL;
+ BACKEND->cred = NULL;
}
/* free internal buffer for received encrypted data */
- if(connssl->encdata_buffer != NULL) {
- Curl_safefree(connssl->encdata_buffer);
- connssl->encdata_length = 0;
- connssl->encdata_offset = 0;
- connssl->encdata_is_incomplete = false;
+ if(BACKEND->encdata_buffer != NULL) {
+ Curl_safefree(BACKEND->encdata_buffer);
+ BACKEND->encdata_length = 0;
+ BACKEND->encdata_offset = 0;
+ BACKEND->encdata_is_incomplete = false;
}
/* free internal buffer for received decrypted data */
- if(connssl->decdata_buffer != NULL) {
- Curl_safefree(connssl->decdata_buffer);
- connssl->decdata_length = 0;
- connssl->decdata_offset = 0;
+ if(BACKEND->decdata_buffer != NULL) {
+ Curl_safefree(BACKEND->decdata_buffer);
+ BACKEND->decdata_length = 0;
+ BACKEND->decdata_offset = 0;
}
return CURLE_OK;
}
-void Curl_schannel_session_free(void *ptr)
-{
- /* this is expected to be called under sessionid lock */
- struct curl_schannel_cred *cred = ptr;
-
- cred->refcount--;
- if(cred->refcount == 0) {
- s_pSecFn->FreeCredentialsHandle(&cred->cred_handle);
- Curl_safefree(cred);
- }
-}
-
-int Curl_schannel_init(void)
+static int Curl_schannel_init(void)
{
return (Curl_sspi_global_init() == CURLE_OK ? 1 : 0);
}
-void Curl_schannel_cleanup(void)
+static void Curl_schannel_cleanup(void)
{
Curl_sspi_global_cleanup();
}
-size_t Curl_schannel_version(char *buffer, size_t size)
+static size_t Curl_schannel_version(char *buffer, size_t size)
{
size = snprintf(buffer, size, "WinSSL");
return size;
}
-CURLcode Curl_schannel_random(unsigned char *entropy, size_t length)
+static CURLcode Curl_schannel_random(struct Curl_easy *data UNUSED_PARAM,
+ unsigned char *entropy, size_t length)
{
HCRYPTPROV hCryptProv = 0;
+ (void)data;
+
if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
return CURLE_FAILED_INIT;
@@ -1598,7 +1682,7 @@ static CURLcode verify_certificate(struct connectdata *conn, int sockindex)
conn->http_proxy.host.name :
conn->host.name;
- status = s_pSecFn->QueryContextAttributes(&connssl->ctxt->ctxt_handle,
+ status = s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
SECPKG_ATTR_REMOTE_CERT_CONTEXT,
&pCertContextServer);
@@ -1725,4 +1809,44 @@ static CURLcode verify_certificate(struct connectdata *conn, int sockindex)
}
#endif /* _WIN32_WCE */
+static void *Curl_schannel_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ (void)info;
+ return &BACKEND->ctxt->ctxt_handle;
+}
+
+const struct Curl_ssl Curl_ssl_schannel = {
+ { CURLSSLBACKEND_SCHANNEL, "schannel" }, /* info */
+
+ 0, /* have_ca_path */
+ 1, /* have_certinfo */
+ 0, /* have_pinnedpubkey */
+ 0, /* have_ssl_ctx */
+ 0, /* support_https_proxy */
+
+ sizeof(struct ssl_backend_data),
+
+ Curl_schannel_init, /* init */
+ Curl_schannel_cleanup, /* cleanup */
+ Curl_schannel_version, /* version */
+ Curl_none_check_cxn, /* check_cxn */
+ Curl_schannel_shutdown, /* shutdown */
+ Curl_schannel_data_pending, /* data_pending */
+ Curl_schannel_random, /* random */
+ Curl_none_cert_status_request, /* cert_status_request */
+ Curl_schannel_connect, /* connect */
+ Curl_schannel_connect_nonblocking, /* connect_nonblocking */
+ Curl_schannel_get_internals, /* get_internals */
+ Curl_schannel_close, /* close_one */
+ Curl_none_close_all, /* close_all */
+ Curl_schannel_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_none_false_start, /* false_start */
+ Curl_none_md5sum, /* md5sum */
+ NULL /* sha256sum */
+};
+
#endif /* USE_SCHANNEL */
diff --git a/lib/vtls/schannel.h b/lib/vtls/schannel.h
index 8627c63..932103d 100644
--- a/lib/vtls/schannel.h
+++ b/lib/vtls/schannel.h
@@ -28,94 +28,7 @@
#include "urldata.h"
-#ifndef UNISP_NAME_A
-#define UNISP_NAME_A "Microsoft Unified Security Protocol Provider"
-#endif
-
-#ifndef UNISP_NAME_W
-#define UNISP_NAME_W L"Microsoft Unified Security Protocol Provider"
-#endif
-
-#ifndef UNISP_NAME
-#ifdef UNICODE
-#define UNISP_NAME UNISP_NAME_W
-#else
-#define UNISP_NAME UNISP_NAME_A
-#endif
-#endif
-
-#ifndef SP_PROT_SSL2_CLIENT
-#define SP_PROT_SSL2_CLIENT 0x00000008
-#endif
-
-#ifndef SP_PROT_SSL3_CLIENT
-#define SP_PROT_SSL3_CLIENT 0x00000008
-#endif
-
-#ifndef SP_PROT_TLS1_CLIENT
-#define SP_PROT_TLS1_CLIENT 0x00000080
-#endif
-
-#ifndef SP_PROT_TLS1_0_CLIENT
-#define SP_PROT_TLS1_0_CLIENT SP_PROT_TLS1_CLIENT
-#endif
-
-#ifndef SP_PROT_TLS1_1_CLIENT
-#define SP_PROT_TLS1_1_CLIENT 0x00000200
-#endif
-
-#ifndef SP_PROT_TLS1_2_CLIENT
-#define SP_PROT_TLS1_2_CLIENT 0x00000800
-#endif
-
-#ifndef SECBUFFER_ALERT
-#define SECBUFFER_ALERT 17
-#endif
-
-/* Both schannel buffer sizes must be > 0 */
-#define CURL_SCHANNEL_BUFFER_INIT_SIZE 4096
-#define CURL_SCHANNEL_BUFFER_FREE_SIZE 1024
-
-
-CURLcode Curl_schannel_connect(struct connectdata *conn, int sockindex);
-
-CURLcode Curl_schannel_connect_nonblocking(struct connectdata *conn,
- int sockindex,
- bool *done);
-
-bool Curl_schannel_data_pending(const struct connectdata *conn, int sockindex);
-void Curl_schannel_close(struct connectdata *conn, int sockindex);
-int Curl_schannel_shutdown(struct connectdata *conn, int sockindex);
-void Curl_schannel_session_free(void *ptr);
-
-int Curl_schannel_init(void);
-void Curl_schannel_cleanup(void);
-size_t Curl_schannel_version(char *buffer, size_t size);
-
-CURLcode Curl_schannel_random(unsigned char *entropy, size_t length);
-
-/* Set the API backend definition to Schannel */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_SCHANNEL
-
-/* this backend supports CURLOPT_CERTINFO */
-#define have_curlssl_certinfo 1
-
-/* API setup for Schannel */
-#define curlssl_init Curl_schannel_init
-#define curlssl_cleanup Curl_schannel_cleanup
-#define curlssl_connect Curl_schannel_connect
-#define curlssl_connect_nonblocking Curl_schannel_connect_nonblocking
-#define curlssl_session_free Curl_schannel_session_free
-#define curlssl_close_all(x) ((void)x)
-#define curlssl_close Curl_schannel_close
-#define curlssl_shutdown Curl_schannel_shutdown
-#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN)
-#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN)
-#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL)
-#define curlssl_version Curl_schannel_version
-#define curlssl_check_cxn(x) ((void)x, -1)
-#define curlssl_data_pending Curl_schannel_data_pending
-#define curlssl_random(x,y,z) ((void)x, Curl_schannel_random(y,z))
+extern const struct Curl_ssl Curl_ssl_schannel;
#endif /* USE_SCHANNEL */
#endif /* HEADER_CURL_SCHANNEL_H */
diff --git a/lib/vtls/vtls.c b/lib/vtls/vtls.c
index d5d0971..56e6317 100644
--- a/lib/vtls/vtls.c
+++ b/lib/vtls/vtls.c
@@ -28,17 +28,9 @@
to any specific SSL-layer.
Curl_ssl_ - prefix for generic ones
- Curl_ossl_ - prefix for OpenSSL ones
- Curl_gtls_ - prefix for GnuTLS ones
- Curl_nss_ - prefix for NSS ones
- Curl_gskit_ - prefix for GSKit ones
- Curl_polarssl_ - prefix for PolarSSL ones
- Curl_cyassl_ - prefix for CyaSSL ones
- Curl_schannel_ - prefix for Schannel SSPI ones
- Curl_darwinssl_ - prefix for SecureTransport (Darwin) ones
-
- Note that this source code uses curlssl_* functions, and they are all
- defines/macros #defined by the lib-specific header files.
+
+ Note that this source code uses the functions of the configured SSL
+ backend via the global Curl_ssl instance.
"SSL/TLS Strong Encryption: An Introduction"
https://httpd.apache.org/docs/2.0/ssl/ssl_intro.html
@@ -98,9 +90,12 @@ Curl_ssl_config_matches(struct ssl_primary_config* data,
(data->version_max == needle->version_max) &&
(data->verifypeer == needle->verifypeer) &&
(data->verifyhost == needle->verifyhost) &&
+ (data->verifystatus == needle->verifystatus) &&
Curl_safe_strcasecompare(data->CApath, needle->CApath) &&
Curl_safe_strcasecompare(data->CAfile, needle->CAfile) &&
Curl_safe_strcasecompare(data->clientcert, needle->clientcert) &&
+ Curl_safe_strcasecompare(data->random_file, needle->random_file) &&
+ Curl_safe_strcasecompare(data->egdsocket, needle->egdsocket) &&
Curl_safe_strcasecompare(data->cipher_list, needle->cipher_list))
return TRUE;
@@ -111,42 +106,51 @@ bool
Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
struct ssl_primary_config *dest)
{
- dest->verifyhost = source->verifyhost;
- dest->verifypeer = source->verifypeer;
dest->version = source->version;
dest->version_max = source->version_max;
+ dest->verifypeer = source->verifypeer;
+ dest->verifyhost = source->verifyhost;
+ dest->verifystatus = source->verifystatus;
+ dest->sessionid = source->sessionid;
- CLONE_STRING(CAfile);
CLONE_STRING(CApath);
- CLONE_STRING(cipher_list);
- CLONE_STRING(egdsocket);
- CLONE_STRING(random_file);
+ CLONE_STRING(CAfile);
CLONE_STRING(clientcert);
+ CLONE_STRING(random_file);
+ CLONE_STRING(egdsocket);
+ CLONE_STRING(cipher_list);
- /* Disable dest sessionid cache if a client cert is used, CVE-2016-5419. */
- dest->sessionid = (dest->clientcert ? false : source->sessionid);
return TRUE;
}
void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc)
{
- Curl_safefree(sslc->CAfile);
Curl_safefree(sslc->CApath);
- Curl_safefree(sslc->cipher_list);
- Curl_safefree(sslc->egdsocket);
- Curl_safefree(sslc->random_file);
+ Curl_safefree(sslc->CAfile);
Curl_safefree(sslc->clientcert);
+ Curl_safefree(sslc->random_file);
+ Curl_safefree(sslc->egdsocket);
+ Curl_safefree(sslc->cipher_list);
}
+#ifdef USE_SSL
+static int multissl_init(const struct Curl_ssl *backend);
+#endif
+
int Curl_ssl_backend(void)
{
- return (int)CURL_SSL_BACKEND;
+#ifdef USE_SSL
+ multissl_init(NULL);
+ return Curl_ssl->info.id;
+#else
+ return (int)CURLSSLBACKEND_NONE;
+#endif
}
#ifdef USE_SSL
/* "global" init done? */
-static bool init_ssl=FALSE;
+static bool init_ssl = FALSE;
/**
* Global SSL init
@@ -161,7 +165,7 @@ int Curl_ssl_init(void)
return 1;
init_ssl = TRUE; /* never again */
- return curlssl_init();
+ return Curl_ssl->init();
}
@@ -170,7 +174,7 @@ void Curl_ssl_cleanup(void)
{
if(init_ssl) {
/* only cleanup if we did a previous init */
- curlssl_cleanup();
+ Curl_ssl->cleanup();
init_ssl = FALSE;
}
}
@@ -205,12 +209,20 @@ ssl_connect_init_proxy(struct connectdata *conn, int sockindex)
DEBUGASSERT(conn->bits.proxy_ssl_connected[sockindex]);
if(ssl_connection_complete == conn->ssl[sockindex].state &&
!conn->proxy_ssl[sockindex].use) {
-#if defined(HTTPS_PROXY_SUPPORT)
+ struct ssl_backend_data *pbdata;
+
+ if(!Curl_ssl->support_https_proxy)
+ return CURLE_NOT_BUILT_IN;
+
+ /* The pointers to the ssl backend data, which is opaque here, are swapped
+ rather than move the contents. */
+ pbdata = conn->proxy_ssl[sockindex].backend;
conn->proxy_ssl[sockindex] = conn->ssl[sockindex];
+
memset(&conn->ssl[sockindex], 0, sizeof(conn->ssl[sockindex]));
-#else
- return CURLE_NOT_BUILT_IN;
-#endif
+ memset(pbdata, 0, Curl_ssl->sizeof_ssl_backend_data);
+
+ conn->ssl[sockindex].backend = pbdata;
}
return CURLE_OK;
}
@@ -233,7 +245,7 @@ Curl_ssl_connect(struct connectdata *conn, int sockindex)
conn->ssl[sockindex].use = TRUE;
conn->ssl[sockindex].state = ssl_connection_negotiating;
- result = curlssl_connect(conn, sockindex);
+ result = Curl_ssl->connect(conn, sockindex);
if(!result)
Curl_pgrsTime(conn->data, TIMER_APPCONNECT); /* SSL is connected */
@@ -257,12 +269,7 @@ Curl_ssl_connect_nonblocking(struct connectdata *conn, int sockindex,
/* mark this is being ssl requested from here on. */
conn->ssl[sockindex].use = TRUE;
-#ifdef curlssl_connect_nonblocking
- result = curlssl_connect_nonblocking(conn, sockindex, done);
-#else
- *done = TRUE; /* fallback to BLOCKING */
- result = curlssl_connect(conn, sockindex);
-#endif /* non-blocking connect support */
+ result = Curl_ssl->connect_nonblocking(conn, sockindex, done);
if(!result && *done)
Curl_pgrsTime(conn->data, TIMER_APPCONNECT); /* SSL is connected */
return result;
@@ -361,7 +368,7 @@ void Curl_ssl_kill_session(struct curl_ssl_session *session)
/* defensive check */
/* free the ID the SSL-layer specific way */
- curlssl_session_free(session->sessionid);
+ Curl_ssl->session_free(session->sessionid);
session->sessionid = NULL;
session->age = 0; /* fresh */
@@ -379,7 +386,7 @@ void Curl_ssl_kill_session(struct curl_ssl_session *session)
void Curl_ssl_delsessionid(struct connectdata *conn, void *ssl_sessionid)
{
size_t i;
- struct Curl_easy *data=conn->data;
+ struct Curl_easy *data = conn->data;
for(i = 0; i < data->set.general_ssl.max_ssl_sessions; i++) {
struct curl_ssl_session *check = &data->state.session[i];
@@ -403,9 +410,9 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
int sockindex)
{
size_t i;
- struct Curl_easy *data=conn->data; /* the mother of all structs */
+ struct Curl_easy *data = conn->data; /* the mother of all structs */
struct curl_ssl_session *store = &data->state.session[0];
- long oldest_age=data->state.session[0].age; /* zero if unused */
+ long oldest_age = data->state.session[0].age; /* zero if unused */
char *clone_host;
char *clone_conn_to_host;
int conn_to_port;
@@ -499,7 +506,7 @@ void Curl_ssl_close_all(struct Curl_easy *data)
Curl_safefree(data->state.session);
}
- curlssl_close_all(data);
+ Curl_ssl->close_all(data);
}
#if defined(USE_OPENSSL) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
@@ -542,12 +549,12 @@ int Curl_ssl_getsock(struct connectdata *conn,
void Curl_ssl_close(struct connectdata *conn, int sockindex)
{
DEBUGASSERT((sockindex <= 1) && (sockindex >= -1));
- curlssl_close(conn, sockindex);
+ Curl_ssl->close_one(conn, sockindex);
}
CURLcode Curl_ssl_shutdown(struct connectdata *conn, int sockindex)
{
- if(curlssl_shutdown(conn, sockindex))
+ if(Curl_ssl->shutdown(conn, sockindex))
return CURLE_SSL_SHUTDOWN_FAILED;
conn->ssl[sockindex].use = FALSE; /* get back to ordinary socket usage */
@@ -563,20 +570,20 @@ CURLcode Curl_ssl_shutdown(struct connectdata *conn, int sockindex)
*/
CURLcode Curl_ssl_set_engine(struct Curl_easy *data, const char *engine)
{
- return curlssl_set_engine(data, engine);
+ return Curl_ssl->set_engine(data, engine);
}
/* Selects the default SSL crypto engine
*/
CURLcode Curl_ssl_set_engine_default(struct Curl_easy *data)
{
- return curlssl_set_engine_default(data);
+ return Curl_ssl->set_engine_default(data);
}
/* Return list of OpenSSL crypto engine names. */
struct curl_slist *Curl_ssl_engines_list(struct Curl_easy *data)
{
- return curlssl_engines_list(data);
+ return Curl_ssl->engines_list(data);
}
/*
@@ -602,9 +609,15 @@ CURLcode Curl_ssl_initsessions(struct Curl_easy *data, size_t amount)
return CURLE_OK;
}
+static size_t Curl_multissl_version(char *buffer, size_t size);
+
size_t Curl_ssl_version(char *buffer, size_t size)
{
- return curlssl_version(buffer, size);
+#ifdef CURL_WITH_MULTI_SSL
+ return Curl_multissl_version(buffer, size);
+#else
+ return Curl_ssl->version(buffer, size);
+#endif
}
/*
@@ -617,13 +630,13 @@ size_t Curl_ssl_version(char *buffer, size_t size)
*/
int Curl_ssl_check_cxn(struct connectdata *conn)
{
- return curlssl_check_cxn(conn);
+ return Curl_ssl->check_cxn(conn);
}
bool Curl_ssl_data_pending(const struct connectdata *conn,
int connindex)
{
- return curlssl_data_pending(conn, connindex);
+ return Curl_ssl->data_pending(conn, connindex);
}
void Curl_ssl_free_certinfo(struct Curl_easy *data)
@@ -633,7 +646,7 @@ void Curl_ssl_free_certinfo(struct Curl_easy *data)
if(ci->num_of_certs) {
/* free all individual lists used */
- for(i=0; i<ci->num_of_certs; i++) {
+ for(i = 0; i<ci->num_of_certs; i++) {
curl_slist_free_all(ci->certinfo[i]);
ci->certinfo[i] = NULL;
}
@@ -687,7 +700,7 @@ CURLcode Curl_ssl_push_certinfo_len(struct Curl_easy *data,
snprintf(output, outlen, "%s:", label);
/* memcpy the value (it might not be zero terminated) */
- memcpy(&output[labellen+1], value, valuelen);
+ memcpy(&output[labellen + 1], value, valuelen);
/* zero terminate the output */
output[labellen + 1 + valuelen] = 0;
@@ -721,7 +734,7 @@ CURLcode Curl_ssl_random(struct Curl_easy *data,
unsigned char *entropy,
size_t length)
{
- return curlssl_random(data, entropy, length);
+ return Curl_ssl->random(data, entropy, length);
}
/*
@@ -796,12 +809,10 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
size_t size, pem_len;
CURLcode pem_read;
CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
-#ifdef curlssl_sha256sum
CURLcode encode;
size_t encodedlen, pinkeylen;
char *encoded, *pinkeycopy, *begin_pos, *end_pos;
unsigned char *sha256sumdigest = NULL;
-#endif
/* if a path wasn't specified, don't pin */
if(!pinnedpubkey)
@@ -811,15 +822,20 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
/* only do this if pinnedpubkey starts with "sha256//", length 8 */
if(strncmp(pinnedpubkey, "sha256//", 8) == 0) {
-#ifdef curlssl_sha256sum
+ if(!Curl_ssl->sha256sum) {
+ /* without sha256 support, this cannot match */
+ return result;
+ }
+
/* compute sha256sum of public key */
- sha256sumdigest = malloc(SHA256_DIGEST_LENGTH);
+ sha256sumdigest = malloc(CURL_SHA256_DIGEST_LENGTH);
if(!sha256sumdigest)
return CURLE_OUT_OF_MEMORY;
- curlssl_sha256sum(pubkey, pubkeylen,
- sha256sumdigest, SHA256_DIGEST_LENGTH);
+ Curl_ssl->sha256sum(pubkey, pubkeylen,
+ sha256sumdigest, CURL_SHA256_DIGEST_LENGTH);
encode = Curl_base64_encode(data, (char *)sha256sumdigest,
- SHA256_DIGEST_LENGTH, &encoded, &encodedlen);
+ CURL_SHA256_DIGEST_LENGTH, &encoded,
+ &encodedlen);
Curl_safefree(sha256sumdigest);
if(encode)
@@ -864,10 +880,6 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
} while(end_pos && begin_pos);
Curl_safefree(encoded);
Curl_safefree(pinkeycopy);
-#else
- /* without sha256 support, this cannot match */
- (void)data;
-#endif
return result;
}
@@ -943,45 +955,372 @@ CURLcode Curl_ssl_md5sum(unsigned char *tmp, /* input */
unsigned char *md5sum, /* output */
size_t md5len)
{
-#ifdef curlssl_md5sum
- curlssl_md5sum(tmp, tmplen, md5sum, md5len);
-#else
+ return Curl_ssl->md5sum(tmp, tmplen, md5sum, md5len);
+}
+#endif
+
+/*
+ * Check whether the SSL backend supports the status_request extension.
+ */
+bool Curl_ssl_cert_status_request(void)
+{
+ return Curl_ssl->cert_status_request();
+}
+
+/*
+ * Check whether the SSL backend supports false start.
+ */
+bool Curl_ssl_false_start(void)
+{
+ return Curl_ssl->false_start();
+}
+
+/*
+ * Default implementations for unsupported functions.
+ */
+
+int Curl_none_init(void)
+{
+ return 1;
+}
+
+void Curl_none_cleanup(void)
+{ }
+
+int Curl_none_shutdown(struct connectdata *conn UNUSED_PARAM,
+ int sockindex UNUSED_PARAM)
+{
+ (void)conn;
+ (void)sockindex;
+ return 0;
+}
+
+int Curl_none_check_cxn(struct connectdata *conn UNUSED_PARAM)
+{
+ (void)conn;
+ return -1;
+}
+
+CURLcode Curl_none_random(struct Curl_easy *data UNUSED_PARAM,
+ unsigned char *entropy UNUSED_PARAM,
+ size_t length UNUSED_PARAM)
+{
+ (void)data;
+ (void)entropy;
+ (void)length;
+ return CURLE_NOT_BUILT_IN;
+}
+
+void Curl_none_close_all(struct Curl_easy *data UNUSED_PARAM)
+{
+ (void)data;
+}
+
+void Curl_none_session_free(void *ptr UNUSED_PARAM)
+{
+ (void)ptr;
+}
+
+bool Curl_none_data_pending(const struct connectdata *conn UNUSED_PARAM,
+ int connindex UNUSED_PARAM)
+{
+ (void)conn;
+ (void)connindex;
+ return 0;
+}
+
+bool Curl_none_cert_status_request(void)
+{
+ return FALSE;
+}
+
+CURLcode Curl_none_set_engine(struct Curl_easy *data UNUSED_PARAM,
+ const char *engine UNUSED_PARAM)
+{
+ (void)data;
+ (void)engine;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode Curl_none_set_engine_default(struct Curl_easy *data UNUSED_PARAM)
+{
+ (void)data;
+ return CURLE_NOT_BUILT_IN;
+}
+
+struct curl_slist *Curl_none_engines_list(struct Curl_easy *data UNUSED_PARAM)
+{
+ (void)data;
+ return (struct curl_slist *)NULL;
+}
+
+bool Curl_none_false_start(void)
+{
+ return FALSE;
+}
+
+#ifndef CURL_DISABLE_CRYPTO_AUTH
+CURLcode Curl_none_md5sum(unsigned char *input, size_t inputlen,
+ unsigned char *md5sum, size_t md5len UNUSED_PARAM)
+{
MD5_context *MD5pw;
- (void) md5len;
+ (void)md5len;
MD5pw = Curl_MD5_init(Curl_DIGEST_MD5);
if(!MD5pw)
return CURLE_OUT_OF_MEMORY;
- Curl_MD5_update(MD5pw, tmp, curlx_uztoui(tmplen));
+ Curl_MD5_update(MD5pw, input, curlx_uztoui(inputlen));
Curl_MD5_final(MD5pw, md5sum);
-#endif
return CURLE_OK;
}
+#else
+CURLcode Curl_none_md5sum(unsigned char *input UNUSED_PARAM,
+ size_t inputlen UNUSED_PARAM,
+ unsigned char *md5sum UNUSED_PARAM,
+ size_t md5len UNUSED_PARAM)
+{
+ (void)input;
+ (void)inputlen;
+ (void)md5sum;
+ (void)md5len;
+ return CURLE_NOT_BUILT_IN;
+}
#endif
-/*
- * Check whether the SSL backend supports the status_request extension.
- */
-bool Curl_ssl_cert_status_request(void)
+static int Curl_multissl_init(void)
+{
+ if(multissl_init(NULL))
+ return 1;
+ return Curl_ssl->init();
+}
+
+static CURLcode Curl_multissl_connect(struct connectdata *conn, int sockindex)
+{
+ if(multissl_init(NULL))
+ return CURLE_FAILED_INIT;
+ return Curl_ssl->connect(conn, sockindex);
+}
+
+static CURLcode Curl_multissl_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
{
-#ifdef curlssl_cert_status_request
- return curlssl_cert_status_request();
+ if(multissl_init(NULL))
+ return CURLE_FAILED_INIT;
+ return Curl_ssl->connect_nonblocking(conn, sockindex, done);
+}
+
+static void *Curl_multissl_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info)
+{
+ if(multissl_init(NULL))
+ return NULL;
+ return Curl_ssl->get_internals(connssl, info);
+}
+
+static void Curl_multissl_close(struct connectdata *conn, int sockindex)
+{
+ if(multissl_init(NULL))
+ return;
+ Curl_ssl->close_one(conn, sockindex);
+}
+
+static const struct Curl_ssl Curl_ssl_multi = {
+ { CURLSSLBACKEND_NONE, "multi" }, /* info */
+
+ 0, /* have_ca_path */
+ 0, /* have_certinfo */
+ 0, /* have_pinnedpubkey */
+ 0, /* have_ssl_ctx */
+ 0, /* support_https_proxy */
+
+ (size_t)-1, /* something insanely large to be on the safe side */
+
+ Curl_multissl_init, /* init */
+ Curl_none_cleanup, /* cleanup */
+ Curl_multissl_version, /* version */
+ Curl_none_check_cxn, /* check_cxn */
+ Curl_none_shutdown, /* shutdown */
+ Curl_none_data_pending, /* data_pending */
+ Curl_none_random, /* random */
+ Curl_none_cert_status_request, /* cert_status_request */
+ Curl_multissl_connect, /* connect */
+ Curl_multissl_connect_nonblocking, /* connect_nonblocking */
+ Curl_multissl_get_internals, /* get_internals */
+ Curl_multissl_close, /* close_one */
+ Curl_none_close_all, /* close_all */
+ Curl_none_session_free, /* session_free */
+ Curl_none_set_engine, /* set_engine */
+ Curl_none_set_engine_default, /* set_engine_default */
+ Curl_none_engines_list, /* engines_list */
+ Curl_none_false_start, /* false_start */
+ Curl_none_md5sum, /* md5sum */
+ NULL /* sha256sum */
+};
+
+const struct Curl_ssl *Curl_ssl =
+#if defined(CURL_WITH_MULTI_SSL)
+ &Curl_ssl_multi;
+#elif defined(USE_AXTLS)
+ &Curl_ssl_axtls;
+#elif defined(USE_CYASSL)
+ &Curl_ssl_cyassl;
+#elif defined(USE_DARWINSSL)
+ &Curl_ssl_darwinssl;
+#elif defined(USE_GNUTLS)
+ &Curl_ssl_gnutls;
+#elif defined(USE_GSKIT)
+ &Curl_ssl_gskit;
+#elif defined(USE_MBEDTLS)
+ &Curl_ssl_mbedtls;
+#elif defined(USE_NSS)
+ &Curl_ssl_nss;
+#elif defined(USE_OPENSSL)
+ &Curl_ssl_openssl;
+#elif defined(USE_POLARSSL)
+ &Curl_ssl_polarssl;
+#elif defined(USE_SCHANNEL)
+ &Curl_ssl_schannel;
#else
- return FALSE;
+#error "Missing struct Curl_ssl for selected SSL backend"
+#endif
+
+static const struct Curl_ssl *available_backends[] = {
+#if defined(USE_AXTLS)
+ &Curl_ssl_axtls,
+#endif
+#if defined(USE_CYASSL)
+ &Curl_ssl_cyassl,
+#endif
+#if defined(USE_DARWINSSL)
+ &Curl_ssl_darwinssl,
#endif
+#if defined(USE_GNUTLS)
+ &Curl_ssl_gnutls,
+#endif
+#if defined(USE_GSKIT)
+ &Curl_ssl_gskit,
+#endif
+#if defined(USE_MBEDTLS)
+ &Curl_ssl_mbedtls,
+#endif
+#if defined(USE_NSS)
+ &Curl_ssl_nss,
+#endif
+#if defined(USE_OPENSSL)
+ &Curl_ssl_openssl,
+#endif
+#if defined(USE_POLARSSL)
+ &Curl_ssl_polarssl,
+#endif
+#if defined(USE_SCHANNEL)
+ &Curl_ssl_schannel,
+#endif
+ NULL
+};
+
+static size_t Curl_multissl_version(char *buffer, size_t size)
+{
+ static const struct Curl_ssl *selected;
+ static char backends[200];
+ static size_t total;
+ const struct Curl_ssl *current;
+
+ current = Curl_ssl == &Curl_ssl_multi ? available_backends[0] : Curl_ssl;
+
+ if(current != selected) {
+ char *p = backends;
+ int i;
+
+ selected = current;
+
+ for(i = 0; available_backends[i]; i++) {
+ if(i)
+ *(p++) = ' ';
+ if(selected != available_backends[i])
+ *(p++) = '(';
+ p += available_backends[i]->version(p, backends + sizeof(backends) - p);
+ if(selected != available_backends[i])
+ *(p++) = ')';
+ }
+ *p = '\0';
+ total = p - backends;
+ }
+
+ if(size < total)
+ memcpy(buffer, backends, total + 1);
+ else {
+ memcpy(buffer, backends, size - 1);
+ buffer[size - 1] = '\0';
+ }
+
+ return total;
}
-/*
- * Check whether the SSL backend supports false start.
- */
-bool Curl_ssl_false_start(void)
+static int multissl_init(const struct Curl_ssl *backend)
{
-#ifdef curlssl_false_start
- return curlssl_false_start();
-#else
- return FALSE;
+ const char *env;
+ int i;
+
+ if(Curl_ssl != &Curl_ssl_multi)
+ return 1;
+
+ if(backend) {
+ Curl_ssl = backend;
+ return 0;
+ }
+
+ if(!available_backends[0])
+ return 1;
+
+ env = getenv("CURL_SSL_BACKEND");
+#ifdef CURL_DEFAULT_SSL_BACKEND
+ if(!env)
+ env = CURL_DEFAULT_SSL_BACKEND;
#endif
+ if(env) {
+ for(i = 0; available_backends[i]; i++) {
+ if(strcasecompare(env, available_backends[i]->info.name)) {
+ Curl_ssl = available_backends[i];
+ return 0;
+ }
+ }
+ }
+
+ /* Fall back to first available backend */
+ Curl_ssl = available_backends[0];
+ return 0;
+}
+
+CURLsslset curl_global_sslset(curl_sslbackend id, const char *name,
+ const curl_ssl_backend ***avail)
+{
+ int i;
+
+ if(Curl_ssl != &Curl_ssl_multi)
+ return id == Curl_ssl->info.id ? CURLSSLSET_OK : CURLSSLSET_TOO_LATE;
+
+ for(i = 0; available_backends[i]; i++) {
+ if(available_backends[i]->info.id == id ||
+ (name && strcasecompare(available_backends[i]->info.name, name))) {
+ multissl_init(available_backends[i]);
+ return CURLSSLSET_OK;
+ }
+ }
+
+ if(avail)
+ *avail = (const curl_ssl_backend **)&available_backends;
+ return CURLSSLSET_UNKNOWN_BACKEND;
+}
+
+#else /* USE_SSL */
+CURLsslset curl_global_sslset(curl_sslbackend id, const char *name,
+ const curl_ssl_backend ***avail)
+{
+ (void)id;
+ (void)name;
+ (void)avail;
+ return CURLSSLSET_NO_BACKENDS;
}
-#endif /* USE_SSL */
+#endif /* !USE_SSL */
diff --git a/lib/vtls/vtls.h b/lib/vtls/vtls.h
index 2aabeda..c5f9d4a 100644
--- a/lib/vtls/vtls.h
+++ b/lib/vtls/vtls.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,6 +23,80 @@
***************************************************************************/
#include "curl_setup.h"
+struct connectdata;
+struct ssl_connect_data;
+
+struct Curl_ssl {
+ /*
+ * This *must* be the first entry to allow returning the list of available
+ * backends in curl_global_sslset().
+ */
+ curl_ssl_backend info;
+
+ unsigned have_ca_path:1; /* supports CAPATH */
+ unsigned have_certinfo:1; /* supports CURLOPT_CERTINFO */
+ unsigned have_pinnedpubkey:1; /* supports CURLOPT_PINNEDPUBLICKEY */
+ unsigned have_ssl_ctx:1; /* supports CURLOPT_SSL_CTX_* */
+
+ unsigned support_https_proxy:1; /* supports access via HTTPS proxies */
+
+ size_t sizeof_ssl_backend_data;
+
+ int (*init)(void);
+ void (*cleanup)(void);
+
+ size_t (*version)(char *buffer, size_t size);
+ int (*check_cxn)(struct connectdata *cxn);
+ int (*shutdown)(struct connectdata *conn, int sockindex);
+ bool (*data_pending)(const struct connectdata *conn,
+ int connindex);
+
+ /* return 0 if a find random is filled in */
+ CURLcode (*random)(struct Curl_easy *data, unsigned char *entropy,
+ size_t length);
+ bool (*cert_status_request)(void);
+
+ CURLcode (*connect)(struct connectdata *conn, int sockindex);
+ CURLcode (*connect_nonblocking)(struct connectdata *conn, int sockindex,
+ bool *done);
+ void *(*get_internals)(struct ssl_connect_data *connssl, CURLINFO info);
+ void (*close_one)(struct connectdata *conn, int sockindex);
+ void (*close_all)(struct Curl_easy *data);
+ void (*session_free)(void *ptr);
+
+ CURLcode (*set_engine)(struct Curl_easy *data, const char *engine);
+ CURLcode (*set_engine_default)(struct Curl_easy *data);
+ struct curl_slist *(*engines_list)(struct Curl_easy *data);
+
+ bool (*false_start)(void);
+
+ CURLcode (*md5sum)(unsigned char *input, size_t inputlen,
+ unsigned char *md5sum, size_t md5sumlen);
+ void (*sha256sum)(const unsigned char *input, size_t inputlen,
+ unsigned char *sha256sum, size_t sha256sumlen);
+};
+
+#ifdef USE_SSL
+extern const struct Curl_ssl *Curl_ssl;
+#endif
+
+int Curl_none_init(void);
+void Curl_none_cleanup(void);
+int Curl_none_shutdown(struct connectdata *conn, int sockindex);
+int Curl_none_check_cxn(struct connectdata *conn);
+CURLcode Curl_none_random(struct Curl_easy *data, unsigned char *entropy,
+ size_t length);
+void Curl_none_close_all(struct Curl_easy *data);
+void Curl_none_session_free(void *ptr);
+bool Curl_none_data_pending(const struct connectdata *conn, int connindex);
+bool Curl_none_cert_status_request(void);
+CURLcode Curl_none_set_engine(struct Curl_easy *data, const char *engine);
+CURLcode Curl_none_set_engine_default(struct Curl_easy *data);
+struct curl_slist *Curl_none_engines_list(struct Curl_easy *data);
+bool Curl_none_false_start(void);
+CURLcode Curl_none_md5sum(unsigned char *input, size_t inputlen,
+ unsigned char *md5sum, size_t md5len);
+
#include "openssl.h" /* OpenSSL versions */
#include "gtls.h" /* GnuTLS versions */
#include "nssg.h" /* NSS versions */
@@ -42,8 +116,8 @@
#define MD5_DIGEST_LENGTH 16 /* fixed size */
#endif
-#ifndef SHA256_DIGEST_LENGTH
-#define SHA256_DIGEST_LENGTH 32 /* fixed size */
+#ifndef CURL_SHA256_DIGEST_LENGTH
+#define CURL_SHA256_DIGEST_LENGTH 32 /* fixed size */
#endif
/* see https://tools.ietf.org/html/draft-ietf-tls-applayerprotoneg-04 */
@@ -172,8 +246,6 @@ bool Curl_ssl_false_start(void);
#define SSL_SHUTDOWN_TIMEOUT 10000 /* ms */
#else
-/* Set the API backend definition to none */
-#define CURL_SSL_BACKEND CURLSSLBACKEND_NONE
/* When SSL support is not present, just define away these function calls */
#define Curl_ssl_init() 1
diff --git a/lib/warnless.c b/lib/warnless.c
index fb085c8..05d9038 100644
--- a/lib/warnless.c
+++ b/lib/warnless.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -69,36 +69,36 @@
# error "SIZEOF_INT not defined"
#endif
-#if (CURL_SIZEOF_LONG == 2)
+#if (SIZEOF_LONG == 2)
# define CURL_MASK_SLONG 0x7FFFL
# define CURL_MASK_ULONG 0xFFFFUL
-#elif (CURL_SIZEOF_LONG == 4)
+#elif (SIZEOF_LONG == 4)
# define CURL_MASK_SLONG 0x7FFFFFFFL
# define CURL_MASK_ULONG 0xFFFFFFFFUL
-#elif (CURL_SIZEOF_LONG == 8)
+#elif (SIZEOF_LONG == 8)
# define CURL_MASK_SLONG 0x7FFFFFFFFFFFFFFFL
# define CURL_MASK_ULONG 0xFFFFFFFFFFFFFFFFUL
-#elif (CURL_SIZEOF_LONG == 16)
+#elif (SIZEOF_LONG == 16)
# define CURL_MASK_SLONG 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFL
# define CURL_MASK_ULONG 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUL
#else
-# error "CURL_SIZEOF_LONG not defined"
+# error "SIZEOF_LONG not defined"
#endif
-#if (CURL_SIZEOF_CURL_OFF_T == 2)
+#if (SIZEOF_CURL_OFF_T == 2)
# define CURL_MASK_SCOFFT CURL_OFF_T_C(0x7FFF)
# define CURL_MASK_UCOFFT CURL_OFF_TU_C(0xFFFF)
-#elif (CURL_SIZEOF_CURL_OFF_T == 4)
+#elif (SIZEOF_CURL_OFF_T == 4)
# define CURL_MASK_SCOFFT CURL_OFF_T_C(0x7FFFFFFF)
# define CURL_MASK_UCOFFT CURL_OFF_TU_C(0xFFFFFFFF)
-#elif (CURL_SIZEOF_CURL_OFF_T == 8)
+#elif (SIZEOF_CURL_OFF_T == 8)
# define CURL_MASK_SCOFFT CURL_OFF_T_C(0x7FFFFFFFFFFFFFFF)
# define CURL_MASK_UCOFFT CURL_OFF_TU_C(0xFFFFFFFFFFFFFFFF)
-#elif (CURL_SIZEOF_CURL_OFF_T == 16)
+#elif (SIZEOF_CURL_OFF_T == 16)
# define CURL_MASK_SCOFFT CURL_OFF_T_C(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
# define CURL_MASK_UCOFFT CURL_OFF_TU_C(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
#else
-# error "CURL_SIZEOF_CURL_OFF_T not defined"
+# error "SIZEOF_CURL_OFF_T not defined"
#endif
#if (SIZEOF_SIZE_T == SIZEOF_SHORT)
@@ -107,10 +107,10 @@
#elif (SIZEOF_SIZE_T == SIZEOF_INT)
# define CURL_MASK_SSIZE_T CURL_MASK_SINT
# define CURL_MASK_USIZE_T CURL_MASK_UINT
-#elif (SIZEOF_SIZE_T == CURL_SIZEOF_LONG)
+#elif (SIZEOF_SIZE_T == SIZEOF_LONG)
# define CURL_MASK_SSIZE_T CURL_MASK_SLONG
# define CURL_MASK_USIZE_T CURL_MASK_ULONG
-#elif (SIZEOF_SIZE_T == CURL_SIZEOF_CURL_OFF_T)
+#elif (SIZEOF_SIZE_T == SIZEOF_CURL_OFF_T)
# define CURL_MASK_SSIZE_T CURL_MASK_SCOFFT
# define CURL_MASK_USIZE_T CURL_MASK_UCOFFT
#else
@@ -226,7 +226,7 @@ unsigned long curlx_uztoul(size_t uznum)
# pragma warning(disable:810) /* conversion may lose significant bits */
#endif
-#if (CURL_SIZEOF_LONG < SIZEOF_SIZE_T)
+#if (SIZEOF_LONG < SIZEOF_SIZE_T)
DEBUGASSERT(uznum <= (size_t) CURL_MASK_ULONG);
#endif
return (unsigned long)(uznum & (size_t) CURL_MASK_ULONG);
@@ -269,7 +269,7 @@ int curlx_sltosi(long slnum)
#endif
DEBUGASSERT(slnum >= 0);
-#if (SIZEOF_INT < CURL_SIZEOF_LONG)
+#if (SIZEOF_INT < SIZEOF_LONG)
DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_SINT);
#endif
return (int)(slnum & (long) CURL_MASK_SINT);
@@ -291,7 +291,7 @@ unsigned int curlx_sltoui(long slnum)
#endif
DEBUGASSERT(slnum >= 0);
-#if (SIZEOF_INT < CURL_SIZEOF_LONG)
+#if (SIZEOF_INT < SIZEOF_LONG)
DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_UINT);
#endif
return (unsigned int)(slnum & (long) CURL_MASK_UINT);
diff --git a/local-configure.patch b/local-configure.patch
index 25bb3c4..ddeab80 100644
--- a/local-configure.patch
+++ b/local-configure.patch
@@ -1,9 +1,9 @@
diff --git a/lib/curl_config.h b/lib/curl_config.h
-index 273593ba6..6ba8faca3 100644
+index f9aef69e2..f5ba92735 100644
--- a/lib/curl_config.h
+++ b/lib/curl_config.h
-@@ -128,7 +128,10 @@
- #define HAVE_BORINGSSL 1
+@@ -143,7 +143,10 @@
+ /* #undef HAVE_BUILTIN_AVAILABLE */
/* Define to 1 if you have the clock_gettime function and monotonic timer. */
+#if !defined(__APPLE__)
@@ -13,7 +13,7 @@ index 273593ba6..6ba8faca3 100644
/* Define to 1 if you have the closesocket function. */
/* #undef HAVE_CLOSESOCKET */
-@@ -430,10 +433,14 @@
+@@ -454,10 +457,14 @@
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the memrchr function or macro. */
@@ -28,7 +28,7 @@ index 273593ba6..6ba8faca3 100644
/* Define to 1 if you have the <netdb.h> header file. */
#define HAVE_NETDB_H 1
-@@ -787,9 +794,6 @@
+@@ -808,9 +815,6 @@
/* Define absolute filename for winbind's ntlm_auth helper. */
/* #undef NTLM_WB_FILE */
@@ -38,7 +38,7 @@ index 273593ba6..6ba8faca3 100644
/* Name of package */
#define PACKAGE "curl"
-@@ -827,7 +831,7 @@
+@@ -848,7 +852,7 @@
#define RECV_TYPE_ARG4 int
/* Define to the function return type for recv. */
@@ -47,7 +47,7 @@ index 273593ba6..6ba8faca3 100644
/* Define as the return type of signal handlers (`int' or `void'). */
#define RETSIGTYPE void
-@@ -845,7 +849,7 @@
+@@ -866,7 +870,7 @@
#define SELECT_TYPE_ARG5 struct timeval *
/* Define to the function return type for select. */
@@ -56,13 +56,16 @@ index 273593ba6..6ba8faca3 100644
/* Define to the type qualifier of arg 2 for send. */
#define SEND_QUAL_ARG2 const
-@@ -863,32 +867,14 @@
+@@ -884,7 +888,7 @@
#define SEND_TYPE_ARG4 int
/* Define to the function return type for send. */
-#define SEND_TYPE_RETV int
+#define SEND_TYPE_RETV ssize_t
+ /* The size of `curl_off_t', as computed by sizeof. */
+ #define SIZEOF_CURL_OFF_T 8
+@@ -892,24 +896,9 @@
/* The size of `int', as computed by sizeof. */
#define SIZEOF_INT 4
@@ -84,9 +87,6 @@ index 273593ba6..6ba8faca3 100644
-/* The size of `time_t', as computed by sizeof. */
-#define SIZEOF_TIME_T 4
-
--/* The size of `void*', as computed by sizeof. */
--#define SIZEOF_VOIDP 4
--
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
diff --git a/m4/curl-compilers.m4 b/m4/curl-compilers.m4
index 3c87efa..422946e 100644
--- a/m4/curl-compilers.m4
+++ b/m4/curl-compilers.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -89,7 +89,7 @@ AC_DEFUN([CURL_CHECK_COMPILER_CLANG], [
if test -z "$clangver"; then
if echo $fullclangver | grep "Apple LLVM version " >/dev/null; then
dnl Starting with XCode 7 / clang 3.7, Apple clang won't tell its upstream version
- clangver=`3.7`
+ clangver="3.7"
else
clangver=`echo $fullclangver | "$SED" 's/.*version \(@<:@0-9@:>@*\.@<:@0-9@:>@*\).*/\1/'`
fi
@@ -922,6 +922,11 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
dnl Only clang 3.9 or later
if test "$compiler_num" -ge "309"; then
tmp_CFLAGS="$tmp_CFLAGS -Wcomma"
+ # avoid the varargs warning, fixed in 4.0
+ # https://bugs.llvm.org/show_bug.cgi?id=29140
+ if test "$compiler_num" -lt "400"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wno-varargs"
+ fi
fi
fi
;;
diff --git a/m4/curl-confopts.m4 b/m4/curl-confopts.m4
index d77a884..6dcd0f1 100644
--- a/m4/curl-confopts.m4
+++ b/m4/curl-confopts.m4
@@ -37,14 +37,14 @@ AC_HELP_STRING([--enable-threaded-resolver],[Enable threaded resolver])
AC_HELP_STRING([--disable-threaded-resolver],[Disable threaded resolver]),
OPT_THRES=$enableval)
case "$OPT_THRES" in
- *)
- dnl configure option not specified
- want_thres="yes"
- ;;
no)
dnl --disable-threaded-resolver option used
want_thres="no"
;;
+ *)
+ dnl configure option not specified
+ want_thres="yes"
+ ;;
esac
AC_MSG_RESULT([$want_thres])
])
diff --git a/packages/OS400/README.OS400 b/packages/OS400/README.OS400
index 552a3cb..3ee1c0f 100644
--- a/packages/OS400/README.OS400
+++ b/packages/OS400/README.OS400
@@ -241,7 +241,8 @@ _ If data compression has to be supported, ZLIB development environment must
be installed.
_ Likewise, if SCP and SFTP protocols have to be compiled in, LIBSSH2
developent environment must be installed.
-_ Install the curl source directory in IFS.
+_ Install the curl source directory in IFS. Do NOT install it in the
+ installation target directory (wich defaults to /curl).
_ Enter shell (QSH)
_ Change current directory to the curl installation directory
_ Change current directory to ./packages/OS400
diff --git a/packages/OS400/curl.inc.in b/packages/OS400/curl.inc.in
index e4d2d30..ff5e28e 100644
--- a/packages/OS400/curl.inc.in
+++ b/packages/OS400/curl.inc.in
@@ -129,6 +129,8 @@
d c X'00100000'
d CURL_VERSION_HTTPS_PROXY...
d c X'00200000'
+ d CURL_VERSION_MULTI_SSL...
+ d c X'00400000'
*
d CURL_HTTPPOST_FILENAME...
d c X'00000001'
@@ -1312,6 +1314,8 @@
d c 10264
d CURLOPT_SUPPRESS_CONNECT_HEADERS...
d c 00265
+ d CURLOPT_SSH_COMPRESSION...
+ d c 00268
*
/if not defined(CURL_NO_OLDIES)
d CURLOPT_FILE c 10001
diff --git a/packages/OS400/makefile.sh b/packages/OS400/makefile.sh
index 141d877..7c6bcd7 100644
--- a/packages/OS400/makefile.sh
+++ b/packages/OS400/makefile.sh
@@ -31,10 +31,11 @@ fi
for TEXT in "${TOPDIR}/COPYING" "${SCRIPTDIR}/README.OS400" \
"${TOPDIR}/CHANGES" "${TOPDIR}/docs/THANKS" "${TOPDIR}/docs/FAQ" \
- "${TOPDIR}/docs/FEATURES" "${TOPDIR}/docs/SSLCERTS" \
+ "${TOPDIR}/docs/FEATURES" "${TOPDIR}/docs/SSLCERTS.md" \
"${TOPDIR}/docs/RESOURCES" "${TOPDIR}/docs/VERSIONS" \
- "${TOPDIR}/docs/HISTORY"
+ "${TOPDIR}/docs/HISTORY.md"
do MEMBER="`basename \"${TEXT}\" .OS400`"
+ MEMBER="`basename \"${MEMBER}\" .md`"
MEMBER="${LIBIFSNAME}/DOCS.FILE/`db2_name \"${MEMBER}\"`.MBR"
if action_needed "${MEMBER}" "${TEXT}"
diff --git a/packages/Symbian/group/libcurl.mmp b/packages/Symbian/group/libcurl.mmp
index 6388bbd..942e23f 100644
--- a/packages/Symbian/group/libcurl.mmp
+++ b/packages/Symbian/group/libcurl.mmp
@@ -39,7 +39,7 @@ SOURCE \
asyn-ares.c asyn-thread.c curl_gssapi.c http_ntlm.c curl_ntlm_wb.c \
curl_ntlm_core.c curl_sasl.c vtls/schannel.c curl_multibyte.c \
vtls/darwinssl.c conncache.c curl_sasl_sspi.c smb.c curl_endian.c \
- curl_des.c system_win32.c \
+ curl_des.c system_win32.c sha256.c \
vauth/vauth.c vauth/cleartext.c vauth/cram.c vauth/digest.c \
vauth/digest_sspi.c vauth/krb5_gssapi.c vauth/krb5_sspi.c \
vauth/ntlm.c vauth/ntlm_sspi.c vauth/oauth2.c vauth/spnego_gssapi.c \
diff --git a/projects/Windows/VC10/lib/libcurl.vcxproj b/projects/Windows/VC10/lib/libcurl.vcxproj
index 974f70a..718b295 100644
--- a/projects/Windows/VC10/lib/libcurl.vcxproj
+++ b/projects/Windows/VC10/lib/libcurl.vcxproj
@@ -2383,6 +2383,7 @@
<ClCompile Include="..\..\..\..\lib\md4.c" />
<ClCompile Include="..\..\..\..\lib\md5.c" />
<ClCompile Include="..\..\..\..\lib\memdebug.c" />
+ <ClCompile Include="..\..\..\..\lib\mime.c" />
<ClCompile Include="..\..\..\..\lib\mprintf.c" />
<ClCompile Include="..\..\..\..\lib\multi.c" />
<ClCompile Include="..\..\..\..\lib\netrc.c" />
@@ -2399,6 +2400,8 @@
<ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
+ <ClCompile Include="..\..\..\..\lib\setopt.c" />
+ <ClCompile Include="..\..\..\..\lib\sha256.c" />
<ClCompile Include="..\..\..\..\lib\share.c" />
<ClCompile Include="..\..\..\..\lib\slist.c" />
<ClCompile Include="..\..\..\..\lib\smb.c" />
@@ -2480,6 +2483,7 @@
<ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
<ClInclude Include="..\..\..\..\lib\curl_sspi.h" />
<ClInclude Include="..\..\..\..\lib\curl_threads.h" />
<ClInclude Include="..\..\..\..\lib\curlx.h" />
@@ -2510,6 +2514,7 @@
<ClInclude Include="..\..\..\..\lib\inet_pton.h" />
<ClInclude Include="..\..\..\..\lib\llist.h" />
<ClInclude Include="..\..\..\..\lib\memdebug.h" />
+ <ClInclude Include="..\..\..\..\lib\mime.h" />
<ClInclude Include="..\..\..\..\lib\multihandle.h" />
<ClInclude Include="..\..\..\..\lib\multiif.h" />
<ClInclude Include="..\..\..\..\lib\netrc.h" />
@@ -2524,6 +2529,7 @@
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
<ClInclude Include="..\..\..\..\lib\sendf.h" />
+ <ClInclude Include="..\..\..\..\lib\setopt.h" />
<ClInclude Include="..\..\..\..\lib\setup-vms.h" />
<ClInclude Include="..\..\..\..\lib\share.h" />
<ClInclude Include="..\..\..\..\lib\sigpipe.h" />
diff --git a/projects/Windows/VC10/src/curl.vcxproj b/projects/Windows/VC10/src/curl.vcxproj
index 3011e78..7f80d2f 100644
--- a/projects/Windows/VC10/src/curl.vcxproj
+++ b/projects/Windows/VC10/src/curl.vcxproj
@@ -2654,7 +2654,6 @@
<ClCompile Include="..\..\..\..\src\tool_libinfo.c" />
<ClCompile Include="..\..\..\..\src\tool_main.c" />
<ClCompile Include="..\..\..\..\src\tool_metalink.c" />
- <ClCompile Include="..\..\..\..\src\tool_mfiles.c" />
<ClCompile Include="..\..\..\..\src\tool_msgs.c" />
<ClCompile Include="..\..\..\..\src\tool_operate.c" />
<ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
@@ -2700,7 +2699,6 @@
<ClInclude Include="..\..\..\..\src\tool_libinfo.h" />
<ClInclude Include="..\..\..\..\src\tool_main.h" />
<ClInclude Include="..\..\..\..\src\tool_metalink.h" />
- <ClInclude Include="..\..\..\..\src\tool_mfiles.h" />
<ClInclude Include="..\..\..\..\src\tool_msgs.h" />
<ClInclude Include="..\..\..\..\src\tool_operate.h" />
<ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
diff --git a/projects/Windows/VC11/lib/libcurl.vcxproj b/projects/Windows/VC11/lib/libcurl.vcxproj
index 9fc6ada..38f5930 100644
--- a/projects/Windows/VC11/lib/libcurl.vcxproj
+++ b/projects/Windows/VC11/lib/libcurl.vcxproj
@@ -2439,6 +2439,7 @@
<ClCompile Include="..\..\..\..\lib\md4.c" />
<ClCompile Include="..\..\..\..\lib\md5.c" />
<ClCompile Include="..\..\..\..\lib\memdebug.c" />
+ <ClCompile Include="..\..\..\..\lib\mime.c" />
<ClCompile Include="..\..\..\..\lib\mprintf.c" />
<ClCompile Include="..\..\..\..\lib\multi.c" />
<ClCompile Include="..\..\..\..\lib\netrc.c" />
@@ -2455,6 +2456,8 @@
<ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
+ <ClCompile Include="..\..\..\..\lib\setopt.c" />
+ <ClCompile Include="..\..\..\..\lib\sha256.c" />
<ClCompile Include="..\..\..\..\lib\share.c" />
<ClCompile Include="..\..\..\..\lib\slist.c" />
<ClCompile Include="..\..\..\..\lib\smb.c" />
@@ -2536,6 +2539,7 @@
<ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
<ClInclude Include="..\..\..\..\lib\curl_sspi.h" />
<ClInclude Include="..\..\..\..\lib\curl_threads.h" />
<ClInclude Include="..\..\..\..\lib\curlx.h" />
@@ -2566,6 +2570,7 @@
<ClInclude Include="..\..\..\..\lib\inet_pton.h" />
<ClInclude Include="..\..\..\..\lib\llist.h" />
<ClInclude Include="..\..\..\..\lib\memdebug.h" />
+ <ClInclude Include="..\..\..\..\lib\mime.h" />
<ClInclude Include="..\..\..\..\lib\multihandle.h" />
<ClInclude Include="..\..\..\..\lib\multiif.h" />
<ClInclude Include="..\..\..\..\lib\netrc.h" />
@@ -2580,6 +2585,7 @@
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
<ClInclude Include="..\..\..\..\lib\sendf.h" />
+ <ClInclude Include="..\..\..\..\lib\setopt.h" />
<ClInclude Include="..\..\..\..\lib\setup-vms.h" />
<ClInclude Include="..\..\..\..\lib\share.h" />
<ClInclude Include="..\..\..\..\lib\sigpipe.h" />
diff --git a/projects/Windows/VC11/src/curl.vcxproj b/projects/Windows/VC11/src/curl.vcxproj
index a303ea5..9387617 100644
--- a/projects/Windows/VC11/src/curl.vcxproj
+++ b/projects/Windows/VC11/src/curl.vcxproj
@@ -2710,7 +2710,6 @@
<ClCompile Include="..\..\..\..\src\tool_libinfo.c" />
<ClCompile Include="..\..\..\..\src\tool_main.c" />
<ClCompile Include="..\..\..\..\src\tool_metalink.c" />
- <ClCompile Include="..\..\..\..\src\tool_mfiles.c" />
<ClCompile Include="..\..\..\..\src\tool_msgs.c" />
<ClCompile Include="..\..\..\..\src\tool_operate.c" />
<ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
@@ -2756,7 +2755,6 @@
<ClInclude Include="..\..\..\..\src\tool_libinfo.h" />
<ClInclude Include="..\..\..\..\src\tool_main.h" />
<ClInclude Include="..\..\..\..\src\tool_metalink.h" />
- <ClInclude Include="..\..\..\..\src\tool_mfiles.h" />
<ClInclude Include="..\..\..\..\src\tool_msgs.h" />
<ClInclude Include="..\..\..\..\src\tool_operate.h" />
<ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
diff --git a/projects/Windows/VC12/lib/libcurl.vcxproj b/projects/Windows/VC12/lib/libcurl.vcxproj
index 2b30619..c33b794 100644
--- a/projects/Windows/VC12/lib/libcurl.vcxproj
+++ b/projects/Windows/VC12/lib/libcurl.vcxproj
@@ -2439,6 +2439,7 @@
<ClCompile Include="..\..\..\..\lib\md4.c" />
<ClCompile Include="..\..\..\..\lib\md5.c" />
<ClCompile Include="..\..\..\..\lib\memdebug.c" />
+ <ClCompile Include="..\..\..\..\lib\mime.c" />
<ClCompile Include="..\..\..\..\lib\mprintf.c" />
<ClCompile Include="..\..\..\..\lib\multi.c" />
<ClCompile Include="..\..\..\..\lib\netrc.c" />
@@ -2455,6 +2456,8 @@
<ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
+ <ClCompile Include="..\..\..\..\lib\setopt.c" />
+ <ClCompile Include="..\..\..\..\lib\sha256.c" />
<ClCompile Include="..\..\..\..\lib\share.c" />
<ClCompile Include="..\..\..\..\lib\slist.c" />
<ClCompile Include="..\..\..\..\lib\smb.c" />
@@ -2536,6 +2539,7 @@
<ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
<ClInclude Include="..\..\..\..\lib\curl_sspi.h" />
<ClInclude Include="..\..\..\..\lib\curl_threads.h" />
<ClInclude Include="..\..\..\..\lib\curlx.h" />
@@ -2566,6 +2570,7 @@
<ClInclude Include="..\..\..\..\lib\inet_pton.h" />
<ClInclude Include="..\..\..\..\lib\llist.h" />
<ClInclude Include="..\..\..\..\lib\memdebug.h" />
+ <ClInclude Include="..\..\..\..\lib\mime.h" />
<ClInclude Include="..\..\..\..\lib\multihandle.h" />
<ClInclude Include="..\..\..\..\lib\multiif.h" />
<ClInclude Include="..\..\..\..\lib\netrc.h" />
@@ -2580,6 +2585,7 @@
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
<ClInclude Include="..\..\..\..\lib\sendf.h" />
+ <ClInclude Include="..\..\..\..\lib\setopt.h" />
<ClInclude Include="..\..\..\..\lib\setup-vms.h" />
<ClInclude Include="..\..\..\..\lib\share.h" />
<ClInclude Include="..\..\..\..\lib\sigpipe.h" />
diff --git a/projects/Windows/VC12/src/curl.vcxproj b/projects/Windows/VC12/src/curl.vcxproj
index e2475ef..ae41b39 100644
--- a/projects/Windows/VC12/src/curl.vcxproj
+++ b/projects/Windows/VC12/src/curl.vcxproj
@@ -2710,7 +2710,6 @@
<ClCompile Include="..\..\..\..\src\tool_libinfo.c" />
<ClCompile Include="..\..\..\..\src\tool_main.c" />
<ClCompile Include="..\..\..\..\src\tool_metalink.c" />
- <ClCompile Include="..\..\..\..\src\tool_mfiles.c" />
<ClCompile Include="..\..\..\..\src\tool_msgs.c" />
<ClCompile Include="..\..\..\..\src\tool_operate.c" />
<ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
@@ -2756,7 +2755,6 @@
<ClInclude Include="..\..\..\..\src\tool_libinfo.h" />
<ClInclude Include="..\..\..\..\src\tool_main.h" />
<ClInclude Include="..\..\..\..\src\tool_metalink.h" />
- <ClInclude Include="..\..\..\..\src\tool_mfiles.h" />
<ClInclude Include="..\..\..\..\src\tool_msgs.h" />
<ClInclude Include="..\..\..\..\src\tool_operate.h" />
<ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
diff --git a/projects/Windows/VC14/lib/libcurl.vcxproj b/projects/Windows/VC14/lib/libcurl.vcxproj
index edeef6b..07f925e 100644
--- a/projects/Windows/VC14/lib/libcurl.vcxproj
+++ b/projects/Windows/VC14/lib/libcurl.vcxproj
@@ -2439,6 +2439,7 @@
<ClCompile Include="..\..\..\..\lib\md4.c" />
<ClCompile Include="..\..\..\..\lib\md5.c" />
<ClCompile Include="..\..\..\..\lib\memdebug.c" />
+ <ClCompile Include="..\..\..\..\lib\mime.c" />
<ClCompile Include="..\..\..\..\lib\mprintf.c" />
<ClCompile Include="..\..\..\..\lib\multi.c" />
<ClCompile Include="..\..\..\..\lib\netrc.c" />
@@ -2455,6 +2456,8 @@
<ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
+ <ClCompile Include="..\..\..\..\lib\setopt.c" />
+ <ClCompile Include="..\..\..\..\lib\sha256.c" />
<ClCompile Include="..\..\..\..\lib\share.c" />
<ClCompile Include="..\..\..\..\lib\slist.c" />
<ClCompile Include="..\..\..\..\lib\smb.c" />
@@ -2536,6 +2539,7 @@
<ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
<ClInclude Include="..\..\..\..\lib\curl_sspi.h" />
<ClInclude Include="..\..\..\..\lib\curl_threads.h" />
<ClInclude Include="..\..\..\..\lib\curlx.h" />
@@ -2566,6 +2570,7 @@
<ClInclude Include="..\..\..\..\lib\inet_pton.h" />
<ClInclude Include="..\..\..\..\lib\llist.h" />
<ClInclude Include="..\..\..\..\lib\memdebug.h" />
+ <ClInclude Include="..\..\..\..\lib\mime.h" />
<ClInclude Include="..\..\..\..\lib\multihandle.h" />
<ClInclude Include="..\..\..\..\lib\multiif.h" />
<ClInclude Include="..\..\..\..\lib\netrc.h" />
@@ -2580,6 +2585,7 @@
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
<ClInclude Include="..\..\..\..\lib\sendf.h" />
+ <ClInclude Include="..\..\..\..\lib\setopt.h" />
<ClInclude Include="..\..\..\..\lib\setup-vms.h" />
<ClInclude Include="..\..\..\..\lib\share.h" />
<ClInclude Include="..\..\..\..\lib\sigpipe.h" />
diff --git a/projects/Windows/VC14/src/curl.vcxproj b/projects/Windows/VC14/src/curl.vcxproj
index 02d9188..869a1b9 100644
--- a/projects/Windows/VC14/src/curl.vcxproj
+++ b/projects/Windows/VC14/src/curl.vcxproj
@@ -2710,7 +2710,6 @@
<ClCompile Include="..\..\..\..\src\tool_libinfo.c" />
<ClCompile Include="..\..\..\..\src\tool_main.c" />
<ClCompile Include="..\..\..\..\src\tool_metalink.c" />
- <ClCompile Include="..\..\..\..\src\tool_mfiles.c" />
<ClCompile Include="..\..\..\..\src\tool_msgs.c" />
<ClCompile Include="..\..\..\..\src\tool_operate.c" />
<ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
@@ -2756,7 +2755,6 @@
<ClInclude Include="..\..\..\..\src\tool_libinfo.h" />
<ClInclude Include="..\..\..\..\src\tool_main.h" />
<ClInclude Include="..\..\..\..\src\tool_metalink.h" />
- <ClInclude Include="..\..\..\..\src\tool_mfiles.h" />
<ClInclude Include="..\..\..\..\src\tool_msgs.h" />
<ClInclude Include="..\..\..\..\src\tool_operate.h" />
<ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
diff --git a/projects/Windows/VC6/lib/libcurl.dsp b/projects/Windows/VC6/lib/libcurl.dsp
index 88ac2b3..ae40464 100644
--- a/projects/Windows/VC6/lib/libcurl.dsp
+++ b/projects/Windows/VC6/lib/libcurl.dsp
@@ -970,6 +970,10 @@ SOURCE=..\..\..\..\lib\memdebug.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\mime.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\mprintf.c
# End Source File
# Begin Source File
@@ -1034,6 +1038,14 @@ SOURCE=..\..\..\..\lib\sendf.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\setopt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\sha256.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\share.c
# End Source File
# Begin Source File
@@ -1354,6 +1366,10 @@ SOURCE=..\..\..\..\lib\curl_setup_once.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\curl_sha256.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\curl_sspi.h
# End Source File
# Begin Source File
@@ -1474,6 +1490,10 @@ SOURCE=..\..\..\..\lib\memdebug.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\mime.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\multihandle.h
# End Source File
# Begin Source File
@@ -1530,6 +1550,10 @@ SOURCE=..\..\..\..\lib\sendf.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\setopt.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\setup-vms.h
# End Source File
# Begin Source File
diff --git a/projects/Windows/VC6/src/curl.dsp b/projects/Windows/VC6/src/curl.dsp
index 4965587..b276b1a 100644
--- a/projects/Windows/VC6/src/curl.dsp
+++ b/projects/Windows/VC6/src/curl.dsp
@@ -787,10 +787,6 @@ SOURCE=..\..\..\..\src\tool_metalink.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\src\tool_mfiles.c
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\src\tool_msgs.c
# End Source File
# Begin Source File
@@ -967,10 +963,6 @@ SOURCE=..\..\..\..\src\tool_metalink.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\src\tool_mfiles.h
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\src\tool_msgs.h
# End Source File
# Begin Source File
diff --git a/projects/Windows/VC7.1/lib/libcurl.vcproj b/projects/Windows/VC7.1/lib/libcurl.vcproj
index 3c52fed..391635d 100644
--- a/projects/Windows/VC7.1/lib/libcurl.vcproj
+++ b/projects/Windows/VC7.1/lib/libcurl.vcproj
@@ -1436,6 +1436,9 @@
RelativePath="..\..\..\..\lib\memdebug.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\mime.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\mprintf.c">
</File>
<File
@@ -1484,6 +1487,12 @@
RelativePath="..\..\..\..\lib\sendf.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\setopt.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\sha256.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\share.c">
</File>
<File
@@ -1653,6 +1662,9 @@
RelativePath="..\..\..\..\lib\curl_setup_once.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_sha256.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_sspi.h">
</File>
<File
@@ -1743,6 +1755,9 @@
RelativePath="..\..\..\..\lib\memdebug.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\mime.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multihandle.h">
</File>
<File
@@ -1785,6 +1800,9 @@
RelativePath="..\..\..\..\lib\sendf.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\setopt.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\setup-vms.h">
</File>
<File
diff --git a/projects/Windows/VC7.1/src/curl.vcproj b/projects/Windows/VC7.1/src/curl.vcproj
index 524fe70..baedf5e 100644
--- a/projects/Windows/VC7.1/src/curl.vcproj
+++ b/projects/Windows/VC7.1/src/curl.vcproj
@@ -1443,9 +1443,6 @@
RelativePath="..\..\..\..\src\tool_metalink.c">
</File>
<File
- RelativePath="..\..\..\..\src\tool_mfiles.c">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_msgs.c">
</File>
<File
@@ -1579,9 +1576,6 @@
RelativePath="..\..\..\..\src\tool_metalink.h">
</File>
<File
- RelativePath="..\..\..\..\src\tool_mfiles.h">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_msgs.h">
</File>
<File
diff --git a/projects/Windows/VC7/lib/libcurl.vcproj b/projects/Windows/VC7/lib/libcurl.vcproj
index ac1d1ef..ea4147e 100644
--- a/projects/Windows/VC7/lib/libcurl.vcproj
+++ b/projects/Windows/VC7/lib/libcurl.vcproj
@@ -1290,6 +1290,9 @@
RelativePath="..\..\..\..\lib\memdebug.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\mime.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\mprintf.c">
</File>
<File
@@ -1338,6 +1341,12 @@
RelativePath="..\..\..\..\lib\sendf.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\setopt.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\sha256.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\share.c">
</File>
<File
@@ -1507,6 +1516,9 @@
RelativePath="..\..\..\..\lib\curl_setup_once.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_sha256.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_sspi.h">
</File>
<File
@@ -1597,6 +1609,9 @@
RelativePath="..\..\..\..\lib\memdebug.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\mime.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multihandle.h">
</File>
<File
@@ -1639,6 +1654,9 @@
RelativePath="..\..\..\..\lib\sendf.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\setopt.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\setup-vms.h">
</File>
<File
diff --git a/projects/Windows/VC7/src/curl.vcproj b/projects/Windows/VC7/src/curl.vcproj
index 2ca82c6..3de1b94 100644
--- a/projects/Windows/VC7/src/curl.vcproj
+++ b/projects/Windows/VC7/src/curl.vcproj
@@ -1297,9 +1297,6 @@
RelativePath="..\..\..\..\src\tool_metalink.c">
</File>
<File
- RelativePath="..\..\..\..\src\tool_mfiles.c">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_msgs.c">
</File>
<File
@@ -1433,9 +1430,6 @@
RelativePath="..\..\..\..\src\tool_metalink.h">
</File>
<File
- RelativePath="..\..\..\..\src\tool_mfiles.h">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_msgs.h">
</File>
<File
diff --git a/projects/Windows/VC8/lib/libcurl.vcproj b/projects/Windows/VC8/lib/libcurl.vcproj
index 92ade2d..f98b293 100644
--- a/projects/Windows/VC8/lib/libcurl.vcproj
+++ b/projects/Windows/VC8/lib/libcurl.vcproj
@@ -3857,6 +3857,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\mime.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\mprintf.c"
>
</File>
@@ -3921,6 +3925,14 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\setopt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\sha256.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\share.c"
>
</File>
@@ -4145,6 +4157,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_sha256.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_sspi.h"
>
</File>
@@ -4265,6 +4281,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\mime.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multihandle.h"
>
</File>
@@ -4321,6 +4341,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\setopt.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\setup-vms.h"
>
</File>
diff --git a/projects/Windows/VC8/src/curl.vcproj b/projects/Windows/VC8/src/curl.vcproj
index 8248ce8..4e4c6c3 100644
--- a/projects/Windows/VC8/src/curl.vcproj
+++ b/projects/Windows/VC8/src/curl.vcproj
@@ -4189,10 +4189,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_mfiles.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_msgs.c"
>
</File>
@@ -4369,10 +4365,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_mfiles.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_msgs.h"
>
</File>
diff --git a/projects/Windows/VC9/lib/libcurl.vcproj b/projects/Windows/VC9/lib/libcurl.vcproj
index 1c4f9df..c794c9c 100644
--- a/projects/Windows/VC9/lib/libcurl.vcproj
+++ b/projects/Windows/VC9/lib/libcurl.vcproj
@@ -3798,6 +3798,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\mime.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\mprintf.c"
>
</File>
@@ -3862,6 +3866,14 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\setopt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\sha256.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\share.c"
>
</File>
@@ -4086,6 +4098,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_sha256.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_sspi.h"
>
</File>
@@ -4206,6 +4222,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\mime.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multihandle.h"
>
</File>
@@ -4262,6 +4282,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\setopt.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\setup-vms.h"
>
</File>
diff --git a/projects/Windows/VC9/src/curl.vcproj b/projects/Windows/VC9/src/curl.vcproj
index 51a3b51..56ba9de 100644
--- a/projects/Windows/VC9/src/curl.vcproj
+++ b/projects/Windows/VC9/src/curl.vcproj
@@ -4046,10 +4046,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_mfiles.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_msgs.c"
>
</File>
@@ -4226,10 +4222,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_mfiles.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_msgs.h"
>
</File>
diff --git a/projects/build-openssl.bat b/projects/build-openssl.bat
index 0773e07..33da174 100644
--- a/projects/build-openssl.bat
+++ b/projects/build-openssl.bat
@@ -138,6 +138,9 @@ rem ***************************************************************************
rem Check the start directory exists
if not exist "%START_DIR%" goto noopenssl
+ rem Check that OpenSSL is not unsupported version 1.1.0
+ if not exist "%START_DIR%\ms\do_ms.bat" goto unsupported
+
:configure
if "%BUILD_PLATFORM%" == "" (
if "%VC_VER%" == "6.0" (
@@ -355,6 +358,14 @@ rem ***************************************************************************
echo Error: Cannot locate OpenSSL source directory
goto error
+:unsupported
+ echo.
+ echo Error: Unsupported OpenSSL version.
+ echo The pre-generated project files and this build script only support the
+ echo LTS version of OpenSSL ^(v1.0.2^). The next version of this build script
+ echo will support OpenSSL v1.1.0.
+ goto error
+
:error
if "%OS%" == "Windows_NT" endlocal
exit /B 1
diff --git a/scripts/zsh.pl b/scripts/zsh.pl
index f0d8c19..82b4d9f 100755
--- a/scripts/zsh.pl
+++ b/scripts/zsh.pl
@@ -54,10 +54,11 @@ sub parse_main_opts {
$option .= '}' if defined $short;
$option .= '\'[' . trim($desc) . ']\'' if defined $desc;
- $option .= ":$arg" if defined $arg;
+ $option .= ":'$arg'" if defined $arg;
$option .= ':_files'
- if defined $arg and ($arg eq 'FILE' || $arg eq 'DIR');
+ if defined $arg and ($arg eq '<file>' || $arg eq '<filename>'
+ || $arg eq '<dir>');
push @list, $option;
}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index de188be..30c525c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -40,7 +40,7 @@ transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.
include(${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake)
if(MSVC)
- list(APPEND CURL_SOURCE curl.rc)
+ list(APPEND CURL_FILES curl.rc)
endif()
# CURL_FILES comes from Makefile.inc
@@ -76,4 +76,15 @@ set_target_properties(${EXE_NAME} PROPERTIES
#INCLUDE(ModuleInstall OPTIONAL)
-install(TARGETS ${EXE_NAME} DESTINATION bin)
+install(TARGETS ${EXE_NAME} EXPORT curl-target DESTINATION bin)
+export(TARGETS ${EXE_NAME}
+ APPEND FILE ${PROJECT_BINARY_DIR}/curl-target.cmake
+ NAMESPACE CURL::
+)
+
+install(EXPORT curl-target
+ FILE curl-target.cmake
+ NAMESPACE CURL::
+ DESTINATION ${CURL_INSTALL_CMAKE_DIR}
+)
+
diff --git a/src/Makefile.inc b/src/Makefile.inc
index 5074f8f..45b4967 100644
--- a/src/Makefile.inc
+++ b/src/Makefile.inc
@@ -45,7 +45,6 @@ CURL_CFILES = \
tool_libinfo.c \
tool_main.c \
tool_metalink.c \
- tool_mfiles.c \
tool_msgs.c \
tool_operate.c \
tool_operhlp.c \
@@ -86,7 +85,6 @@ CURL_HFILES = \
tool_libinfo.h \
tool_main.h \
tool_metalink.h \
- tool_mfiles.h \
tool_msgs.h \
tool_operate.h \
tool_operhlp.h \
diff --git a/src/Makefile.m32 b/src/Makefile.m32
index 315cd5c..700cccf 100644
--- a/src/Makefile.m32
+++ b/src/Makefile.m32
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1999 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1999 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -22,8 +22,9 @@
###########################################################################
#
-## Makefile for building curl.exe with MingW (GCC-3.2 or later)
-## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4)
+## Makefile for building curl.exe with MingW (GCC-3.2 or later or LLVM/Clang)
+## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4),
+## brotli (1.0.1)
##
## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
@@ -38,6 +39,10 @@
ifndef ZLIB_PATH
ZLIB_PATH = ../../zlib-1.2.8
endif
+# Edit the path below to point to the base of your Brotli sources.
+ifndef BROTLI_PATH
+BROTLI_PATH = ../../brotli-1.0.1
+endif
# Edit the path below to point to the base of your OpenSSL package.
ifndef OPENSSL_PATH
OPENSSL_PATH = ../../openssl-1.0.2a
@@ -62,9 +67,9 @@ endif
ifndef LIBXML2_PATH
LIBXML2_PATH = ../../libxml2-2.9.2
endif
-# Edit the path below to point to the base of your libidn package.
-ifndef LIBIDN_PATH
-LIBIDN_PATH = ../../libidn-1.32
+# Edit the path below to point to the base of your libidn2 package.
+ifndef LIBIDN2_PATH
+LIBIDN2_PATH = ../../libidn2-2.0.3
endif
# Edit the path below to point to the base of your MS IDN package.
# Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1
@@ -88,12 +93,19 @@ ifndef LIBCARES_PATH
LIBCARES_PATH = $(PROOT)/ares
endif
-CC = $(CROSSPREFIX)gcc
+ifeq ($(CURL_CC),)
+CURL_CC := $(CROSSPREFIX)gcc
+endif
+ifeq ($(CURL_AR),)
+CURL_AR := $(CROSSPREFIX)ar
+endif
+
+CC = $(CURL_CC)
CFLAGS = $(CURL_CFLAG_EXTRAS) -g -O2 -Wall -W
CFLAGS += -fno-strict-aliasing
# comment LDFLAGS below to keep debug info
LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_EXE) -s
-AR = $(CROSSPREFIX)ar
+AR = $(CURL_AR)
RC = $(CROSSPREFIX)windres
RCFLAGS = --include-dir=$(PROOT)/include -O COFF
STRIP = $(CROSSPREFIX)strip -g
@@ -168,9 +180,7 @@ ZLIB = 1
endif
ifeq ($(findstring -ssh2,$(CFG)),-ssh2)
SSH2 = 1
-ifneq ($(findstring -winssl,$(CFG)),-winssl)
SSL = 1
-endif
ZLIB = 1
endif
ifeq ($(findstring -ssl,$(CFG)),-ssl)
@@ -179,8 +189,11 @@ endif
ifeq ($(findstring -zlib,$(CFG)),-zlib)
ZLIB = 1
endif
-ifeq ($(findstring -idn,$(CFG)),-idn)
-IDN = 1
+ifeq ($(findstring -brotli,$(CFG)),-brotli)
+BROTLI = 1
+endif
+ifeq ($(findstring -idn2,$(CFG)),-idn2)
+IDN2 = 1
endif
ifeq ($(findstring -winidn,$(CFG)),-winidn)
WINIDN = 1
@@ -206,6 +219,11 @@ NGHTTP2 = 1
endif
INCLUDES = -I. -I../include -I../lib
+ifdef SSL
+ ifdef WINSSL
+ CFLAGS += -DCURL_WITH_MULTI_SSL
+ endif
+endif
ifdef DYN
curl_DEPENDENCIES = $(PROOT)/lib/libcurldll.a $(PROOT)/lib/libcurl.dll
@@ -274,19 +292,29 @@ ifdef SSL
INCLUDES += -I"$(OPENSSL_INCLUDE)"
CFLAGS += -DUSE_OPENSSL
curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
-else
+endif
ifdef WINSSL
+ CFLAGS += -DUSE_SCHANNEL
curl_LDADD += -lcrypt32
endif
-endif
ifdef ZLIB
INCLUDES += -I"$(ZLIB_PATH)"
CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
curl_LDADD += -L"$(ZLIB_PATH)" -lz
endif
-ifdef IDN
- CFLAGS += -DUSE_LIBIDN
- curl_LDADD += -L"$(LIBIDN_PATH)/lib" -lidn
+ifdef BROTLI
+ INCLUDES += -I"$(BROTLI_PATH)/include"
+ CFLAGS += -DHAVE_BROTLI
+ curl_LDADD += -L"$(BROTLI_PATH)/lib"
+ ifdef BROTLI_LIBS
+ curl_LDADD += $(BROTLI_LIBS)
+ else
+ curl_LDADD += -lbrotlidec
+ endif
+endif
+ifdef IDN2
+ CFLAGS += -DUSE_LIBIDN2
+ curl_LDADD += -L"$(LIBIDN2_PATH)/lib" -lidn2
else
ifdef WINIDN
CFLAGS += -DUSE_WIN32_IDN
@@ -307,9 +335,6 @@ ifdef METALINK
endif
ifdef SSPI
CFLAGS += -DUSE_WINDOWS_SSPI
- ifdef WINSSL
- CFLAGS += -DUSE_SCHANNEL
- endif
endif
ifdef IPV6
CFLAGS += -DENABLE_IPV6 -D_WIN32_WINNT=0x0501
diff --git a/src/mkhelp.pl b/src/mkhelp.pl
index 270daa2..757f024 100644..100755
--- a/src/mkhelp.pl
+++ b/src/mkhelp.pl
@@ -102,11 +102,9 @@ while(<READ>) {
}
close(READ);
-$now = localtime;
print <<HEAD
/*
* NEVER EVER edit this manually, fix the mkhelp.pl script instead!
- * Generation time: $now
*/
#ifdef USE_MANUAL
#include "tool_hugehelp.h"
diff --git a/src/tool_cb_dbg.c b/src/tool_cb_dbg.c
index b4fbe0b..aa1ef85 100644
--- a/src/tool_cb_dbg.c
+++ b/src/tool_cb_dbg.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -238,37 +238,40 @@ static void dump(const char *timebuf, const char *text,
if(tracetype == TRACE_BIN) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
- if(i+c < size)
- fprintf(stream, "%02x ", ptr[i+c]);
+ if(i + c < size)
+ fprintf(stream, "%02x ", ptr[i + c]);
else
fputs(" ", stream);
}
- for(c = 0; (c < width) && (i+c < size); c++) {
+ for(c = 0; (c < width) && (i + c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
if((tracetype == TRACE_ASCII) &&
- (i+c+1 < size) && (ptr[i+c] == 0x0D) && (ptr[i+c+1] == 0x0A)) {
- i += (c+2-width);
+ (i + c + 1 < size) && (ptr[i + c] == 0x0D) &&
+ (ptr[i + c + 1] == 0x0A)) {
+ i += (c + 2 - width);
break;
}
#ifdef CURL_DOES_CONVERSIONS
/* repeat the 0D0A check above but use the host encoding for CRLF */
if((tracetype == TRACE_ASCII) &&
- (i+c+1 < size) && (ptr[i+c] == '\r') && (ptr[i+c+1] == '\n')) {
- i += (c+2-width);
+ (i + c + 1 < size) && (ptr[i + c] == '\r') &&
+ (ptr[i + c + 1] == '\n')) {
+ i += (c + 2 - width);
break;
}
/* convert to host encoding and print this character */
- fprintf(stream, "%c", convert_char(infotype, ptr[i+c]));
+ fprintf(stream, "%c", convert_char(infotype, ptr[i + c]));
#else
(void)infotype;
- fprintf(stream, "%c", ((ptr[i+c] >= 0x20) && (ptr[i+c] < 0x80)) ?
- ptr[i+c] : UNPRINTABLE_CHAR);
+ fprintf(stream, "%c", ((ptr[i + c] >= 0x20) && (ptr[i + c] < 0x80)) ?
+ ptr[i + c] : UNPRINTABLE_CHAR);
#endif /* CURL_DOES_CONVERSIONS */
/* check again for 0D0A, to avoid an extra \n if it's at width */
if((tracetype == TRACE_ASCII) &&
- (i+c+2 < size) && (ptr[i+c+1] == 0x0D) && (ptr[i+c+2] == 0x0A)) {
- i += (c+3-width);
+ (i + c + 2 < size) && (ptr[i + c + 1] == 0x0D) &&
+ (ptr[i + c + 2] == 0x0A)) {
+ i += (c + 3 - width);
break;
}
}
diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c
index 0e13eec..7f2181f 100644
--- a/src/tool_cb_hdr.c
+++ b/src/tool_cb_hdr.c
@@ -146,7 +146,7 @@ static char *parse_filename(const char *ptr, size_t len)
char stop = '\0';
/* simple implementation of strndup() */
- copy = malloc(len+1);
+ copy = malloc(len + 1);
if(!copy)
return NULL;
memcpy(copy, ptr, len);
@@ -161,8 +161,13 @@ static char *parse_filename(const char *ptr, size_t len)
else
stop = ';';
+ /* scan for the end letter and stop there */
+ q = strchr(p, stop);
+ if(q)
+ *q = '\0';
+
/* if the filename contains a path, only use filename portion */
- q = strrchr(copy, '/');
+ q = strrchr(p, '/');
if(q) {
p = q + 1;
if(!*p) {
@@ -183,14 +188,6 @@ static char *parse_filename(const char *ptr, size_t len)
}
}
- /* scan for the end letter and stop there */
- for(q = p; *q; ++q) {
- if(*q == stop) {
- *q = '\0';
- break;
- }
- }
-
/* make sure the file name doesn't end in \r or \n */
q = strchr(p, '\r');
if(q)
diff --git a/src/tool_cb_prg.c b/src/tool_cb_prg.c
index d4ecb3c..992b96d 100644
--- a/src/tool_cb_prg.c
+++ b/src/tool_cb_prg.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,7 +44,7 @@ int tool_progress_cb(void *clientp,
/* The original progress-bar source code was written for curl by Lars Aas,
and this new edition inherits some of his concepts. */
- char line[MAX_BARLENGTH+1];
+ char line[MAX_BARLENGTH + 1];
char format[40];
double frac;
double percent;
diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c
index 675e88b..755195c 100644
--- a/src/tool_cfgable.c
+++ b/src/tool_cfgable.c
@@ -140,11 +140,11 @@ static void free_config_fields(struct OperationConfig *config)
curl_slist_free_all(config->headers);
curl_slist_free_all(config->proxyheaders);
- if(config->httppost) {
- curl_formfree(config->httppost);
- config->httppost = NULL;
+ if(config->mimepost) {
+ curl_mime_free(config->mimepost);
+ config->mimepost = NULL;
}
- config->last_post = NULL;
+ config->mimecurrent = NULL;
curl_slist_free_all(config->telnet_options);
curl_slist_free_all(config->resolve);
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index 254805c..ddfc9bf 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -114,6 +114,7 @@ struct OperationConfig {
struct getout *url_last; /* point to the last/current node */
struct getout *url_get; /* point to the node to fill in URL */
struct getout *url_out; /* point to the node to fill in outfile */
+ struct getout *url_ul; /* point to the node to fill in upload */
char *cipher_list;
char *proxy_cipher_list;
char *cert;
@@ -170,8 +171,8 @@ struct OperationConfig {
time_t condtime;
struct curl_slist *headers;
struct curl_slist *proxyheaders;
- struct curl_httppost *httppost;
- struct curl_httppost *last_post;
+ curl_mime *mimepost;
+ curl_mime *mimecurrent;
struct curl_slist *telnet_options;
struct curl_slist *resolve;
struct curl_slist *connect_to;
@@ -247,6 +248,7 @@ struct OperationConfig {
from user callbacks */
curl_error synthetic_error; /* if non-zero, it overrides any libcurl
error */
+ bool ssh_compression; /* enable/disable SSH compression */
struct GlobalConfig *global;
struct OperationConfig *prev;
struct OperationConfig *next; /* Always last in the struct */
diff --git a/src/tool_easysrc.c b/src/tool_easysrc.c
index c2dccf9..cb30e40 100644
--- a/src/tool_easysrc.c
+++ b/src/tool_easysrc.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -42,7 +42,7 @@ struct slist_wc *easysrc_data = NULL; /* Build slists, forms etc. */
struct slist_wc *easysrc_code = NULL; /* Setopt calls */
struct slist_wc *easysrc_toohard = NULL; /* Unconvertible setopt */
struct slist_wc *easysrc_clean = NULL; /* Clean up allocated data */
-int easysrc_form_count = 0;
+int easysrc_mime_count = 0;
int easysrc_slist_count = 0;
static const char *const srchead[]={
@@ -141,11 +141,11 @@ CURLcode easysrc_perform(void)
const char *c;
CHKRET(easysrc_add(&easysrc_code, ""));
/* Preamble comment */
- for(i=0; ((c = srchard[i]) != NULL); i++)
+ for(i = 0; ((c = srchard[i]) != NULL); i++)
CHKRET(easysrc_add(&easysrc_code, c));
/* Each unconverted option */
if(easysrc_toohard) {
- for(ptr=easysrc_toohard->first; ptr; ptr = ptr->next)
+ for(ptr = easysrc_toohard->first; ptr; ptr = ptr->next)
CHKRET(easysrc_add(&easysrc_code, ptr->data));
}
CHKRET(easysrc_add(&easysrc_code, ""));
@@ -189,12 +189,12 @@ void dumpeasysrc(struct GlobalConfig *config)
int i;
const char *c;
- for(i=0; ((c = srchead[i]) != NULL); i++)
+ for(i = 0; ((c = srchead[i]) != NULL); i++)
fprintf(out, "%s\n", c);
/* Declare variables used for complex setopt values */
if(easysrc_decl) {
- for(ptr=easysrc_decl->first; ptr; ptr = ptr->next)
+ for(ptr = easysrc_decl->first; ptr; ptr = ptr->next)
fprintf(out, " %s\n", ptr->data);
}
@@ -202,13 +202,13 @@ void dumpeasysrc(struct GlobalConfig *config)
if(easysrc_data) {
fprintf(out, "\n");
- for(ptr=easysrc_data->first; ptr; ptr = ptr->next)
+ for(ptr = easysrc_data->first; ptr; ptr = ptr->next)
fprintf(out, " %s\n", ptr->data);
}
fprintf(out, "\n");
if(easysrc_code) {
- for(ptr=easysrc_code->first; ptr; ptr = ptr->next) {
+ for(ptr = easysrc_code->first; ptr; ptr = ptr->next) {
if(ptr->data[0]) {
fprintf(out, " %s\n", ptr->data);
}
@@ -219,11 +219,11 @@ void dumpeasysrc(struct GlobalConfig *config)
}
if(easysrc_clean) {
- for(ptr=easysrc_clean->first; ptr; ptr = ptr->next)
+ for(ptr = easysrc_clean->first; ptr; ptr = ptr->next)
fprintf(out, " %s\n", ptr->data);
}
- for(i=0; ((c = srcend[i]) != NULL); i++)
+ for(i = 0; ((c = srcend[i]) != NULL); i++)
fprintf(out, "%s\n", c);
if(fopened)
diff --git a/src/tool_easysrc.h b/src/tool_easysrc.h
index 54607b8..fd799ab 100644
--- a/src/tool_easysrc.h
+++ b/src/tool_easysrc.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,7 +32,7 @@ extern struct slist_wc *easysrc_code; /* Setopt calls etc. */
extern struct slist_wc *easysrc_toohard; /* Unconvertible setopt */
extern struct slist_wc *easysrc_clean; /* Clean up (reverse order) */
-extern int easysrc_form_count; /* Number of curl_httppost variables */
+extern int easysrc_mime_count; /* Number of curl_mime variables */
extern int easysrc_slist_count; /* Number of curl_slist variables */
extern CURLcode easysrc_init(void);
diff --git a/src/tool_formparse.c b/src/tool_formparse.c
index 952377c..719e341 100644
--- a/src/tool_formparse.c
+++ b/src/tool_formparse.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,6 +21,7 @@
***************************************************************************/
#include "tool_setup.h"
+#include "mime.h"
#include "strcase.h"
#define ENABLE_CURLX_PRINTF
@@ -29,25 +30,34 @@
#include "tool_cfgable.h"
#include "tool_convert.h"
-#include "tool_mfiles.h"
#include "tool_msgs.h"
+#include "tool_binmode.h"
+#include "tool_getparam.h"
+#include "tool_paramhlp.h"
#include "tool_formparse.h"
#include "memdebug.h" /* keep this as LAST include */
+/* Stdin parameters. */
+typedef struct {
+ char *data; /* Memory data. */
+ curl_off_t origin; /* File read origin offset. */
+ curl_off_t size; /* Data size. */
+ curl_off_t curpos; /* Current read position. */
+} standard_input;
+
/*
* helper function to get a word from form param
* after call get_parm_word, str either point to string end
* or point to any of end chars.
*/
-static char *get_param_word(char **str, char **end_pos)
+static char *get_param_word(char **str, char **end_pos, char endchar)
{
char *ptr = *str;
char *word_begin = NULL;
char *ptr2;
char *escape = NULL;
- const char *end_chars = ";,";
/* the first non-space char is here */
word_begin = ptr;
@@ -77,10 +87,10 @@ static char *get_param_word(char **str, char **end_pos)
while(ptr < *end_pos);
*end_pos = ptr2;
}
- while(*ptr && NULL==strchr(end_chars, *ptr))
+ while(*ptr && *ptr != ';' && *ptr != endchar)
++ptr;
*str = ptr;
- return word_begin+1;
+ return word_begin + 1;
}
++ptr;
}
@@ -88,12 +98,407 @@ static char *get_param_word(char **str, char **end_pos)
ptr = word_begin;
}
- while(*ptr && NULL==strchr(end_chars, *ptr))
+ while(*ptr && *ptr != ';' && *ptr != endchar)
++ptr;
*str = *end_pos = ptr;
return word_begin;
}
+/* Append slist item and return -1 if failed. */
+static int slist_append(struct curl_slist **plist, const char *data)
+{
+ struct curl_slist *s = curl_slist_append(*plist, data);
+
+ if(!s)
+ return -1;
+
+ *plist = s;
+ return 0;
+}
+
+/* Read headers from a file and append to list. */
+static int read_field_headers(struct OperationConfig *config,
+ const char *filename, FILE *fp,
+ struct curl_slist **pheaders)
+{
+ size_t hdrlen = 0;
+ size_t pos = 0;
+ int c;
+ bool incomment = FALSE;
+ int lineno = 1;
+ char hdrbuf[999]; /* Max. header length + 1. */
+
+ for(;;) {
+ c = getc(fp);
+ if(c == EOF || (!pos && !ISSPACE(c))) {
+ /* Strip and flush the current header. */
+ while(hdrlen && ISSPACE(hdrbuf[hdrlen - 1]))
+ hdrlen--;
+ if(hdrlen) {
+ hdrbuf[hdrlen] = '\0';
+ if(slist_append(pheaders, hdrbuf)) {
+ fprintf(config->global->errors,
+ "Out of memory for field headers!\n");
+ return -1;
+ }
+ hdrlen = 0;
+ }
+ }
+
+ switch(c) {
+ case EOF:
+ if(ferror(fp)) {
+ fprintf(config->global->errors,
+ "Header file %s read error: %s\n", filename, strerror(errno));
+ return -1;
+ }
+ return 0; /* Done. */
+ case '\r':
+ continue; /* Ignore. */
+ case '\n':
+ pos = 0;
+ incomment = FALSE;
+ lineno++;
+ continue;
+ case '#':
+ if(!pos)
+ incomment = TRUE;
+ break;
+ }
+
+ pos++;
+ if(!incomment) {
+ if(hdrlen == sizeof hdrbuf - 1) {
+ warnf(config->global, "File %s line %d: header too long (truncated)\n",
+ filename, lineno);
+ c = ' ';
+ }
+ if(hdrlen <= sizeof hdrbuf - 1)
+ hdrbuf[hdrlen++] = (char) c;
+ }
+ }
+ /* NOTREACHED */
+}
+
+static int get_param_part(struct OperationConfig *config, char endchar,
+ char **str, char **pdata, char **ptype,
+ char **pfilename, char **pencoder,
+ struct curl_slist **pheaders)
+{
+ char *p = *str;
+ char *type = NULL;
+ char *filename = NULL;
+ char *encoder = NULL;
+ char *endpos;
+ char *tp;
+ char sep;
+ char type_major[128] = "";
+ char type_minor[128] = "";
+ char *endct = NULL;
+ struct curl_slist *headers = NULL;
+
+ if(ptype)
+ *ptype = NULL;
+ if(pfilename)
+ *pfilename = NULL;
+ if(pheaders)
+ *pheaders = NULL;
+ if(pencoder)
+ *pencoder = NULL;
+ while(ISSPACE(*p))
+ p++;
+ tp = p;
+ *pdata = get_param_word(&p, &endpos, endchar);
+ /* If not quoted, strip trailing spaces. */
+ if(*pdata == tp)
+ while(endpos > *pdata && ISSPACE(endpos[-1]))
+ endpos--;
+ sep = *p;
+ *endpos = '\0';
+ while(sep == ';') {
+ while(ISSPACE(*++p))
+ ;
+
+ if(!endct && checkprefix("type=", p)) {
+ for(p += 5; ISSPACE(*p); p++)
+ ;
+ /* set type pointer */
+ type = p;
+
+ /* verify that this is a fine type specifier */
+ if(2 != sscanf(type, "%127[^/ ]/%127[^;, \n]", type_major, type_minor)) {
+ warnf(config->global, "Illegally formatted content-type field!\n");
+ curl_slist_free_all(headers);
+ return -1; /* illegal content-type syntax! */
+ }
+
+ /* now point beyond the content-type specifier */
+ p = type + strlen(type_major) + strlen(type_minor) + 1;
+ for(endct = p; *p && *p != ';' && *p != endchar; p++)
+ if(!ISSPACE(*p))
+ endct = p + 1;
+ sep = *p;
+ }
+ else if(checkprefix("filename=", p)) {
+ if(endct) {
+ *endct = '\0';
+ endct = NULL;
+ }
+ for(p += 9; ISSPACE(*p); p++)
+ ;
+ tp = p;
+ filename = get_param_word(&p, &endpos, endchar);
+ /* If not quoted, strip trailing spaces. */
+ if(filename == tp)
+ while(endpos > filename && ISSPACE(endpos[-1]))
+ endpos--;
+ sep = *p;
+ *endpos = '\0';
+ }
+ else if(checkprefix("headers=", p)) {
+ if(endct) {
+ *endct = '\0';
+ endct = NULL;
+ }
+ p += 8;
+ if(*p == '@' || *p == '<') {
+ char *hdrfile;
+ FILE *fp;
+ /* Read headers from a file. */
+
+ do {
+ p++;
+ } while(ISSPACE(*p));
+ tp = p;
+ hdrfile = get_param_word(&p, &endpos, endchar);
+ /* If not quoted, strip trailing spaces. */
+ if(hdrfile == tp)
+ while(endpos > hdrfile && ISSPACE(endpos[-1]))
+ endpos--;
+ sep = *p;
+ *endpos = '\0';
+ /* TODO: maybe special fopen for VMS? */
+ fp = fopen(hdrfile, FOPEN_READTEXT);
+ if(!fp)
+ warnf(config->global, "Cannot read from %s: %s\n", hdrfile,
+ strerror(errno));
+ else {
+ int i = read_field_headers(config, hdrfile, fp, &headers);
+
+ fclose(fp);
+ if(i) {
+ curl_slist_free_all(headers);
+ return -1;
+ }
+ }
+ }
+ else {
+ char *hdr;
+
+ while(ISSPACE(*p))
+ p++;
+ tp = p;
+ hdr = get_param_word(&p, &endpos, endchar);
+ /* If not quoted, strip trailing spaces. */
+ if(hdr == tp)
+ while(endpos > hdr && ISSPACE(endpos[-1]))
+ endpos--;
+ sep = *p;
+ *endpos = '\0';
+ if(slist_append(&headers, hdr)) {
+ fprintf(config->global->errors, "Out of memory for field header!\n");
+ curl_slist_free_all(headers);
+ return -1;
+ }
+ }
+ }
+ else if(checkprefix("encoder=", p)) {
+ if(endct) {
+ *endct = '\0';
+ endct = NULL;
+ }
+ for(p += 8; ISSPACE(*p); p++)
+ ;
+ tp = p;
+ encoder = get_param_word(&p, &endpos, endchar);
+ /* If not quoted, strip trailing spaces. */
+ if(encoder == tp)
+ while(endpos > encoder && ISSPACE(endpos[-1]))
+ endpos--;
+ sep = *p;
+ *endpos = '\0';
+ }
+ else if(endct) {
+ /* This is part of content type. */
+ for(endct = p; *p && *p != ';' && *p != endchar; p++)
+ if(!ISSPACE(*p))
+ endct = p + 1;
+ sep = *p;
+ }
+ else {
+ /* unknown prefix, skip to next block */
+ char *unknown = get_param_word(&p, &endpos, endchar);
+
+ sep = *p;
+ *endpos = '\0';
+ if(*unknown)
+ warnf(config->global, "skip unknown form field: %s\n", unknown);
+ }
+ }
+
+ /* Terminate content type. */
+ if(endct)
+ *endct = '\0';
+
+ if(ptype)
+ *ptype = type;
+ else if(type)
+ warnf(config->global, "Field content type not allowed here: %s\n", type);
+
+ if(pfilename)
+ *pfilename = filename;
+ else if(filename)
+ warnf(config->global,
+ "Field file name not allowed here: %s\n", filename);
+
+ if(pencoder)
+ *pencoder = encoder;
+ else if(encoder)
+ warnf(config->global,
+ "Field encoder not allowed here: %s\n", encoder);
+
+ if(pheaders)
+ *pheaders = headers;
+ else if(headers) {
+ warnf(config->global,
+ "Field headers not allowed here: %s\n", headers->data);
+ curl_slist_free_all(headers);
+ }
+
+ *str = p;
+ return sep & 0xFF;
+}
+
+
+/* Mime part callbacks for stdin. */
+static size_t stdin_read(char *buffer, size_t size, size_t nitems, void *arg)
+{
+ standard_input *sip = (standard_input *) arg;
+ curl_off_t bytesleft;
+ (void) size; /* Always 1: ignored. */
+
+ if(sip->curpos >= sip->size)
+ return 0; /* At eof. */
+ bytesleft = sip->size - sip->curpos;
+ if((curl_off_t) nitems > bytesleft)
+ nitems = (size_t) bytesleft;
+ if(sip->data) {
+ /* Return data from memory. */
+ memcpy(buffer, sip->data + (size_t) sip->curpos, nitems);
+ }
+ else {
+ /* Read from stdin. */
+ nitems = fread(buffer, 1, nitems, stdin);
+ }
+ sip->curpos += nitems;
+ return nitems;
+}
+
+static int stdin_seek(void *instream, curl_off_t offset, int whence)
+{
+ standard_input *sip = (standard_input *) instream;
+
+ switch(whence) {
+ case SEEK_CUR:
+ offset += sip->curpos;
+ break;
+ case SEEK_END:
+ offset += sip->size;
+ break;
+ }
+ if(offset < 0)
+ return CURL_SEEKFUNC_CANTSEEK;
+ if(!sip->data) {
+ if(fseek(stdin, (long) (offset + sip->origin), SEEK_SET))
+ return CURL_SEEKFUNC_CANTSEEK;
+ }
+ sip->curpos = offset;
+ return CURL_SEEKFUNC_OK;
+}
+
+static void stdin_free(void *ptr)
+{
+ standard_input *sip = (standard_input *) ptr;
+
+ Curl_safefree(sip->data);
+ free(sip);
+}
+
+/* Set a part's data from a file, taking care about the pseudo filename "-" as
+ * a shortcut to read stdin: if so, use a callback to read OUR stdin (to
+ * workaround Windows DLL file handle caveat).
+ * If stdin is a regular file opened in binary mode, save current offset as
+ * origin for rewind and do not buffer data. Else read to EOF and keep in
+ * memory. In all cases, compute the stdin data size.
+ */
+static CURLcode file_or_stdin(curl_mimepart *part, const char *file)
+{
+ standard_input *sip = NULL;
+ int fd = -1;
+ CURLcode result = CURLE_OK;
+ struct_stat sbuf;
+
+ if(strcmp(file, "-"))
+ return curl_mime_filedata(part, file);
+
+ sip = (standard_input *) malloc(sizeof *sip);
+ if(!sip)
+ return CURLE_OUT_OF_MEMORY;
+
+ memset((char *) sip, 0, sizeof *sip);
+ set_binmode(stdin);
+
+ /* If stdin is a regular file, do not buffer data but read it when needed. */
+ fd = fileno(stdin);
+ sip->origin = ftell(stdin);
+ if(fd >= 0 && sip->origin >= 0 && !fstat(fd, &sbuf) &&
+#ifdef __VMS
+ sbuf.st_fab_rfm != FAB$C_VAR && sbuf.st_fab_rfm != FAB$C_VFC &&
+#endif
+ S_ISREG(sbuf.st_mode)) {
+ sip->size = sbuf.st_size - sip->origin;
+ if(sip->size < 0)
+ sip->size = 0;
+ }
+ else { /* Not suitable for direct use, buffer stdin data. */
+ size_t stdinsize = 0;
+
+ sip->origin = 0;
+ if(file2memory(&sip->data, &stdinsize, stdin) != PARAM_OK)
+ result = CURLE_OUT_OF_MEMORY;
+ else {
+ if(!stdinsize)
+ sip->data = NULL; /* Has been freed if no data. */
+ sip->size = stdinsize;
+ if(ferror(stdin))
+ result = CURLE_READ_ERROR;
+ }
+ }
+
+ /* Set remote file name. */
+ if(!result)
+ result = curl_mime_filename(part, file);
+
+ /* Set part's data from callback. */
+ if(!result)
+ result = curl_mime_data_cb(part, sip->size,
+ stdin_read, stdin_seek, stdin_free, sip);
+ if(result)
+ stdin_free(sip);
+ return result;
+}
+
+
/***************************************************************************
*
* formparse()
@@ -143,219 +548,316 @@ static char *get_param_word(char **str, char **end_pos)
int formparse(struct OperationConfig *config,
const char *input,
- struct curl_httppost **httppost,
- struct curl_httppost **last_post,
+ curl_mime **mimepost,
+ curl_mime **mimecurrent,
bool literal_value)
{
- /* nextarg MUST be a string in the format 'name=contents' and we'll
+ /* input MUST be a string in the format 'name=contents' and we'll
build a linked list with the info */
- char name[256];
+ char *name = NULL;
char *contents = NULL;
- char type_major[128] = "";
- char type_minor[128] = "";
char *contp;
+ char *data;
char *type = NULL;
- char *sep;
-
- if((1 == sscanf(input, "%255[^=]=", name)) &&
- ((contp = strchr(input, '=')) != NULL)) {
- /* the input was using the correct format */
-
- /* Allocate the contents */
- contents = strdup(contp+1);
- if(!contents) {
- fprintf(config->global->errors, "out of memory\n");
+ char *filename = NULL;
+ char *encoder = NULL;
+ struct curl_slist *headers = NULL;
+ curl_mimepart *part = NULL;
+ CURLcode res;
+ int sep = '\0';
+
+ /* Allocate the main mime structure if needed. */
+ if(!*mimepost) {
+ *mimepost = curl_mime_init(config->easy);
+ if(!*mimepost) {
+ warnf(config->global, "curl_mime_init failed!\n");
return 1;
}
- contp = contents;
+ *mimecurrent = *mimepost;
+ }
- if('@' == contp[0] && !literal_value) {
+ /* Make a copy we can overwrite. */
+ contents = strdup(input);
+ if(!contents) {
+ fprintf(config->global->errors, "out of memory\n");
+ return 2;
+ }
- /* we use the @-letter to indicate file name(s) */
+ /* Scan for the end of the name. */
+ contp = strchr(contents, '=');
+ if(contp) {
+ if(contp > contents)
+ name = contents;
+ *contp++ = '\0';
+
+ if(*contp == '(' && !literal_value) {
+ curl_mime *subparts;
+
+ /* Starting a multipart. */
+ sep = get_param_part(config, '\0',
+ &contp, &data, &type, NULL, NULL, &headers);
+ if(sep < 0) {
+ Curl_safefree(contents);
+ return 3;
+ }
+ subparts = curl_mime_init(config->easy);
+ if(!subparts) {
+ warnf(config->global, "curl_mime_init failed!\n");
+ curl_slist_free_all(headers);
+ Curl_safefree(contents);
+ return 4;
+ }
+ part = curl_mime_addpart(*mimecurrent);
+ if(!part) {
+ warnf(config->global, "curl_mime_addpart failed!\n");
+ curl_mime_free(subparts);
+ curl_slist_free_all(headers);
+ Curl_safefree(contents);
+ return 5;
+ }
+ if(curl_mime_subparts(part, subparts)) {
+ warnf(config->global, "curl_mime_subparts failed!\n");
+ curl_mime_free(subparts);
+ curl_slist_free_all(headers);
+ Curl_safefree(contents);
+ return 6;
+ }
+ *mimecurrent = subparts;
+ if(curl_mime_headers(part, headers, 1)) {
+ warnf(config->global, "curl_mime_headers failed!\n");
+ curl_slist_free_all(headers);
+ Curl_safefree(contents);
+ return 7;
+ }
+ if(curl_mime_type(part, type)) {
+ warnf(config->global, "curl_mime_type failed!\n");
+ Curl_safefree(contents);
+ return 8;
+ }
+ }
+ else if(!name && !strcmp(contp, ")") && !literal_value) {
+ /* Ending a mutipart. */
+ if(*mimecurrent == *mimepost) {
+ warnf(config->global, "no multipart to terminate!\n");
+ Curl_safefree(contents);
+ return 9;
+ }
+ *mimecurrent = (*mimecurrent)->parent->parent;
+ }
+ else if('@' == contp[0] && !literal_value) {
- struct multi_files *multi_start = NULL;
- struct multi_files *multi_current = NULL;
+ /* we use the @-letter to indicate file name(s) */
- char *ptr = contp;
- char *end = ptr + strlen(ptr);
+ curl_mime *subparts = NULL;
do {
/* since this was a file, it may have a content-type specifier
at the end too, or a filename. Or both. */
- char *filename = NULL;
- char *word_end;
- bool semicolon;
-
- type = NULL;
-
- ++ptr;
- contp = get_param_word(&ptr, &word_end);
- semicolon = (';' == *ptr) ? TRUE : FALSE;
- *word_end = '\0'; /* terminate the contp */
-
- /* have other content, continue parse */
- while(semicolon) {
- /* have type or filename field */
- ++ptr;
- while(*ptr && (ISSPACE(*ptr)))
- ++ptr;
-
- if(checkprefix("type=", ptr)) {
- /* set type pointer */
- type = &ptr[5];
-
- /* verify that this is a fine type specifier */
- if(2 != sscanf(type, "%127[^/]/%127[^;,\n]",
- type_major, type_minor)) {
- warnf(config->global,
- "Illegally formatted content-type field!\n");
- Curl_safefree(contents);
- FreeMultiInfo(&multi_start, &multi_current);
- return 2; /* illegal content-type syntax! */
- }
-
- /* now point beyond the content-type specifier */
- sep = type + strlen(type_major)+strlen(type_minor)+1;
-
- /* there's a semicolon following - we check if it is a filename
- specified and if not we simply assume that it is text that
- the user wants included in the type and include that too up
- to the next sep. */
- ptr = sep;
- if(*sep==';') {
- if(!checkprefix(";filename=", sep)) {
- ptr = sep + 1;
- (void)get_param_word(&ptr, &sep);
- semicolon = (';' == *ptr) ? TRUE : FALSE;
- }
- }
- else
- semicolon = FALSE;
+ ++contp;
+ sep = get_param_part(config, ',', &contp,
+ &data, &type, &filename, &encoder, &headers);
+ if(sep < 0) {
+ if(subparts != *mimecurrent)
+ curl_mime_free(subparts);
+ Curl_safefree(contents);
+ return 10;
+ }
- if(*sep)
- *sep = '\0'; /* zero terminate type string */
- }
- else if(checkprefix("filename=", ptr)) {
- ptr += 9;
- filename = get_param_word(&ptr, &word_end);
- semicolon = (';' == *ptr) ? TRUE : FALSE;
- *word_end = '\0';
- }
+ /* now contp point to comma or string end.
+ If more files to come, make sure we have multiparts. */
+ if(!subparts) {
+ if(sep != ',') /* If there is a single file. */
+ subparts = *mimecurrent;
else {
- /* unknown prefix, skip to next block */
- char *unknown = NULL;
- unknown = get_param_word(&ptr, &word_end);
- semicolon = (';' == *ptr) ? TRUE : FALSE;
- if(*unknown) {
- *word_end = '\0';
- warnf(config->global, "skip unknown form field: %s\n", unknown);
+ subparts = curl_mime_init(config->easy);
+ if(!subparts) {
+ warnf(config->global, "curl_mime_init failed!\n");
+ curl_slist_free_all(headers);
+ Curl_safefree(contents);
+ return 11;
}
}
}
- /* now ptr point to comma or string end */
+ /* Allocate a part for that file. */
+ part = curl_mime_addpart(subparts);
+ if(!part) {
+ warnf(config->global, "curl_mime_addpart failed!\n");
+ if(subparts != *mimecurrent)
+ curl_mime_free(subparts);
+ curl_slist_free_all(headers);
+ Curl_safefree(contents);
+ return 12;
+ }
- /* if type == NULL curl_formadd takes care of the problem */
+ /* Set part headers. */
+ if(curl_mime_headers(part, headers, 1)) {
+ warnf(config->global, "curl_mime_headers failed!\n");
+ if(subparts != *mimecurrent)
+ curl_mime_free(subparts);
+ curl_slist_free_all(headers);
+ Curl_safefree(contents);
+ return 13;
+ }
- if(*contp && !AddMultiFiles(contp, type, filename, &multi_start,
- &multi_current)) {
- warnf(config->global, "Error building form post!\n");
+ /* Setup file in part. */
+ res = file_or_stdin(part, data);
+ if(res) {
+ warnf(config->global, "setting file %s failed!\n", data);
+ if(res != CURLE_READ_ERROR) {
+ if(subparts != *mimecurrent)
+ curl_mime_free(subparts);
+ Curl_safefree(contents);
+ return 14;
+ }
+ }
+ if(filename && curl_mime_filename(part, filename)) {
+ warnf(config->global, "curl_mime_filename failed!\n");
+ if(subparts != *mimecurrent)
+ curl_mime_free(subparts);
+ Curl_safefree(contents);
+ return 15;
+ }
+ if(curl_mime_type(part, type)) {
+ warnf(config->global, "curl_mime_type failed!\n");
+ if(subparts != *mimecurrent)
+ curl_mime_free(subparts);
+ Curl_safefree(contents);
+ return 16;
+ }
+ if(curl_mime_encoder(part, encoder)) {
+ warnf(config->global, "curl_mime_encoder failed!\n");
+ if(subparts != *mimecurrent)
+ curl_mime_free(subparts);
Curl_safefree(contents);
- FreeMultiInfo(&multi_start, &multi_current);
- return 3;
+ return 17;
}
- /* *ptr could be '\0', so we just check with the string end */
- } while(ptr < end); /* loop if there's another file name */
+ /* *contp could be '\0', so we just check with the delimiter */
+ } while(sep); /* loop if there's another file name */
/* now we add the multiple files section */
- if(multi_start) {
- struct curl_forms *forms = NULL;
- struct multi_files *start = multi_start;
- unsigned int i, count = 0;
- while(start) {
- start = start->next;
- ++count;
- }
- forms = malloc((count+1)*sizeof(struct curl_forms));
- if(!forms) {
- fprintf(config->global->errors, "Error building form post!\n");
+ if(subparts != *mimecurrent) {
+ part = curl_mime_addpart(*mimecurrent);
+ if(!part) {
+ warnf(config->global, "curl_mime_addpart failed!\n");
+ curl_mime_free(subparts);
Curl_safefree(contents);
- FreeMultiInfo(&multi_start, &multi_current);
- return 4;
- }
- for(i = 0, start = multi_start; i < count; ++i, start = start->next) {
- forms[i].option = start->form.option;
- forms[i].value = start->form.value;
+ return 18;
}
- forms[count].option = CURLFORM_END;
- FreeMultiInfo(&multi_start, &multi_current);
- if(curl_formadd(httppost, last_post,
- CURLFORM_COPYNAME, name,
- CURLFORM_ARRAY, forms, CURLFORM_END) != 0) {
- warnf(config->global, "curl_formadd failed!\n");
- Curl_safefree(forms);
+ if(curl_mime_subparts(part, subparts)) {
+ warnf(config->global, "curl_mime_subparts failed!\n");
+ curl_mime_free(subparts);
Curl_safefree(contents);
- return 5;
+ return 19;
}
- Curl_safefree(forms);
}
}
else {
- struct curl_forms info[4];
- int i = 0;
- char *ct = literal_value ? NULL : strstr(contp, ";type=");
-
- info[i].option = CURLFORM_COPYNAME;
- info[i].value = name;
- i++;
-
- if(ct) {
- info[i].option = CURLFORM_CONTENTTYPE;
- info[i].value = &ct[6];
- i++;
- ct[0] = '\0'; /* zero terminate here */
- }
+ /* Allocate a mime part. */
+ part = curl_mime_addpart(*mimecurrent);
+ if(!part) {
+ warnf(config->global, "curl_mime_addpart failed!\n");
+ Curl_safefree(contents);
+ return 20;
+ }
- if(contp[0]=='<' && !literal_value) {
- info[i].option = CURLFORM_FILECONTENT;
- info[i].value = contp+1;
- i++;
- info[i].option = CURLFORM_END;
+ if(*contp == '<' && !literal_value) {
+ ++contp;
+ sep = get_param_part(config, '\0', &contp,
+ &data, &type, NULL, &encoder, &headers);
+ if(sep < 0) {
+ Curl_safefree(contents);
+ return 21;
+ }
- if(curl_formadd(httppost, last_post,
- CURLFORM_ARRAY, info, CURLFORM_END) != 0) {
- warnf(config->global, "curl_formadd failed, possibly the file %s is "
- "bad!\n", contp + 1);
+ /* Set part headers. */
+ if(curl_mime_headers(part, headers, 1)) {
+ warnf(config->global, "curl_mime_headers failed!\n");
+ curl_slist_free_all(headers);
Curl_safefree(contents);
- return 6;
+ return 22;
+ }
+
+ /* Setup file in part. */
+ res = file_or_stdin(part, data);
+ if(res) {
+ warnf(config->global, "setting file %s failed!\n", data);
+ if(res != CURLE_READ_ERROR) {
+ Curl_safefree(contents);
+ return 23;
+ }
}
}
else {
+ if(literal_value)
+ data = contp;
+ else {
+ sep = get_param_part(config, '\0', &contp,
+ &data, &type, &filename, &encoder, &headers);
+ if(sep < 0) {
+ Curl_safefree(contents);
+ return 24;
+ }
+ }
+
+ /* Set part headers. */
+ if(curl_mime_headers(part, headers, 1)) {
+ warnf(config->global, "curl_mime_headers failed!\n");
+ curl_slist_free_all(headers);
+ Curl_safefree(contents);
+ return 25;
+ }
+
#ifdef CURL_DOES_CONVERSIONS
- if(convert_to_network(contp, strlen(contp))) {
+ if(convert_to_network(data, strlen(data))) {
warnf(config->global, "curl_formadd failed!\n");
Curl_safefree(contents);
- return 7;
+ return 26;
}
#endif
- info[i].option = CURLFORM_COPYCONTENTS;
- info[i].value = contp;
- i++;
- info[i].option = CURLFORM_END;
- if(curl_formadd(httppost, last_post,
- CURLFORM_ARRAY, info, CURLFORM_END) != 0) {
- warnf(config->global, "curl_formadd failed!\n");
+
+ if(curl_mime_data(part, data, CURL_ZERO_TERMINATED)) {
+ warnf(config->global, "curl_mime_data failed!\n");
Curl_safefree(contents);
- return 8;
+ return 27;
}
}
+
+ if(curl_mime_filename(part, filename)) {
+ warnf(config->global, "curl_mime_filename failed!\n");
+ Curl_safefree(contents);
+ return 28;
+ }
+ if(curl_mime_type(part, type)) {
+ warnf(config->global, "curl_mime_type failed!\n");
+ Curl_safefree(contents);
+ return 29;
+ }
+ if(curl_mime_encoder(part, encoder)) {
+ warnf(config->global, "curl_mime_encoder failed!\n");
+ Curl_safefree(contents);
+ return 30;
+ }
+
+ if(sep) {
+ *contp = (char) sep;
+ warnf(config->global,
+ "garbage at end of field specification: %s\n", contp);
+ }
}
+ /* Set part name. */
+ if(name && curl_mime_name(part, name)) {
+ warnf(config->global, "curl_mime_name failed!\n");
+ Curl_safefree(contents);
+ return 31;
+ }
}
else {
warnf(config->global, "Illegally formatted input field!\n");
- return 1;
+ Curl_safefree(contents);
+ return 32;
}
Curl_safefree(contents);
return 0;
diff --git a/src/tool_formparse.h b/src/tool_formparse.h
index ce7a292..a52b98d 100644
--- a/src/tool_formparse.h
+++ b/src/tool_formparse.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,8 +25,8 @@
int formparse(struct OperationConfig *config,
const char *input,
- struct curl_httppost **httppost,
- struct curl_httppost **last_post,
+ curl_mime **mimepost,
+ curl_mime **mimecurrent,
bool literal_value);
#endif /* HEADER_CURL_TOOL_FORMPARSE_H */
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index b7ee519..12e3abd 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -188,6 +188,7 @@ static const struct LongShort aliases[]= {
{"$W", "abstract-unix-socket", ARG_STRING},
{"$X", "tls-max", ARG_STRING},
{"$Y", "suppress-connect-headers", ARG_BOOL},
+ {"$Z", "compressed-ssh", ARG_BOOL},
{"0", "http1.0", ARG_NONE},
{"01", "http1.1", ARG_NONE},
{"02", "http2", ARG_NONE},
@@ -448,7 +449,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
if(('-' != flag[0]) ||
(('-' == flag[0]) && ('-' == flag[1]))) {
/* this should be a long name */
- const char *word = ('-' == flag[0]) ? flag+2 : flag;
+ const char *word = ('-' == flag[0]) ? flag + 2 : flag;
size_t fnam = strlen(word);
int numhits = 0;
@@ -491,7 +492,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
if(!longopt) {
letter = (char)*parse;
- subletter='\0';
+ subletter = '\0';
}
else {
letter = parse[0];
@@ -590,7 +591,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
{
/* We support G, M, K too */
char *unit;
- curl_off_t value = curlx_strtoofft(nextarg, &unit, 0);
+ curl_off_t value;
+ if(curlx_strtoofft(nextarg, &unit, 0, &value)) {
+ warnf(global, "unsupported rate\n");
+ return PARAM_BAD_USE;
+ }
if(!*unit)
unit = (char *)"b";
@@ -782,7 +787,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
url = config->url_get;
else
/* there was no free node, create one! */
- url = new_getout(config);
+ config->url_get = url = new_getout(config);
if(!url)
return PARAM_NO_MEM;
@@ -999,7 +1004,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
#ifdef USE_METALINK
int mlmaj, mlmin, mlpatch;
metalink_get_version(&mlmaj, &mlmin, &mlpatch);
- if((mlmaj*10000)+(mlmin*100)+mlpatch < CURL_REQ_LIBMETALINK_VERS) {
+ if((mlmaj*10000)+(mlmin*100) + mlpatch < CURL_REQ_LIBMETALINK_VERS) {
warnf(global,
"--metalink option cannot be used because the version of "
"the linked libmetalink library is too old. "
@@ -1072,6 +1077,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case 'Y': /* --suppress-connect-headers */
config->suppress_connect_headers = toggle;
break;
+ case 'Z': /* --compressed-ssh */
+ config->ssh_compression = toggle;
+ break;
}
break;
case '#': /* --progress-bar */
@@ -1182,7 +1190,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->resume_from_current = TRUE;
config->resume_from = 0;
}
- config->use_resume=TRUE;
+ config->use_resume = TRUE;
break;
case 'd':
/* postfield data */
@@ -1346,11 +1354,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
memcpy(config->postfields, oldpost, (size_t)oldlen);
/* use byte value 0x26 for '&' to accommodate non-ASCII platforms */
config->postfields[oldlen] = '\x26';
- memcpy(&config->postfields[oldlen+1], postdata, size);
- config->postfields[oldlen+1+size] = '\0';
+ memcpy(&config->postfields[oldlen + 1], postdata, size);
+ config->postfields[oldlen + 1 + size] = '\0';
Curl_safefree(oldpost);
Curl_safefree(postdata);
- config->postfieldsize += size+1;
+ config->postfieldsize += size + 1;
}
else {
config->postfields = postdata;
@@ -1598,11 +1606,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
to sort this out slowly and carefully */
if(formparse(config,
nextarg,
- &config->httppost,
- &config->last_post,
- (subletter=='s')?TRUE:FALSE)) /* 's' means literal string */
+ &config->mimepost,
+ &config->mimecurrent,
+ (subletter == 's')?TRUE:FALSE)) /* 's' is literal string */
return PARAM_BAD_USE;
- if(SetHTTPrequest(config, HTTPREQ_FORMPOST, &config->httpreq))
+ if(SetHTTPrequest(config, HTTPREQ_MIMEPOST, &config->httpreq))
return PARAM_BAD_USE;
break;
@@ -1779,7 +1787,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
url = config->url_out;
else
/* there was no free node, create one! */
- url = new_getout(config);
+ config->url_out = url = new_getout(config);
if(!url)
return PARAM_NO_MEM;
@@ -1843,10 +1851,13 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
if(ISDIGIT(*nextarg) && !strchr(nextarg, '-')) {
char buffer[32];
curl_off_t off;
+ if(curlx_strtoofft(nextarg, NULL, 10, &off)) {
+ warnf(global, "unsupported range point\n");
+ return PARAM_BAD_USE;
+ }
warnf(global,
"A specified range MUST include at least one dash (-). "
"Appending one for you!\n");
- off = curlx_strtoofft(nextarg, NULL, 10);
snprintf(buffer, sizeof(buffer), "%" CURL_FORMAT_CURL_OFF_T "-", off);
Curl_safefree(config->range);
config->range = strdup(buffer);
@@ -1901,23 +1912,23 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
/* we are uploading */
{
struct getout *url;
- if(!config->url_out)
- config->url_out = config->url_list;
- if(config->url_out) {
+ if(!config->url_ul)
+ config->url_ul = config->url_list;
+ if(config->url_ul) {
/* there's a node here, if it already is filled-in continue to find
an "empty" node */
- while(config->url_out && (config->url_out->flags & GETOUT_UPLOAD))
- config->url_out = config->url_out->next;
+ while(config->url_ul && (config->url_ul->flags & GETOUT_UPLOAD))
+ config->url_ul = config->url_ul->next;
}
/* now there might or might not be an available node to fill in! */
- if(config->url_out)
+ if(config->url_ul)
/* existing node */
- url = config->url_out;
+ url = config->url_ul;
else
/* there was no free node, create one! */
- url = new_getout(config);
+ config->url_ul = url = new_getout(config);
if(!url)
return PARAM_NO_MEM;
@@ -2042,7 +2053,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
}
now = time(NULL);
- config->condtime=curl_getdate(nextarg, &now);
+ config->condtime = curl_getdate(nextarg, &now);
if(-1 == (int)config->condtime) {
/* now let's see if it is a file name to get the time from instead! */
struct_stat statbuf;
diff --git a/src/tool_help.c b/src/tool_help.c
index 42dc779..c6d329c 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -54,7 +54,7 @@ static const struct helptxt helptext[] = {
"Append to target file when uploading"},
{" --basic",
"Use HTTP Basic Authentication"},
- {" --cacert <CA certificate>",
+ {" --cacert <file>",
"CA certificate to verify peer against"},
{" --capath <dir>",
"CA directory to verify peer against"},
@@ -68,6 +68,8 @@ static const struct helptxt helptext[] = {
"SSL ciphers to use"},
{" --compressed",
"Request compressed response"},
+ {" --compressed-ssh",
+ "Enable SSH compression"},
{"-K, --config <file>",
"Read config from a file"},
{" --connect-timeout <seconds>",
@@ -129,9 +131,9 @@ static const struct helptxt helptext[] = {
{" --false-start",
"Enable TLS False Start"},
{"-F, --form <name=content>",
- "Specify HTTP multipart POST data"},
+ "Specify multipart MIME data"},
{" --form-string <name=string>",
- "Specify HTTP multipart POST data"},
+ "Specify multipart MIME data"},
{" --ftp-account <data>",
"Account data string"},
{" --ftp-alternative-to-user <command>",
@@ -497,11 +499,13 @@ static const struct feat feats[] = {
{"NTLM_WB", CURL_VERSION_NTLM_WB},
{"SSL", CURL_VERSION_SSL},
{"libz", CURL_VERSION_LIBZ},
+ {"brotli", CURL_VERSION_BROTLI},
{"CharConv", CURL_VERSION_CONV},
{"TLS-SRP", CURL_VERSION_TLSAUTH_SRP},
{"HTTP2", CURL_VERSION_HTTP2},
{"UnixSockets", CURL_VERSION_UNIX_SOCKETS},
- {"HTTPS-proxy", CURL_VERSION_HTTPS_PROXY}
+ {"HTTPS-proxy", CURL_VERSION_HTTPS_PROXY},
+ {"MultiSSL", CURL_VERSION_MULTI_SSL}
};
void tool_help(void)
diff --git a/src/tool_hugehelp.c b/src/tool_hugehelp.c
index 01f7ddf..f58e98a 100644
--- a/src/tool_hugehelp.c
+++ b/src/tool_hugehelp.c
@@ -2,7 +2,6 @@
#ifndef HAVE_LIBZ
/*
* NEVER EVER edit this manually, fix the mkhelp.pl script instead!
- * Generation time: Sun Aug 13 18:22:49 2017
*/
#ifdef USE_MANUAL
#include "tool_hugehelp.h"
@@ -212,7 +211,7 @@ void hugehelp(void)
"\n"
" See also --proxy-basic.\n"
"\n"
-" --cacert <CA certificate>\n"
+" --cacert <file>\n"
" (TLS) Tells curl to use the specified certificate file to verify\n"
" the peer. The file may contain multiple CA certificates. The\n"
, stdout);
@@ -346,243 +345,249 @@ void hugehelp(void)
fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
+" --compressed-ssh\n"
+" (SCP SFTP) Enables built-in SSH compression. This is a request,\n"
+" not an order; the server may or may not do it.\n"
+"\n"
+" Added in 7.56.0.\n"
+"\n"
" --compressed\n"
" (HTTP) Request a compressed response using one of the algorithms\n"
-" curl supports, and save the uncompressed document. If this\n"
-" option is used and the server sends an unsupported encoding,\n"
+" curl supports, and save the uncompressed document. If this\n"
+, stdout);
+ fputs(
+" option is used and the server sends an unsupported encoding,\n"
" curl will report an error.\n"
"\n"
" -K, --config <file>\n"
"\n"
-" Specify a text file to read curl arguments from. The command\n"
-, stdout);
- fputs(
-" line arguments found in the text file will be used as if they\n"
+" Specify a text file to read curl arguments from. The command\n"
+" line arguments found in the text file will be used as if they\n"
" were provided on the command line.\n"
"\n"
-" Options and their parameters must be specified on the same line\n"
-" in the file, separated by whitespace, colon, or the equals sign.\n"
-" Long option names can optionally be given in the config file\n"
-" without the initial double dashes and if so, the colon or equals\n"
+" Options and their parameters must be specified on the same line\n"
, stdout);
fputs(
+" in the file, separated by whitespace, colon, or the equals sign.\n"
+" Long option names can optionally be given in the config file\n"
+" without the initial double dashes and if so, the colon or equals\n"
" characters can be used as separators. If the option is specified\n"
-" with one or two dashes, there can be no colon or equals charac-\n"
+" with one or two dashes, there can be no colon or equals charac-\n"
" ter between the option and its parameter.\n"
"\n"
-" If the parameter is to contain whitespace, the parameter must be\n"
-" enclosed within quotes. Within double quotes, the following\n"
-" escape sequences are available: \\\\, \\\", \\t, \\n, \\r and \\v. A\n"
, stdout);
fputs(
-" backslash preceding any other letter is ignored. If the first\n"
+" If the parameter is to contain whitespace, the parameter must be\n"
+" enclosed within quotes. Within double quotes, the following\n"
+" escape sequences are available: \\\\, \\\", \\t, \\n, \\r and \\v. A\n"
+" backslash preceding any other letter is ignored. If the first\n"
" column of a config line is a '#' character, the rest of the line\n"
" will be treated as a comment. Only write one option per physical\n"
+, stdout);
+ fputs(
" line in the config file.\n"
"\n"
-" Specify the filename to -K, --config as '-' to make curl read\n"
+" Specify the filename to -K, --config as '-' to make curl read\n"
" the file from stdin.\n"
"\n"
-" Note that to be able to specify a URL in the config file, you\n"
-, stdout);
- fputs(
-" need to specify it using the --url option, and not by simply\n"
-" writing the URL on its own line. So, it could look similar to\n"
+" Note that to be able to specify a URL in the config file, you\n"
+" need to specify it using the --url option, and not by simply\n"
+" writing the URL on its own line. So, it could look similar to\n"
" this:\n"
"\n"
" url = \"https://curl.haxx.se/docs/\"\n"
"\n"
-" When curl is invoked, it (unless -q, --disable is used) checks\n"
+, stdout);
+ fputs(
+" When curl is invoked, it (unless -q, --disable is used) checks\n"
" for a default config file and uses it if found. The default con-\n"
" fig file is checked for in the following places in this order:\n"
"\n"
+" 1) curl tries to find the \"home dir\": It first checks for the\n"
+" CURL_HOME and then the HOME environment variables. Failing that,\n"
+" it uses getpwuid() on Unix-like systems (which returns the home\n"
, stdout);
fputs(
-" 1) curl tries to find the \"home dir\": It first checks for the\n"
-" CURL_HOME and then the HOME environment variables. Failing that,\n"
-" it uses getpwuid() on Unix-like systems (which returns the home\n"
-" dir given the current user in your system). On Windows, it then\n"
+" dir given the current user in your system). On Windows, it then\n"
" checks for the APPDATA variable, or as a last resort the '%USER-\n"
" PROFILE%\\Application Data'.\n"
"\n"
-, stdout);
- fputs(
-" 2) On windows, if there is no _curlrc file in the home dir, it\n"
+" 2) On windows, if there is no _curlrc file in the home dir, it\n"
" checks for one in the same dir the curl executable is placed. On\n"
-" Unix-like systems, it will simply try to load .curlrc from the\n"
+" Unix-like systems, it will simply try to load .curlrc from the\n"
" determined home dir.\n"
"\n"
+, stdout);
+ fputs(
" # --- Example file ---\n"
" # this is a comment\n"
" url = \"example.com\"\n"
" output = \"curlhere.html\"\n"
" user-agent = \"superagent/1.0\"\n"
"\n"
-, stdout);
- fputs(
" # and fetch another URL too\n"
" url = \"example.com/docs/manpage.html\"\n"
" -O\n"
" referer = \"http://nowhereatall.example.com/\"\n"
" # --- End of example file ---\n"
"\n"
-" This option can be used multiple times to load multiple config\n"
+" This option can be used multiple times to load multiple config\n"
+, stdout);
+ fputs(
" files.\n"
"\n"
" --connect-timeout <seconds>\n"
-" Maximum time in seconds that you allow curl's connection to\n"
-, stdout);
- fputs(
-" take. This only limits the connection phase, so if curl con-\n"
-" nects within the given period it will continue - if not it will\n"
+" Maximum time in seconds that you allow curl's connection to\n"
+" take. This only limits the connection phase, so if curl con-\n"
+" nects within the given period it will continue - if not it will\n"
" exit. Since version 7.32.0, this option accepts decimal values.\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -m, --max-time.\n"
"\n"
+, stdout);
+ fputs(
" --connect-to <HOST1:PORT1:HOST2:PORT2>\n"
"\n"
" For a request to the given HOST1:PORT1 pair, connect to\n"
-, stdout);
- fputs(
" HOST2:PORT2 instead. This option is suitable to direct requests\n"
" at a specific server, e.g. at a specific cluster node in a clus-\n"
-" ter of servers. This option is only used to establish the net-\n"
-" work connection. It does NOT affect the hostname/port that is\n"
-" used for TLS/SSL (e.g. SNI, certificate verification) or for the\n"
-" application protocols. \"HOST1\" and \"PORT1\" may be the empty\n"
+" ter of servers. This option is only used to establish the net-\n"
+" work connection. It does NOT affect the hostname/port that is\n"
, stdout);
fputs(
+" used for TLS/SSL (e.g. SNI, certificate verification) or for the\n"
+" application protocols. \"HOST1\" and \"PORT1\" may be the empty\n"
" string, meaning \"any host/port\". \"HOST2\" and \"PORT2\" may also be\n"
-" the empty string, meaning \"use the request's original\n"
+" the empty string, meaning \"use the request's original\n"
" host/port\".\n"
"\n"
" A \"host\" specified to this option is compared as a string, so it\n"
-" needs to match the name used in request URL. It can be either\n"
-" numerical such as \"127.0.0.1\" or the full host name such as\n"
-" \"example.org\".\n"
-"\n"
, stdout);
fputs(
+" needs to match the name used in request URL. It can be either\n"
+" numerical such as \"127.0.0.1\" or the full host name such as\n"
+" \"example.org\".\n"
+"\n"
" This option can be used many times to add many connect rules.\n"
"\n"
" See also --resolve and -H, --header. Added in 7.49.0.\n"
"\n"
" -C, --continue-at <offset>\n"
-" Continue/Resume a previous file transfer at the given offset.\n"
-" The given offset is the exact number of bytes that will be\n"
-" skipped, counting from the beginning of the source file before\n"
-" it is transferred to the destination. If used with uploads, the\n"
+" Continue/Resume a previous file transfer at the given offset.\n"
, stdout);
fputs(
+" The given offset is the exact number of bytes that will be\n"
+" skipped, counting from the beginning of the source file before\n"
+" it is transferred to the destination. If used with uploads, the\n"
" FTP server command SIZE will not be used by curl.\n"
"\n"
-" Use \"-C -\" to tell curl to automatically find out where/how to\n"
-" resume the transfer. It then uses the given output/input files\n"
+" Use \"-C -\" to tell curl to automatically find out where/how to\n"
+" resume the transfer. It then uses the given output/input files\n"
" to figure that out.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -r, --range.\n"
"\n"
" -c, --cookie-jar <filename>\n"
-" (HTTP) Specify to which file you want curl to write all cookies\n"
+" (HTTP) Specify to which file you want curl to write all cookies\n"
+" after a completed operation. Curl writes all cookies from its\n"
+" in-memory cookie storage to the given file at the end of opera-\n"
+" tions. If no cookies are known, no data will be written. The\n"
, stdout);
fputs(
-" after a completed operation. Curl writes all cookies from its\n"
-" in-memory cookie storage to the given file at the end of opera-\n"
-" tions. If no cookies are known, no data will be written. The\n"
-" file will be written using the Netscape cookie file format. If\n"
+" file will be written using the Netscape cookie file format. If\n"
" you set the file name to a single dash, \"-\", the cookies will be\n"
" written to stdout.\n"
"\n"
-, stdout);
- fputs(
-" This command line option will activate the cookie engine that\n"
+" This command line option will activate the cookie engine that\n"
" makes curl record and use cookies. Another way to activate it is\n"
" to use the -b, --cookie option.\n"
"\n"
" If the cookie jar can't be created or written to, the whole curl\n"
-" operation won't fail or even report an error clearly. Using -v,\n"
-" --verbose will get a warning displayed, but that is the only\n"
, stdout);
fputs(
+" operation won't fail or even report an error clearly. Using -v,\n"
+" --verbose will get a warning displayed, but that is the only\n"
" visible feedback you get about this possibly lethal situation.\n"
"\n"
-" If this option is used several times, the last specified file\n"
+" If this option is used several times, the last specified file\n"
" name will be used.\n"
"\n"
" -b, --cookie <data>\n"
" (HTTP) Pass the data to the HTTP server in the Cookie header. It\n"
-" is supposedly the data previously received from the server in a\n"
-" \"Set-Cookie:\" line. The data should be in the format\n"
+, stdout);
+ fputs(
+" is supposedly the data previously received from the server in a\n"
+" \"Set-Cookie:\" line. The data should be in the format\n"
" \"NAME1=VALUE1; NAME2=VALUE2\".\n"
"\n"
+" If no '=' symbol is used in the argument, it is instead treated\n"
+" as a filename to read previously stored cookie from. This option\n"
+" also activates the cookie engine which will make curl record\n"
, stdout);
fputs(
-" If no '=' symbol is used in the argument, it is instead treated\n"
-" as a filename to read previously stored cookie from. This option\n"
-" also activates the cookie engine which will make curl record\n"
-" incoming cookies, which may be handy if you're using this in\n"
-" combination with the -L, --location option or do multiple URL\n"
+" incoming cookies, which may be handy if you're using this in\n"
+" combination with the -L, --location option or do multiple URL\n"
" transfers on the same invoke.\n"
"\n"
-, stdout);
- fputs(
" The file format of the file to read cookies from should be plain\n"
-" HTTP headers (Set-Cookie style) or the Netscape/Mozilla cookie\n"
+" HTTP headers (Set-Cookie style) or the Netscape/Mozilla cookie\n"
" file format.\n"
"\n"
-" The file specified with -b, --cookie is only used as input. No\n"
-" cookies will be written to the file. To store cookies, use the\n"
-" -c, --cookie-jar option.\n"
-"\n"
-" Exercise caution if you are using this option and multiple\n"
+" The file specified with -b, --cookie is only used as input. No\n"
, stdout);
fputs(
+" cookies will be written to the file. To store cookies, use the\n"
+" -c, --cookie-jar option.\n"
+"\n"
+" Exercise caution if you are using this option and multiple\n"
" transfers may occur. If you use the NAME1=VALUE1; format, or in\n"
-" a file use the Set-Cookie format and don't specify a domain,\n"
+" a file use the Set-Cookie format and don't specify a domain,\n"
" then the cookie is sent for any domain (even after redirects are\n"
-" followed) and cannot be modified by a server-set cookie. If the\n"
-" cookie engine is enabled and a server sets a cookie of the same\n"
-" name then both will be sent on a future transfer to that server,\n"
, stdout);
fputs(
-" likely not what you intended. To address these issues set a\n"
-" domain in Set-Cookie (doing that will include sub domains) or\n"
+" followed) and cannot be modified by a server-set cookie. If the\n"
+" cookie engine is enabled and a server sets a cookie of the same\n"
+" name then both will be sent on a future transfer to that server,\n"
+" likely not what you intended. To address these issues set a\n"
+" domain in Set-Cookie (doing that will include sub domains) or\n"
" use the Netscape format.\n"
"\n"
-" If this option is used several times, the last one will be used.\n"
-" Users very often want to both read cookies from a file and write\n"
-" updated cookies back to a file, so using both -b, --cookie and\n"
, stdout);
fputs(
+" If this option is used several times, the last one will be used.\n"
+" Users very often want to both read cookies from a file and write\n"
+" updated cookies back to a file, so using both -b, --cookie and\n"
" -c, --cookie-jar in the same command line is common.\n"
"\n"
" --create-dirs\n"
" When used in conjunction with the -o, --output option, curl will\n"
-" create the necessary local directory hierarchy as needed. This\n"
-" option creates the dirs mentioned with the -o, --output option,\n"
-" nothing else. If the --output file name uses no dir or if the\n"
-" dirs it mentions already exist, no dir will be created.\n"
-"\n"
+" create the necessary local directory hierarchy as needed. This\n"
, stdout);
fputs(
-" To create remote directories when using FTP or SFTP, try --ftp-\n"
+" option creates the dirs mentioned with the -o, --output option,\n"
+" nothing else. If the --output file name uses no dir or if the\n"
+" dirs it mentions already exist, no dir will be created.\n"
+"\n"
+" To create remote directories when using FTP or SFTP, try --ftp-\n"
" create-dirs.\n"
"\n"
-" --crlf (FTP SMTP) Convert LF to CRLF in upload. Useful for MVS\n"
+" --crlf (FTP SMTP) Convert LF to CRLF in upload. Useful for MVS\n"
" (OS/390).\n"
"\n"
" (SMTP added in 7.40.0)\n"
"\n"
+, stdout);
+ fputs(
" --crlfile <file>\n"
" (TLS) Provide a file using PEM format with a Certificate Revoca-\n"
" tion List that may specify peer certificates that are to be con-\n"
" sidered revoked.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.19.7.\n"
@@ -591,241 +596,241 @@ void hugehelp(void)
" (HTTP) This is just an alias for -d, --data.\n"
"\n"
" --data-binary <data>\n"
-" (HTTP) This posts data exactly as specified with no extra pro-\n"
-" cessing whatsoever.\n"
-"\n"
-" If you start the data with the letter @, the rest should be a\n"
-" filename. Data is posted in a similar manner as -d, --data\n"
, stdout);
fputs(
-" does, except that newlines and carriage returns are preserved\n"
+" (HTTP) This posts data exactly as specified with no extra pro-\n"
+" cessing whatsoever.\n"
+"\n"
+" If you start the data with the letter @, the rest should be a\n"
+" filename. Data is posted in a similar manner as -d, --data\n"
+" does, except that newlines and carriage returns are preserved\n"
" and conversions are never done.\n"
"\n"
-" If this option is used several times, the ones following the\n"
+" If this option is used several times, the ones following the\n"
+, stdout);
+ fputs(
" first will append data as described in -d, --data.\n"
"\n"
" --data-raw <data>\n"
-" (HTTP) This posts data similarly to -d, --data but without the\n"
+" (HTTP) This posts data similarly to -d, --data but without the\n"
" special interpretation of the @ character.\n"
"\n"
" See also -d, --data. Added in 7.43.0.\n"
"\n"
-, stdout);
- fputs(
" --data-urlencode <data>\n"
-" (HTTP) This posts data, similar to the other -d, --data options\n"
+" (HTTP) This posts data, similar to the other -d, --data options\n"
" with the exception that this performs URL-encoding.\n"
"\n"
-" To be CGI-compliant, the <data> part should begin with a name\n"
-" followed by a separator and a content specification. The <data>\n"
+, stdout);
+ fputs(
+" To be CGI-compliant, the <data> part should begin with a name\n"
+" followed by a separator and a content specification. The <data>\n"
" part can be passed to curl using one of the following syntaxes:\n"
"\n"
" content\n"
+" This will make curl URL-encode the content and pass that\n"
+" on. Just be careful so that the content doesn't contain\n"
+" any = or @ symbols, as that will then make the syntax\n"
, stdout);
fputs(
-" This will make curl URL-encode the content and pass that\n"
-" on. Just be careful so that the content doesn't contain\n"
-" any = or @ symbols, as that will then make the syntax\n"
" match one of the other cases below!\n"
"\n"
" =content\n"
-" This will make curl URL-encode the content and pass that\n"
+" This will make curl URL-encode the content and pass that\n"
" on. The preceding = symbol is not included in the data.\n"
"\n"
-, stdout);
- fputs(
" name=content\n"
-" This will make curl URL-encode the content part and pass\n"
-" that on. Note that the name part is expected to be URL-\n"
+" This will make curl URL-encode the content part and pass\n"
+" that on. Note that the name part is expected to be URL-\n"
" encoded already.\n"
"\n"
" @filename\n"
-" This will make curl load data from the given file\n"
-" (including any newlines), URL-encode that data and pass\n"
+, stdout);
+ fputs(
+" This will make curl load data from the given file\n"
+" (including any newlines), URL-encode that data and pass\n"
" it on in the POST.\n"
"\n"
" name@filename\n"
+" This will make curl load data from the given file\n"
+" (including any newlines), URL-encode that data and pass\n"
+" it on in the POST. The name part gets an equal sign\n"
, stdout);
fputs(
-" This will make curl load data from the given file\n"
-" (including any newlines), URL-encode that data and pass\n"
-" it on in the POST. The name part gets an equal sign\n"
" appended, resulting in name=urlencoded-file-content. Note\n"
" that the name is expected to be URL-encoded already.\n"
" See also -d, --data and --data-raw. Added in 7.18.0.\n"
"\n"
" -d, --data <data>\n"
+" (HTTP) Sends the specified data in a POST request to the HTTP\n"
+" server, in the same way that a browser does when a user has\n"
+" filled in an HTML form and presses the submit button. This will\n"
, stdout);
fputs(
-" (HTTP) Sends the specified data in a POST request to the HTTP\n"
-" server, in the same way that a browser does when a user has\n"
-" filled in an HTML form and presses the submit button. This will\n"
" cause curl to pass the data to the server using the content-type\n"
" application/x-www-form-urlencoded. Compare to -F, --form.\n"
"\n"
" --data-raw is almost the same but does not have a special inter-\n"
-, stdout);
- fputs(
-" pretation of the @ character. To post data purely binary, you\n"
-" should instead use the --data-binary option. To URL-encode the\n"
+" pretation of the @ character. To post data purely binary, you\n"
+" should instead use the --data-binary option. To URL-encode the\n"
" value of a form field you may use --data-urlencode.\n"
"\n"
-" If any of these options is used more than once on the same com-\n"
-" mand line, the data pieces specified will be merged together\n"
-" with a separating &-symbol. Thus, using '-d name=daniel -d\n"
, stdout);
fputs(
+" If any of these options is used more than once on the same com-\n"
+" mand line, the data pieces specified will be merged together\n"
+" with a separating &-symbol. Thus, using '-d name=daniel -d\n"
" skill=lousy' would generate a post chunk that looks like\n"
" 'name=daniel&skill=lousy'.\n"
"\n"
-" If you start the data with the letter @, the rest should be a\n"
-" file name to read the data from, or - if you want curl to read\n"
-" the data from stdin. Multiple files can also be specified. Post-\n"
-" ing data from a file named from a file like that, carriage\n"
+" If you start the data with the letter @, the rest should be a\n"
, stdout);
fputs(
+" file name to read the data from, or - if you want curl to read\n"
+" the data from stdin. Multiple files can also be specified. Post-\n"
+" ing data from a file named from a file like that, carriage\n"
" returns and newlines will be stripped out. If you don't want the\n"
-" @ character to have a special interpretation use --data-raw\n"
+" @ character to have a special interpretation use --data-raw\n"
" instead.\n"
"\n"
" See also --data-binary and --data-urlencode and --data-raw. This\n"
+, stdout);
+ fputs(
" option overrides -F, --form and -I, --head and --upload.\n"
"\n"
" --delegation <LEVEL>\n"
-" (GSS/kerberos) Set LEVEL to tell the server what it is allowed\n"
-, stdout);
- fputs(
+" (GSS/kerberos) Set LEVEL to tell the server what it is allowed\n"
" to delegate when it comes to user credentials.\n"
"\n"
" none Don't allow any delegation.\n"
"\n"
-" policy Delegates if and only if the OK-AS-DELEGATE flag is set\n"
-" in the Kerberos service ticket, which is a matter of\n"
+" policy Delegates if and only if the OK-AS-DELEGATE flag is set\n"
+" in the Kerberos service ticket, which is a matter of\n"
" realm policy.\n"
"\n"
+, stdout);
+ fputs(
" always Unconditionally allow the server to delegate.\n"
"\n"
" --digest\n"
-" (HTTP) Enables HTTP Digest authentication. This is an authenti-\n"
-, stdout);
- fputs(
-" cation scheme that prevents the password from being sent over\n"
-" the wire in clear text. Use this in combination with the normal\n"
+" (HTTP) Enables HTTP Digest authentication. This is an authenti-\n"
+" cation scheme that prevents the password from being sent over\n"
+" the wire in clear text. Use this in combination with the normal\n"
" -u, --user option to set user name and password.\n"
"\n"
-" If this option is used several times, only the first one is\n"
+" If this option is used several times, only the first one is\n"
" used.\n"
"\n"
-" See also -u, --user and --proxy-digest and --anyauth. This\n"
+, stdout);
+ fputs(
+" See also -u, --user and --proxy-digest and --anyauth. This\n"
" option overrides --basic and --ntlm and --negotiate.\n"
"\n"
" --disable-eprt\n"
-, stdout);
- fputs(
" (FTP) Tell curl to disable the use of the EPRT and LPRT commands\n"
" when doing active FTP transfers. Curl will normally always first\n"
-" attempt to use EPRT, then LPRT before using PORT, but with this\n"
-" option, it will use PORT right away. EPRT and LPRT are exten-\n"
-" sions to the original FTP protocol, and may not work on all\n"
-" servers, but they enable more functionality in a better way than\n"
+" attempt to use EPRT, then LPRT before using PORT, but with this\n"
+" option, it will use PORT right away. EPRT and LPRT are exten-\n"
, stdout);
fputs(
+" sions to the original FTP protocol, and may not work on all\n"
+" servers, but they enable more functionality in a better way than\n"
" the traditional PORT command.\n"
"\n"
" --eprt can be used to explicitly enable EPRT again and --no-eprt\n"
" is an alias for --disable-eprt.\n"
"\n"
-" If the server is accessed using IPv6, this option will have no\n"
+" If the server is accessed using IPv6, this option will have no\n"
" effect as EPRT is necessary then.\n"
"\n"
-" Disabling EPRT only changes the active behavior. If you want to\n"
-" switch to passive mode you need to not use -P, --ftp-port or\n"
-" force it with --ftp-pasv.\n"
-"\n"
, stdout);
fputs(
+" Disabling EPRT only changes the active behavior. If you want to\n"
+" switch to passive mode you need to not use -P, --ftp-port or\n"
+" force it with --ftp-pasv.\n"
+"\n"
" --disable-epsv\n"
-" (FTP) (FTP) Tell curl to disable the use of the EPSV command\n"
-" when doing passive FTP transfers. Curl will normally always\n"
-" first attempt to use EPSV before PASV, but with this option, it\n"
+" (FTP) (FTP) Tell curl to disable the use of the EPSV command\n"
+" when doing passive FTP transfers. Curl will normally always\n"
+" first attempt to use EPSV before PASV, but with this option, it\n"
" will not try using EPSV.\n"
"\n"
+, stdout);
+ fputs(
" --epsv can be used to explicitly enable EPSV again and --no-epsv\n"
" is an alias for --disable-epsv.\n"
"\n"
-, stdout);
- fputs(
-" If the server is an IPv6 host, this option will have no effect\n"
+" If the server is an IPv6 host, this option will have no effect\n"
" as EPSV is necessary then.\n"
"\n"
" Disabling EPSV only changes the passive behavior. If you want to\n"
" switch to active mode you need to use -P, --ftp-port.\n"
"\n"
" -q, --disable\n"
-" If used as the first parameter on the command line, the curlrc\n"
-" config file will not be read and used. See the -K, --config for\n"
+" If used as the first parameter on the command line, the curlrc\n"
, stdout);
fputs(
+" config file will not be read and used. See the -K, --config for\n"
" details on the default config file search path.\n"
"\n"
" --dns-interface <interface>\n"
-" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
-" face>. This option is a counterpart to --interface (which does\n"
-" not affect DNS). The supplied string must be an interface name\n"
+" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
+" face>. This option is a counterpart to --interface (which does\n"
+" not affect DNS). The supplied string must be an interface name\n"
" (not an address).\n"
"\n"
-" See also --dns-ipv4-addr and --dns-ipv6-addr. --dns-interface\n"
, stdout);
fputs(
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-ipv4-addr and --dns-ipv6-addr. --dns-interface\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-ipv4-addr <address>\n"
-" (DNS) Tell curl to bind to <ip-address> when making IPv4 DNS\n"
-" requests, so that the DNS requests originate from this address.\n"
+" (DNS) Tell curl to bind to <ip-address> when making IPv4 DNS\n"
+" requests, so that the DNS requests originate from this address.\n"
" The argument should be a single IPv4 address.\n"
"\n"
-" See also --dns-interface and --dns-ipv6-addr. --dns-ipv4-addr\n"
, stdout);
fputs(
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-interface and --dns-ipv6-addr. --dns-ipv4-addr\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-ipv6-addr <address>\n"
-" (DNS) Tell curl to bind to <ip-address> when making IPv6 DNS\n"
-" requests, so that the DNS requests originate from this address.\n"
+" (DNS) Tell curl to bind to <ip-address> when making IPv6 DNS\n"
+" requests, so that the DNS requests originate from this address.\n"
" The argument should be a single IPv6 address.\n"
"\n"
-" See also --dns-interface and --dns-ipv4-addr. --dns-ipv6-addr\n"
, stdout);
fputs(
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-interface and --dns-ipv4-addr. --dns-ipv6-addr\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-servers <addresses>\n"
-" Set the list of DNS servers to be used instead of the system\n"
+" Set the list of DNS servers to be used instead of the system\n"
" default. The list of IP addresses should be separated with com-\n"
" mas. Port numbers may also optionally be given as :<port-number>\n"
-" after each IP address.\n"
-"\n"
, stdout);
fputs(
-" --dns-servers requires that the underlying libcurl was built to\n"
+" after each IP address.\n"
+"\n"
+" --dns-servers requires that the underlying libcurl was built to\n"
" support c-ares. Added in 7.33.0.\n"
"\n"
" -D, --dump-header <filename>\n"
-" (HTTP FTP) Write the received protocol headers to the specified\n"
+" (HTTP FTP) Write the received protocol headers to the specified\n"
" file.\n"
"\n"
-" This option is handy to use when you want to store the headers\n"
-" that an HTTP site sends to you. Cookies from the headers could\n"
-" then be read in a second curl invocation by using the -b,\n"
+" This option is handy to use when you want to store the headers\n"
+" that an HTTP site sends to you. Cookies from the headers could\n"
, stdout);
fputs(
-" --cookie option! The -c, --cookie-jar option is a better way to\n"
+" then be read in a second curl invocation by using the -b,\n"
+" --cookie option! The -c, --cookie-jar option is a better way to\n"
" store cookies.\n"
"\n"
-" When used in FTP, the FTP server response lines are considered\n"
+" When used in FTP, the FTP server response lines are considered\n"
" being \"headers\" and thus are saved there.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -833,134 +838,149 @@ void hugehelp(void)
" See also -o, --output.\n"
"\n"
" --egd-file <file>\n"
-" (TLS) Specify the path name to the Entropy Gathering Daemon\n"
, stdout);
fputs(
-" socket. The socket is used to seed the random engine for SSL\n"
+" (TLS) Specify the path name to the Entropy Gathering Daemon\n"
+" socket. The socket is used to seed the random engine for SSL\n"
" connections.\n"
"\n"
" See also --random-file.\n"
"\n"
" --engine <name>\n"
-" (TLS) Select the OpenSSL crypto engine to use for cipher opera-\n"
+" (TLS) Select the OpenSSL crypto engine to use for cipher opera-\n"
" tions. Use --engine list to print a list of build-time supported\n"
-" engines. Note that not all (or none) of the engines may be\n"
+" engines. Note that not all (or none) of the engines may be\n"
+, stdout);
+ fputs(
" available at run-time.\n"
"\n"
" --expect100-timeout <seconds>\n"
-, stdout);
- fputs(
" (HTTP) Maximum time in seconds that you allow curl to wait for a\n"
-" 100-continue response when curl emits an Expects: 100-continue\n"
-" header in its request. By default curl will wait one second.\n"
-" This option accepts decimal values! When curl stops waiting, it\n"
+" 100-continue response when curl emits an Expects: 100-continue\n"
+" header in its request. By default curl will wait one second.\n"
+" This option accepts decimal values! When curl stops waiting, it\n"
" will continue as if the response has been received.\n"
"\n"
+, stdout);
+ fputs(
" See also --connect-timeout. Added in 7.47.0.\n"
"\n"
" --fail-early\n"
-, stdout);
- fputs(
" Fail and exit on the first detected transfer error.\n"
"\n"
-" When curl is used to do multiple transfers on the command line,\n"
-" it will attempt to operate on each given URL, one by one. By\n"
-" default, it will ignore errors if there are more URLs given and\n"
-" the last URL's success will determine the error code curl\n"
-" returns. So early failures will be \"hidden\" by subsequent suc-\n"
-" cessful transfers.\n"
-"\n"
+" When curl is used to do multiple transfers on the command line,\n"
+" it will attempt to operate on each given URL, one by one. By\n"
+" default, it will ignore errors if there are more URLs given and\n"
+" the last URL's success will determine the error code curl\n"
, stdout);
fputs(
-" Using this option, curl will instead return an error on the\n"
-" first transfer that fails, independent of the amount of URLs\n"
-" that are given on the command line. This way, no transfer fail-\n"
+" returns. So early failures will be \"hidden\" by subsequent suc-\n"
+" cessful transfers.\n"
+"\n"
+" Using this option, curl will instead return an error on the\n"
+" first transfer that fails, independent of the amount of URLs\n"
+" that are given on the command line. This way, no transfer fail-\n"
" ures go undetected by scripts and similar.\n"
"\n"
" This option is global and does not need to be specified for each\n"
+, stdout);
+ fputs(
" use of -:, --next.\n"
"\n"
" This option does not imply -f, --fail, which causes transfers to\n"
-, stdout);
- fputs(
-" fail due to the server's HTTP status code. You can combine the\n"
+" fail due to the server's HTTP status code. You can combine the\n"
" two options, however note -f, --fail is not global and is there-\n"
" fore contained by -:, --next.\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" -f, --fail\n"
-" (HTTP) Fail silently (no output at all) on server errors. This\n"
-" is mostly done to better enable scripts etc to better deal with\n"
-" failed attempts. In normal cases when an HTTP server fails to\n"
+" (HTTP) Fail silently (no output at all) on server errors. This\n"
, stdout);
fputs(
-" deliver a document, it returns an HTML document stating so\n"
-" (which often also describes why and more). This flag will pre-\n"
+" is mostly done to better enable scripts etc to better deal with\n"
+" failed attempts. In normal cases when an HTTP server fails to\n"
+" deliver a document, it returns an HTML document stating so\n"
+" (which often also describes why and more). This flag will pre-\n"
" vent curl from outputting that and return error 22.\n"
"\n"
-" This method is not fail-safe and there are occasions where non-\n"
-" successful response codes will slip through, especially when\n"
+" This method is not fail-safe and there are occasions where non-\n"
+, stdout);
+ fputs(
+" successful response codes will slip through, especially when\n"
" authentication is involved (response codes 401 and 407).\n"
"\n"
" --false-start\n"
-, stdout);
- fputs(
-" (TLS) Tells curl to use false start during the TLS handshake.\n"
-" False start is a mode where a TLS client will start sending\n"
+" (TLS) Tells curl to use false start during the TLS handshake.\n"
+" False start is a mode where a TLS client will start sending\n"
" application data before verifying the server's Finished message,\n"
" thus saving a round trip when performing a full handshake.\n"
"\n"
-" This is currently only implemented in the NSS and Secure Trans-\n"
+, stdout);
+ fputs(
+" This is currently only implemented in the NSS and Secure Trans-\n"
" port (on iOS 7.0 or later, or OS X 10.9 or later) backends.\n"
"\n"
" Added in 7.42.0.\n"
"\n"
-, stdout);
- fputs(
" --form-string <name=string>\n"
-" (HTTP) Similar to -F, --form except that the value string for\n"
-" the named parameter is used literally. Leading '@' and '<' char-\n"
-" acters, and the ';type=' string in the value have no special\n"
-" meaning. Use this in preference to -F, --form if there's any\n"
-" possibility that the string value may accidentally trigger the\n"
-" '@' or '<' features of -F, --form.\n"
-"\n"
+" (HTTP SMTP IMAP) Similar to -F, --form except that the value\n"
+" string for the named parameter is used literally. Leading '@'\n"
+" and '<' characters, and the ';type=' string in the value have no\n"
, stdout);
fputs(
+" special meaning. Use this in preference to -F, --form if there's\n"
+" any possibility that the string value may accidentally trigger\n"
+" the '@' or '<' features of -F, --form.\n"
+"\n"
" See also -F, --form.\n"
"\n"
" -F, --form <name=content>\n"
-" (HTTP) This lets curl emulate a filled-in form in which a user\n"
-" has pressed the submit button. This causes curl to POST data\n"
-" using the Content-Type multipart/form-data according to RFC\n"
-" 2388. This enables uploading of binary files etc. To force the\n"
-" 'content' part to be a file, prefix the file name with an @\n"
+" (HTTP SMTP IMAP) For HTTP protocol family, this lets curl emu-\n"
+" late a filled-in form in which a user has pressed the submit\n"
, stdout);
fputs(
-" sign. To just get the content part from a file, prefix the file\n"
-" name with the symbol <. The difference between @ and < is then\n"
-" that @ makes a file get attached in the post as a file upload,\n"
-" while the < makes a text field and just get the contents for\n"
-" that text field from a file.\n"
+" button. This causes curl to POST data using the Content-Type\n"
+" multipart/form-data according to RFC 2388.\n"
+"\n"
+" For SMTP and IMAP protocols, this is the mean to compose a mul-\n"
+" tipart mail message to transmit.\n"
"\n"
-" Example: to send an image to a server, where 'profile' is the\n"
+" This enables uploading of binary files etc. To force the 'con-\n"
+" tent' part to be a file, prefix the file name with an @ sign. To\n"
, stdout);
fputs(
-" name of the form-field to which portrait.jpg will be the input:\n"
+" just get the content part from a file, prefix the file name with\n"
+" the symbol <. The difference between @ and < is then that @\n"
+" makes a file get attached in the post as a file upload, while\n"
+" the < makes a text field and just get the contents for that text\n"
+" field from a file.\n"
+"\n"
+" Example: to send an image to an HTTP server, where 'profile' is\n"
+, stdout);
+ fputs(
+" the name of the form-field to which portrait.jpg will be the\n"
+" input:\n"
"\n"
" curl -F profile=@portrait.jpg https://example.com/upload.cgi\n"
"\n"
" To read content from stdin instead of a file, use - as the file-\n"
-" name. This goes for both @ and < constructs. Unfortunately it\n"
-" does not support reading the file from a named pipe or similar,\n"
-" as it needs the full size before the transfer starts.\n"
-"\n"
+" name. This goes for both @ and < constructs. If stdin is not\n"
+" attached to a regular file, it is buffered first to determine\n"
+" its size and allow a possible resend. Defining a part's data\n"
, stdout);
fputs(
+" from a named non-regular file (such as a named pipe or similar)\n"
+" is unfortunately not subject to buffering and will be effec-\n"
+" tively read at transmission time; since the full size is unknown\n"
+" before the transfer starts, data is sent as chunks by HTTP and\n"
+" rejected by IMAP.\n"
+"\n"
" You can also tell curl what Content-Type to use by using\n"
" 'type=', in a manner similar to:\n"
"\n"
+, stdout);
+ fputs(
" curl -F \"web=@index.html;type=text/html\" example.com\n"
"\n"
" or\n"
@@ -972,11 +992,11 @@ void hugehelp(void)
"\n"
" curl -F \"file=@localfile;filename=nameinpost\" example.com\n"
"\n"
-, stdout);
- fputs(
" If filename/path contains ',' or ';', it must be quoted by dou-\n"
" ble-quotes like:\n"
"\n"
+, stdout);
+ fputs(
" curl -F \"file=@\\\"localfile\\\";filename=\\\"nameinpost\\\"\" exam-\n"
" ple.com\n"
"\n"
@@ -988,6 +1008,78 @@ void hugehelp(void)
" double-quote or backslash within the filename must be escaped by\n"
" backslash.\n"
"\n"
+" Quoting must also be applied to non-file data if it contains\n"
+, stdout);
+ fputs(
+" semicolons, leading/trailing spaces or leading double quotes:\n"
+"\n"
+" curl -F 'colors=\"red; green; blue\";type=text/x-myapp' exam-\n"
+" ple.com\n"
+"\n"
+" You can add custom headers to the field by setting headers=,\n"
+" like\n"
+"\n"
+" curl -F \"submit=OK;headers=\\\"X-submit-type: OK\\\"\" example.com\n"
+"\n"
+" or\n"
+"\n"
+" curl -F \"submit=OK;headers=@headerfile\" example.com\n"
+"\n"
+, stdout);
+ fputs(
+" The headers= keyword may appear more that once and above notes\n"
+" about quoting apply. When headers are read from a file, Empty\n"
+" lines and lines starting with '#' are comments and ignored; each\n"
+" header can be folded by splitting between two words and starting\n"
+" the continuation line with a space; embedded carriage-returns\n"
+" and trailing spaces are stripped. Here is an example of a\n"
+, stdout);
+ fputs(
+" header file contents:\n"
+"\n"
+" # This file contain two headers.\n"
+" X-header-1: this is a header\n"
+"\n"
+" # The following header is folded.\n"
+" X-header-2: this is\n"
+" another header\n"
+"\n"
+" To support sending multipart mail messages, the syntax is\n"
+" extended as follows:\n"
+" - name can be omitted: the equal sign is the first character of\n"
+" the argument,\n"
+, stdout);
+ fputs(
+" - if data starts with '(', this signals to start a new multi-\n"
+" part: it can be followed by a content type specification.\n"
+" - a multipart can be terminated with a '=)' argument.\n"
+"\n"
+" Example: the following command sends an SMTP mime e-mail con-\n"
+" sisting in an inline part in two alternative formats: plain text\n"
+" and HTML. It attaches a text file:\n"
+"\n"
+" curl -F '=(;type=multipart/alternative' \\\n"
+, stdout);
+ fputs(
+" -F '=plain text message' \\\n"
+" -F '= <body>HTML message</body>;type=text/html' \\\n"
+" -F '=)' -F '=@textfile.txt' ... smtp://example.com\n"
+"\n"
+" Data can be encoded for transfer using encoder=. Available\n"
+" encodings are binary and 8bit that do nothing else than adding\n"
+" the corresponding Content-Transfer-Encoding header, 7bit that\n"
+, stdout);
+ fputs(
+" only rejects 8-bit characters with a transfer error, quoted-\n"
+" printable and base64 that encodes data according to the corre-\n"
+" sponding schemes, limiting lines length to 76 characters.\n"
+"\n"
+" Example: send multipart mail with a quoted-printable text mes-\n"
+" sage and a base64 attached file:\n"
+"\n"
+" curl -F '=text message;encoder=quoted-printable' \\\n"
+" -F '=@localfile;encoder=base64' ... smtp://example.com\n"
+"\n"
, stdout);
fputs(
" See further examples and details in the MANUAL.\n"
@@ -1339,278 +1431,282 @@ void hugehelp(void)
" curl --interface eth0:1 https://www.example.com/\n"
"\n"
" If this option is used several times, the last one will be used.\n"
+" On Linux it can be used to specify a VRF, but the binary needs\n"
+" to either have CAP_NET_RAW or to be ran as root. More informa-\n"
+" tion about Linux VRF: https://www.kernel.org/doc/Documenta-\n"
+" tion/networking/vrf.txt\n"
"\n"
" See also --dns-interface.\n"
"\n"
" -4, --ipv4\n"
-" This option tells curl to resolve names to IPv4 addresses only,\n"
+, stdout);
+ fputs(
+" This option tells curl to resolve names to IPv4 addresses only,\n"
" and not for example try IPv6.\n"
"\n"
-" See also --http1.1 and --http2. This option overrides -6,\n"
+" See also --http1.1 and --http2. This option overrides -6,\n"
" --ipv6.\n"
"\n"
" -6, --ipv6\n"
-, stdout);
- fputs(
-" This option tells curl to resolve names to IPv6 addresses only,\n"
+" This option tells curl to resolve names to IPv6 addresses only,\n"
" and not for example try IPv4.\n"
"\n"
-" See also --http1.1 and --http2. This option overrides -6,\n"
+" See also --http1.1 and --http2. This option overrides -6,\n"
" --ipv6.\n"
"\n"
-" -j, --junk-session-cookies\n"
-" (HTTP) When curl is told to read cookies from a given file, this\n"
-" option will make it discard all \"session cookies\". This will\n"
-" basically have the same effect as if a new session is started.\n"
, stdout);
fputs(
-" Typical browsers always discard session cookies when they're\n"
+" -j, --junk-session-cookies\n"
+" (HTTP) When curl is told to read cookies from a given file, this\n"
+" option will make it discard all \"session cookies\". This will\n"
+" basically have the same effect as if a new session is started.\n"
+" Typical browsers always discard session cookies when they're\n"
" closed down.\n"
"\n"
" See also -b, --cookie and -c, --cookie-jar.\n"
"\n"
" --keepalive-time <seconds>\n"
-" This option sets the time a connection needs to remain idle\n"
-" before sending keepalive probes and the time between individual\n"
-" keepalive probes. It is currently effective on operating systems\n"
, stdout);
fputs(
+" This option sets the time a connection needs to remain idle\n"
+" before sending keepalive probes and the time between individual\n"
+" keepalive probes. It is currently effective on operating systems\n"
" offering the TCP_KEEPIDLE and TCP_KEEPINTVL socket options\n"
-" (meaning Linux, recent AIX, HP-UX and more). This option has no\n"
+" (meaning Linux, recent AIX, HP-UX and more). This option has no\n"
" effect if --no-keepalive is used.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
" If unspecified, the option defaults to 60 seconds.\n"
"\n"
" Added in 7.18.0.\n"
"\n"
" --key-type <type>\n"
-" (TLS) Private key file type. Specify which type your --key pro-\n"
-, stdout);
- fputs(
-" vided private key is. DER, PEM, and ENG are supported. If not\n"
+" (TLS) Private key file type. Specify which type your --key pro-\n"
+" vided private key is. DER, PEM, and ENG are supported. If not\n"
" specified, PEM is assumed.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
+, stdout);
+ fputs(
" --key <key>\n"
" (TLS SSH) Private key file name. Allows you to provide your pri-\n"
-" vate key in this separate file. For SSH, if not specified, curl\n"
+" vate key in this separate file. For SSH, if not specified, curl\n"
" tries the following candidates in order:\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --krb <level>\n"
-" (FTP) Enable Kerberos authentication and use. The level must be\n"
+" (FTP) Enable Kerberos authentication and use. The level must be\n"
" entered and should be one of 'clear', 'safe', 'confidential', or\n"
-" 'private'. Should you use a level that is not one of these,\n"
+, stdout);
+ fputs(
+" 'private'. Should you use a level that is not one of these,\n"
" 'private' will instead be used.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
-, stdout);
- fputs(
-" --krb requires that the underlying libcurl was built to support\n"
+" --krb requires that the underlying libcurl was built to support\n"
" Kerberos.\n"
"\n"
" --libcurl <file>\n"
-" Append this option to any ordinary curl command line, and you\n"
-" will get a libcurl-using C source code written to the file that\n"
+" Append this option to any ordinary curl command line, and you\n"
+" will get a libcurl-using C source code written to the file that\n"
+, stdout);
+ fputs(
" does the equivalent of what your command-line operation does!\n"
"\n"
-" If this option is used several times, the last given file name\n"
+" If this option is used several times, the last given file name\n"
" will be used.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.16.1.\n"
"\n"
" --limit-rate <speed>\n"
-" Specify the maximum transfer rate you want curl to use - for\n"
+" Specify the maximum transfer rate you want curl to use - for\n"
" both downloads and uploads. This feature is useful if you have a\n"
" limited pipe and you'd like your transfer not to use your entire\n"
-" bandwidth. To make it slower than it otherwise would be.\n"
-"\n"
-" The given speed is measured in bytes/second, unless a suffix is\n"
, stdout);
fputs(
-" appended. Appending 'k' or 'K' will count the number as kilo-\n"
-" bytes, 'm' or M' makes it megabytes, while 'g' or 'G' makes it\n"
+" bandwidth. To make it slower than it otherwise would be.\n"
+"\n"
+" The given speed is measured in bytes/second, unless a suffix is\n"
+" appended. Appending 'k' or 'K' will count the number as kilo-\n"
+" bytes, 'm' or M' makes it megabytes, while 'g' or 'G' makes it\n"
" gigabytes. Examples: 200K, 3m and 1G.\n"
"\n"
-" If you also use the -Y, --speed-limit option, that option will\n"
+" If you also use the -Y, --speed-limit option, that option will\n"
+, stdout);
+ fputs(
" take precedence and might cripple the rate-limiting slightly, to\n"
" help keeping the speed-limit logic working.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -l, --list-only\n"
-" (FTP POP3) (FTP) When listing an FTP directory, this switch\n"
-" forces a name-only view. This is especially useful if the user\n"
-" wants to machine-parse the contents of an FTP directory since\n"
-" the normal directory view doesn't use a standard look or format.\n"
-" When used like this, the option causes a NLST command to be sent\n"
+" (FTP POP3) (FTP) When listing an FTP directory, this switch\n"
+" forces a name-only view. This is especially useful if the user\n"
+" wants to machine-parse the contents of an FTP directory since\n"
, stdout);
fputs(
+" the normal directory view doesn't use a standard look or format.\n"
+" When used like this, the option causes a NLST command to be sent\n"
" to the server instead of LIST.\n"
"\n"
-" Note: Some FTP servers list only files in their response to\n"
+" Note: Some FTP servers list only files in their response to\n"
" NLST; they do not include sub-directories and symbolic links.\n"
"\n"
-" (POP3) When retrieving a specific email from POP3, this switch\n"
-" forces a LIST command to be performed instead of RETR. This is\n"
-" particularly useful if the user wants to see if a specific mes-\n"
+" (POP3) When retrieving a specific email from POP3, this switch\n"
, stdout);
fputs(
+" forces a LIST command to be performed instead of RETR. This is\n"
+" particularly useful if the user wants to see if a specific mes-\n"
" sage id exists on the server and what size it is.\n"
"\n"
-" Note: When combined with -X, --request, this option can be used\n"
+" Note: When combined with -X, --request, this option can be used\n"
" to send an UIDL command instead, so the user may use the email's\n"
-" unique identifier rather than it's message id to make the\n"
+" unique identifier rather than it's message id to make the\n"
" request.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.21.5.\n"
"\n"
" --local-port <num/range>\n"
-" Set a preferred single number or range (FROM-TO) of local port\n"
-, stdout);
- fputs(
+" Set a preferred single number or range (FROM-TO) of local port\n"
" numbers to use for the connection(s). Note that port numbers by\n"
-" nature are a scarce resource that will be busy at times so set-\n"
-" ting this range to something too narrow might cause unnecessary\n"
+" nature are a scarce resource that will be busy at times so set-\n"
+" ting this range to something too narrow might cause unnecessary\n"
" connection setup failures.\n"
"\n"
" Added in 7.15.2.\n"
"\n"
" --location-trusted\n"
-" (HTTP) Like -L, --location, but will allow sending the name +\n"
-" password to all hosts that the site may redirect to. This may or\n"
, stdout);
fputs(
+" (HTTP) Like -L, --location, but will allow sending the name +\n"
+" password to all hosts that the site may redirect to. This may or\n"
" may not introduce a security breach if the site redirects you to\n"
-" a site to which you'll send your authentication info (which is\n"
+" a site to which you'll send your authentication info (which is\n"
" plaintext in the case of HTTP Basic authentication).\n"
"\n"
" See also -u, --user.\n"
"\n"
" -L, --location\n"
-" (HTTP) If the server reports that the requested page has moved\n"
-" to a different location (indicated with a Location: header and a\n"
, stdout);
fputs(
-" 3XX response code), this option will make curl redo the request\n"
-" on the new place. If used together with -i, --include or -I,\n"
-" --head, headers from all requested pages will be shown. When\n"
-" authentication is used, curl only sends its credentials to the\n"
-" initial host. If a redirect takes curl to a different host, it\n"
-" won't be able to intercept the user+password. See also --loca-\n"
+" (HTTP) If the server reports that the requested page has moved\n"
+" to a different location (indicated with a Location: header and a\n"
+" 3XX response code), this option will make curl redo the request\n"
+" on the new place. If used together with -i, --include or -I,\n"
+" --head, headers from all requested pages will be shown. When\n"
+" authentication is used, curl only sends its credentials to the\n"
, stdout);
fputs(
-" tion-trusted on how to change this. You can limit the amount of\n"
+" initial host. If a redirect takes curl to a different host, it\n"
+" won't be able to intercept the user+password. See also --loca-\n"
+" tion-trusted on how to change this. You can limit the amount of\n"
" redirects to follow by using the --max-redirs option.\n"
"\n"
-" When curl follows a redirect and the request is not a plain GET\n"
+" When curl follows a redirect and the request is not a plain GET\n"
" (for example POST or PUT), it will do the following request with\n"
-" a GET if the HTTP response was 301, 302, or 303. If the response\n"
-" code was any other 3xx code, curl will re-send the following\n"
, stdout);
fputs(
+" a GET if the HTTP response was 301, 302, or 303. If the response\n"
+" code was any other 3xx code, curl will re-send the following\n"
" request using the same unmodified method.\n"
"\n"
-" You can tell curl to not change the non-GET request method to\n"
-" GET after a 30x response by using the dedicated options for\n"
+" You can tell curl to not change the non-GET request method to\n"
+" GET after a 30x response by using the dedicated options for\n"
" that: --post301, --post302 and --post303.\n"
"\n"
" --login-options <options>\n"
-" (IMAP POP3 SMTP) Specify the login options to use during server\n"
-" authentication.\n"
-"\n"
-" You can use the login options to specify protocol specific\n"
, stdout);
fputs(
-" options that may be used during authentication. At present only\n"
-" IMAP, POP3 and SMTP support login options. For more information\n"
-" about the login options please see RFC 2384, RFC 5092 and IETF\n"
+" (IMAP POP3 SMTP) Specify the login options to use during server\n"
+" authentication.\n"
+"\n"
+" You can use the login options to specify protocol specific\n"
+" options that may be used during authentication. At present only\n"
+" IMAP, POP3 and SMTP support login options. For more information\n"
+" about the login options please see RFC 2384, RFC 5092 and IETF\n"
" draft draft-earhart-url-smtp-00.txt\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.34.0.\n"
"\n"
" --mail-auth <address>\n"
-, stdout);
- fputs(
-" (SMTP) Specify a single address. This will be used to specify\n"
-" the authentication address (identity) of a submitted message\n"
+" (SMTP) Specify a single address. This will be used to specify\n"
+" the authentication address (identity) of a submitted message\n"
" that is being relayed to another server.\n"
"\n"
" See also --mail-rcpt and --mail-from. Added in 7.25.0.\n"
"\n"
" --mail-from <address>\n"
-" (SMTP) Specify a single address that the given mail should get\n"
+, stdout);
+ fputs(
+" (SMTP) Specify a single address that the given mail should get\n"
" sent from.\n"
"\n"
" See also --mail-rcpt and --mail-auth. Added in 7.20.0.\n"
"\n"
-, stdout);
- fputs(
" --mail-rcpt <address>\n"
" (SMTP) Specify a single address, user name or mailing list name.\n"
" Repeat this option several times to send to multiple recipients.\n"
-" When performing a mail transfer, the recipient should specify a\n"
+" When performing a mail transfer, the recipient should specify a\n"
" valid email address to send the mail to.\n"
"\n"
-" When performing an address verification (VRFY command), the\n"
-" recipient should be specified as the user name or user name and\n"
, stdout);
fputs(
+" When performing an address verification (VRFY command), the\n"
+" recipient should be specified as the user name or user name and\n"
" domain (as per Section 3.5 of RFC5321). (Added in 7.34.0)\n"
"\n"
" When performing a mailing list expand (EXPN command), the recip-\n"
-" ient should be specified using the mailing list name, such as\n"
+" ient should be specified using the mailing list name, such as\n"
" \"Friends\" or \"London-Office\". (Added in 7.34.0)\n"
"\n"
" Added in 7.20.0.\n"
"\n"
+, stdout);
+ fputs(
" -M, --manual\n"
" Manual. Display the huge help text.\n"
"\n"
" --max-filesize <bytes>\n"
-, stdout);
- fputs(
-" Specify the maximum size (in bytes) of a file to download. If\n"
-" the file requested is larger than this value, the transfer will\n"
+" Specify the maximum size (in bytes) of a file to download. If\n"
+" the file requested is larger than this value, the transfer will\n"
" not start and curl will return with exit code 63.\n"
"\n"
-" NOTE: The file size is not always known prior to download, and\n"
+" NOTE: The file size is not always known prior to download, and\n"
" for such files this option has no effect even if the file trans-\n"
-" fer ends up being larger than this given limit. This concerns\n"
, stdout);
fputs(
+" fer ends up being larger than this given limit. This concerns\n"
" both FTP and HTTP transfers.\n"
"\n"
" See also --limit-rate.\n"
"\n"
" --max-redirs <num>\n"
-" (HTTP) Set maximum number of redirection-followings allowed.\n"
-" When -L, --location is used, is used to prevent curl from fol-\n"
-" lowing redirections \"in absurdum\". By default, the limit is set\n"
-" to 50 redirections. Set this option to -1 to make it unlimited.\n"
-"\n"
+" (HTTP) Set maximum number of redirection-followings allowed.\n"
+" When -L, --location is used, is used to prevent curl from fol-\n"
+" lowing redirections \"in absurdum\". By default, the limit is set\n"
, stdout);
fputs(
+" to 50 redirections. Set this option to -1 to make it unlimited.\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" -m, --max-time <time>\n"
-" Maximum time in seconds that you allow the whole operation to\n"
-" take. This is useful for preventing your batch jobs from hang-\n"
-" ing for hours due to slow networks or links going down. Since\n"
-" 7.32.0, this option accepts decimal values, but the actual time-\n"
+" Maximum time in seconds that you allow the whole operation to\n"
+" take. This is useful for preventing your batch jobs from hang-\n"
+" ing for hours due to slow networks or links going down. Since\n"
, stdout);
fputs(
+" 7.32.0, this option accepts decimal values, but the actual time-\n"
" out will decrease in accuracy as the specified timeout increases\n"
" in decimal precision.\n"
"\n"
@@ -1619,116 +1715,116 @@ void hugehelp(void)
" See also --connect-timeout.\n"
"\n"
" --metalink\n"
-" This option can tell curl to parse and process a given URI as\n"
-" Metalink file (both version 3 and 4 (RFC 5854) are supported)\n"
-" and make use of the mirrors listed within for failover if there\n"
+" This option can tell curl to parse and process a given URI as\n"
+" Metalink file (both version 3 and 4 (RFC 5854) are supported)\n"
, stdout);
fputs(
-" are errors (such as the file or server not being available). It\n"
-" will also verify the hash of the file after the download com-\n"
-" pletes. The Metalink file itself is downloaded and processed in\n"
+" and make use of the mirrors listed within for failover if there\n"
+" are errors (such as the file or server not being available). It\n"
+" will also verify the hash of the file after the download com-\n"
+" pletes. The Metalink file itself is downloaded and processed in\n"
" memory and not stored in the local file system.\n"
"\n"
" Example to use a remote Metalink file:\n"
"\n"
-" curl --metalink http://www.example.com/example.metalink\n"
-"\n"
, stdout);
fputs(
+" curl --metalink http://www.example.com/example.metalink\n"
+"\n"
" To use a Metalink file in the local file system, use FILE proto-\n"
" col (file://):\n"
"\n"
" curl --metalink file://example.metalink\n"
"\n"
-" Please note that if FILE protocol is disabled, there is no way\n"
-" to use a local Metalink file at the time of this writing. Also\n"
-" note that if --metalink and -i, --include are used together,\n"
-" --include will be ignored. This is because including headers in\n"
+" Please note that if FILE protocol is disabled, there is no way\n"
+" to use a local Metalink file at the time of this writing. Also\n"
+" note that if --metalink and -i, --include are used together,\n"
, stdout);
fputs(
-" the response will break Metalink parser and if the headers are\n"
+" --include will be ignored. This is because including headers in\n"
+" the response will break Metalink parser and if the headers are\n"
" included in the file described in Metalink file, hash check will\n"
" fail.\n"
"\n"
-" --metalink requires that the underlying libcurl was built to\n"
+" --metalink requires that the underlying libcurl was built to\n"
" support metalink. Added in 7.27.0.\n"
"\n"
" --negotiate\n"
" (HTTP) Enables Negotiate (SPNEGO) authentication.\n"
"\n"
-" This option requires a library built with GSS-API or SSPI sup-\n"
, stdout);
fputs(
-" port. Use -V, --version to see if your curl supports GSS-\n"
+" This option requires a library built with GSS-API or SSPI sup-\n"
+" port. Use -V, --version to see if your curl supports GSS-\n"
" API/SSPI or SPNEGO.\n"
"\n"
-" When using this option, you must also provide a fake -u, --user\n"
-" option to activate the authentication code properly. Sending a\n"
-" '-u :' is enough as the user name and password from the -u,\n"
+" When using this option, you must also provide a fake -u, --user\n"
+" option to activate the authentication code properly. Sending a\n"
+" '-u :' is enough as the user name and password from the -u,\n"
" --user option aren't actually used.\n"
"\n"
-" If this option is used several times, only the first one is\n"
, stdout);
fputs(
+" If this option is used several times, only the first one is\n"
" used.\n"
"\n"
" See also --basic and --ntlm and --anyauth and --proxy-negotiate.\n"
"\n"
" --netrc-file <filename>\n"
-" This option is similar to -n, --netrc, except that you provide\n"
-" the path (absolute or relative) to the netrc file that Curl\n"
+" This option is similar to -n, --netrc, except that you provide\n"
+" the path (absolute or relative) to the netrc file that Curl\n"
" should use. You can only specify one netrc file per invocation.\n"
-" If several --netrc-file options are provided, the last one will\n"
-" be used.\n"
-"\n"
, stdout);
fputs(
+" If several --netrc-file options are provided, the last one will\n"
+" be used.\n"
+"\n"
" It will abide by --netrc-optional if specified.\n"
"\n"
" This option overrides -n, --netrc. Added in 7.21.5.\n"
"\n"
" --netrc-optional\n"
-" Very similar to -n, --netrc, but this option makes the .netrc\n"
+" Very similar to -n, --netrc, but this option makes the .netrc\n"
" usage optional and not mandatory as the -n, --netrc option does.\n"
"\n"
" See also --netrc-file. This option overrides -n, --netrc.\n"
"\n"
-" -n, --netrc\n"
-" Makes curl scan the .netrc (_netrc on Windows) file in the\n"
, stdout);
fputs(
+" -n, --netrc\n"
+" Makes curl scan the .netrc (_netrc on Windows) file in the\n"
" user's home directory for login name and password. This is typi-\n"
-" cally used for FTP on Unix. If used with HTTP, curl will enable\n"
+" cally used for FTP on Unix. If used with HTTP, curl will enable\n"
" user authentication. See netrc(5) ftp(1) for details on the file\n"
-" format. Curl will not complain if that file doesn't have the\n"
+" format. Curl will not complain if that file doesn't have the\n"
" right permissions (it should not be either world- or group-read-\n"
-" able). The environment variable \"HOME\" is used to find the home\n"
-" directory.\n"
-"\n"
, stdout);
fputs(
-" A quick and very simple example of how to setup a .netrc to\n"
-" allow curl to FTP to the machine host.domain.com with user name\n"
+" able). The environment variable \"HOME\" is used to find the home\n"
+" directory.\n"
+"\n"
+" A quick and very simple example of how to setup a .netrc to\n"
+" allow curl to FTP to the machine host.domain.com with user name\n"
" 'myself' and password 'secret' should look similar to:\n"
"\n"
" machine host.domain.com login myself password secret\n"
"\n"
" -:, --next\n"
" Tells curl to use a separate operation for the following URL and\n"
-" associated options. This allows you to send several URL\n"
, stdout);
fputs(
-" requests, each with their own specific options, for example,\n"
+" associated options. This allows you to send several URL\n"
+" requests, each with their own specific options, for example,\n"
" such as different user names or custom requests for each.\n"
"\n"
-" -:, --next will reset all local options and only global ones\n"
-" will have their values survive over to the operation following\n"
-" the -:, --next instruction. Global options include -v, --ver-\n"
-" bose, --trace, --trace-ascii and --fail-early.\n"
-"\n"
+" -:, --next will reset all local options and only global ones\n"
+" will have their values survive over to the operation following\n"
+" the -:, --next instruction. Global options include -v, --ver-\n"
, stdout);
fputs(
-" For example, you can do both a GET and a POST in a single com-\n"
+" bose, --trace, --trace-ascii and --fail-early.\n"
+"\n"
+" For example, you can do both a GET and a POST in a single com-\n"
" mand line:\n"
"\n"
" curl www1.example.com --next -d postthis www2.example.com\n"
@@ -1736,189 +1832,189 @@ void hugehelp(void)
" Added in 7.36.0.\n"
"\n"
" --no-alpn\n"
-" (HTTPS) Disable the ALPN TLS extension. ALPN is enabled by\n"
-" default if libcurl was built with an SSL library that supports\n"
-" ALPN. ALPN is used by a libcurl that supports HTTP/2 to negoti-\n"
+" (HTTPS) Disable the ALPN TLS extension. ALPN is enabled by\n"
+" default if libcurl was built with an SSL library that supports\n"
, stdout);
fputs(
+" ALPN. ALPN is used by a libcurl that supports HTTP/2 to negoti-\n"
" ate HTTP/2 support with the server during https sessions.\n"
"\n"
-" See also --no-npn and --http2. --no-alpn requires that the\n"
+" See also --no-npn and --http2. --no-alpn requires that the\n"
" underlying libcurl was built to support TLS. Added in 7.36.0.\n"
"\n"
" -N, --no-buffer\n"
" Disables the buffering of the output stream. In normal work sit-\n"
-" uations, curl will use a standard buffered output stream that\n"
-" will have the effect that it will output the data in chunks, not\n"
+" uations, curl will use a standard buffered output stream that\n"
, stdout);
fputs(
-" necessarily exactly when the data arrives. Using this option\n"
+" will have the effect that it will output the data in chunks, not\n"
+" necessarily exactly when the data arrives. Using this option\n"
" will disable that buffering.\n"
"\n"
-" Note that this is the negated option name documented. You can\n"
+" Note that this is the negated option name documented. You can\n"
" thus use --buffer to enforce the buffering.\n"
"\n"
" --no-keepalive\n"
-" Disables the use of keepalive messages on the TCP connection.\n"
+" Disables the use of keepalive messages on the TCP connection.\n"
" curl otherwise enables them by default.\n"
"\n"
-" Note that this is the negated option name documented. You can\n"
, stdout);
fputs(
+" Note that this is the negated option name documented. You can\n"
" thus use --keepalive to enforce keepalive.\n"
"\n"
" --no-npn\n"
" (HTTPS) Disable the NPN TLS extension. NPN is enabled by default\n"
-" if libcurl was built with an SSL library that supports NPN. NPN\n"
-" is used by a libcurl that supports HTTP/2 to negotiate HTTP/2\n"
+" if libcurl was built with an SSL library that supports NPN. NPN\n"
+" is used by a libcurl that supports HTTP/2 to negotiate HTTP/2\n"
" support with the server during https sessions.\n"
"\n"
-" See also --no-alpn and --http2. --no-npn requires that the\n"
, stdout);
fputs(
+" See also --no-alpn and --http2. --no-npn requires that the\n"
" underlying libcurl was built to support TLS. Added in 7.36.0.\n"
"\n"
" --no-sessionid\n"
-" (TLS) Disable curl's use of SSL session-ID caching. By default\n"
-" all transfers are done using the cache. Note that while nothing\n"
-" should ever get hurt by attempting to reuse SSL session-IDs,\n"
+" (TLS) Disable curl's use of SSL session-ID caching. By default\n"
+" all transfers are done using the cache. Note that while nothing\n"
+" should ever get hurt by attempting to reuse SSL session-IDs,\n"
" there seem to be broken SSL implementations in the wild that may\n"
-" require you to disable this in order for you to succeed.\n"
-"\n"
, stdout);
fputs(
-" Note that this is the negated option name documented. You can\n"
+" require you to disable this in order for you to succeed.\n"
+"\n"
+" Note that this is the negated option name documented. You can\n"
" thus use --sessionid to enforce session-ID caching.\n"
"\n"
" Added in 7.16.0.\n"
"\n"
" --noproxy <no-proxy-list>\n"
-" Comma-separated list of hosts which do not use a proxy, if one\n"
-" is specified. The only wildcard is a single * character, which\n"
-" matches all hosts, and effectively disables the proxy. Each name\n"
+" Comma-separated list of hosts which do not use a proxy, if one\n"
+" is specified. The only wildcard is a single * character, which\n"
, stdout);
fputs(
-" in this list is matched as either a domain which contains the\n"
-" hostname, or the hostname itself. For example, local.com would\n"
-" match local.com, local.com:80, and www.local.com, but not\n"
+" matches all hosts, and effectively disables the proxy. Each name\n"
+" in this list is matched as either a domain which contains the\n"
+" hostname, or the hostname itself. For example, local.com would\n"
+" match local.com, local.com:80, and www.local.com, but not\n"
" www.notlocal.com.\n"
"\n"
-" Since 7.53.0, This option overrides the environment variables\n"
-" that disable the proxy. If there's an environment variable dis-\n"
+" Since 7.53.0, This option overrides the environment variables\n"
, stdout);
fputs(
+" that disable the proxy. If there's an environment variable dis-\n"
" abling a proxy, you can set noproxy list to \"\" to override it.\n"
"\n"
" Added in 7.19.4.\n"
"\n"
" --ntlm-wb\n"
" (HTTP) Enables NTLM much in the style --ntlm does, but hand over\n"
-" the authentication to the separate binary ntlmauth application\n"
+" the authentication to the separate binary ntlmauth application\n"
" that is executed when needed.\n"
"\n"
" See also --ntlm and --proxy-ntlm.\n"
"\n"
-" --ntlm (HTTP) Enables NTLM authentication. The NTLM authentication\n"
, stdout);
fputs(
+" --ntlm (HTTP) Enables NTLM authentication. The NTLM authentication\n"
" method was designed by Microsoft and is used by IIS web servers.\n"
-" It is a proprietary protocol, reverse-engineered by clever peo-\n"
+" It is a proprietary protocol, reverse-engineered by clever peo-\n"
" ple and implemented in curl based on their efforts. This kind of\n"
-" behavior should not be endorsed, you should encourage everyone\n"
-" who uses NTLM to switch to a public and documented authentica-\n"
-" tion method instead, such as Digest.\n"
-"\n"
+" behavior should not be endorsed, you should encourage everyone\n"
+" who uses NTLM to switch to a public and documented authentica-\n"
, stdout);
fputs(
-" If you want to enable NTLM for your proxy authentication, then\n"
+" tion method instead, such as Digest.\n"
+"\n"
+" If you want to enable NTLM for your proxy authentication, then\n"
" use --proxy-ntlm.\n"
"\n"
-" If this option is used several times, only the first one is\n"
+" If this option is used several times, only the first one is\n"
" used.\n"
"\n"
-" See also --proxy-ntlm. --ntlm requires that the underlying\n"
-" libcurl was built to support TLS. This option overrides --basic\n"
+" See also --proxy-ntlm. --ntlm requires that the underlying\n"
+" libcurl was built to support TLS. This option overrides --basic\n"
" and --negotiated and --digest and --anyauth.\n"
"\n"
-" --oauth2-bearer <token>\n"
, stdout);
fputs(
-" (IMAP POP3 SMTP) Specify the Bearer Token for OAUTH 2.0 server\n"
+" --oauth2-bearer <token>\n"
+" (IMAP POP3 SMTP) Specify the Bearer Token for OAUTH 2.0 server\n"
" authentication. The Bearer Token is used in conjunction with the\n"
-" user name which can be specified as part of the --url or -u,\n"
+" user name which can be specified as part of the --url or -u,\n"
" --user options.\n"
"\n"
-" The Bearer Token and user name are formatted according to RFC\n"
+" The Bearer Token and user name are formatted according to RFC\n"
" 6750.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
-" -o, --output <file>\n"
, stdout);
fputs(
+" -o, --output <file>\n"
" Write output to <file> instead of stdout. If you are using {} or\n"
-" [] to fetch multiple documents, you can use '#' followed by a\n"
-" number in the <file> specifier. That variable will be replaced\n"
+" [] to fetch multiple documents, you can use '#' followed by a\n"
+" number in the <file> specifier. That variable will be replaced\n"
" with the current string for the URL being fetched. Like in:\n"
"\n"
" curl http://{one,two}.example.com -o \"file_#1.txt\"\n"
"\n"
" or use several variables like:\n"
"\n"
-" curl http://{site,host}.host[1-5].com -o \"#1_#2\"\n"
-"\n"
, stdout);
fputs(
-" You may use this option as many times as the number of URLs you\n"
-" have. For example, if you specify two URLs on the same command\n"
+" curl http://{site,host}.host[1-5].com -o \"#1_#2\"\n"
+"\n"
+" You may use this option as many times as the number of URLs you\n"
+" have. For example, if you specify two URLs on the same command\n"
" line, you can use it like this:\n"
"\n"
" curl -o aa example.com -o bb example.net\n"
"\n"
-" and the order of the -o options and the URLs doesn't matter,\n"
-" just that the first -o is for the first URL and so on, so the\n"
-" above command line can also be written as\n"
-"\n"
+" and the order of the -o options and the URLs doesn't matter,\n"
+" just that the first -o is for the first URL and so on, so the\n"
, stdout);
fputs(
+" above command line can also be written as\n"
+"\n"
" curl example.com example.net -o aa -o bb\n"
"\n"
-" See also the --create-dirs option to create the local directo-\n"
-" ries dynamically. Specifying the output as '-' (a single dash)\n"
+" See also the --create-dirs option to create the local directo-\n"
+" ries dynamically. Specifying the output as '-' (a single dash)\n"
" will force the output to be done to stdout.\n"
"\n"
-" See also -O, --remote-name and --remote-name-all and -J,\n"
+" See also -O, --remote-name and --remote-name-all and -J,\n"
" --remote-header-name.\n"
"\n"
" --pass <phrase>\n"
-" (SSH TLS) Passphrase for the private key\n"
-"\n"
, stdout);
fputs(
+" (SSH TLS) Passphrase for the private key\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --path-as-is\n"
-" Tell curl to not handle sequences of /../ or /./ in the given\n"
-" URL path. Normally curl will squash or merge them according to\n"
+" Tell curl to not handle sequences of /../ or /./ in the given\n"
+" URL path. Normally curl will squash or merge them according to\n"
" standards but with this option set you tell it not to do that.\n"
"\n"
" Added in 7.42.0.\n"
"\n"
" --pinnedpubkey <hashes>\n"
-" (TLS) Tells curl to use the specified public key file (or\n"
, stdout);
fputs(
-" hashes) to verify the peer. This can be a path to a file which\n"
+" (TLS) Tells curl to use the specified public key file (or\n"
+" hashes) to verify the peer. This can be a path to a file which\n"
" contains a single public key in PEM or DER format, or any number\n"
" of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
" rated by ';'\n"
"\n"
-" When negotiating a TLS or SSL connection, the server sends a\n"
-" certificate indicating its identity. A public key is extracted\n"
+" When negotiating a TLS or SSL connection, the server sends a\n"
, stdout);
fputs(
-" from this certificate and if it does not exactly match the pub-\n"
-" lic key provided to this option, curl will abort the connection\n"
+" certificate indicating its identity. A public key is extracted\n"
+" from this certificate and if it does not exactly match the pub-\n"
+" lic key provided to this option, curl will abort the connection\n"
" before sending or receiving any data.\n"
"\n"
" PEM/DER support:\n"
@@ -1926,9 +2022,9 @@ void hugehelp(void)
" 7.43.0: NSS and wolfSSL/CyaSSL\n"
" 7.47.0: mbedtls\n"
" 7.49.0: PolarSSL sha256 support:\n"
-" 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL.\n"
, stdout);
fputs(
+" 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL.\n"
" 7.47.0: mbedtls\n"
" 7.49.0: PolarSSL Other SSL backends not supported.\n"
"\n"
@@ -1937,15 +2033,15 @@ void hugehelp(void)
" --post301\n"
" (HTTP) Tells curl to respect RFC 7231/6.4.2 and not convert POST\n"
" requests into GET requests when following a 301 redirection. The\n"
-" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
+" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
, stdout);
fputs(
-" the conversion by default to maintain consistency. However, a\n"
-" server may require a POST to remain a POST after such a redi-\n"
-" rection. This option is meaningful only when using -L, --loca-\n"
+" the conversion by default to maintain consistency. However, a\n"
+" server may require a POST to remain a POST after such a redi-\n"
+" rection. This option is meaningful only when using -L, --loca-\n"
" tion.\n"
"\n"
-" See also --post302 and --post303 and -L, --location. Added in\n"
+" See also --post302 and --post303 and -L, --location. Added in\n"
" 7.17.1.\n"
"\n"
" --post302\n"
@@ -1953,13 +2049,13 @@ void hugehelp(void)
, stdout);
fputs(
" requests into GET requests when following a 302 redirection. The\n"
-" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
-" the conversion by default to maintain consistency. However, a\n"
-" server may require a POST to remain a POST after such a redi-\n"
-" rection. This option is meaningful only when using -L, --loca-\n"
+" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
+" the conversion by default to maintain consistency. However, a\n"
+" server may require a POST to remain a POST after such a redi-\n"
+" rection. This option is meaningful only when using -L, --loca-\n"
" tion.\n"
"\n"
-" See also --post301 and --post303 and -L, --location. Added in\n"
+" See also --post301 and --post303 and -L, --location. Added in\n"
, stdout);
fputs(
" 7.19.1.\n"
@@ -1967,38 +2063,38 @@ void hugehelp(void)
" --post303\n"
" (HTTP) Tells curl to respect RFC 7231/6.4.4 and not convert POST\n"
" requests into GET requests when following a 303 redirection. The\n"
-" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
-" the conversion by default to maintain consistency. However, a\n"
-" server may require a POST to remain a POST after such a redi-\n"
+" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
+" the conversion by default to maintain consistency. However, a\n"
+" server may require a POST to remain a POST after such a redi-\n"
, stdout);
fputs(
-" rection. This option is meaningful only when using -L, --loca-\n"
+" rection. This option is meaningful only when using -L, --loca-\n"
" tion.\n"
"\n"
-" See also --post302 and --post301 and -L, --location. Added in\n"
+" See also --post302 and --post301 and -L, --location. Added in\n"
" 7.26.0.\n"
"\n"
" --preproxy [protocol://]host[:port]\n"
-" Use the specified SOCKS proxy before connecting to an HTTP or\n"
-" HTTPS -x, --proxy. In such a case curl first connects to the\n"
-" SOCKS proxy and then connects (through SOCKS) to the HTTP or\n"
+" Use the specified SOCKS proxy before connecting to an HTTP or\n"
+" HTTPS -x, --proxy. In such a case curl first connects to the\n"
+" SOCKS proxy and then connects (through SOCKS) to the HTTP or\n"
, stdout);
fputs(
" HTTPS proxy. Hence pre proxy.\n"
"\n"
" The pre proxy string should be specified with a protocol:// pre-\n"
-" fix to specify alternative proxy protocols. Use socks4://,\n"
-" socks4a://, socks5:// or socks5h:// to request the specific\n"
-" SOCKS version to be used. No protocol specified will make curl\n"
+" fix to specify alternative proxy protocols. Use socks4://,\n"
+" socks4a://, socks5:// or socks5h:// to request the specific\n"
+" SOCKS version to be used. No protocol specified will make curl\n"
" default to SOCKS4.\n"
"\n"
-" If the port number is not specified in the proxy string, it is\n"
+" If the port number is not specified in the proxy string, it is\n"
, stdout);
fputs(
" assumed to be 1080.\n"
"\n"
" User and password that might be provided in the proxy string are\n"
-" URL decoded by curl. This allows you to pass in special charac-\n"
+" URL decoded by curl. This allows you to pass in special charac-\n"
" ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -2006,14 +2102,14 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" -#, --progress-bar\n"
-" Make curl display transfer progress as a simple progress bar\n"
+" Make curl display transfer progress as a simple progress bar\n"
, stdout);
fputs(
" instead of the standard, more informational, meter.\n"
"\n"
-" This progress bar draws a single line of '#' characters across\n"
+" This progress bar draws a single line of '#' characters across\n"
" the screen and shows a percentage if the transfer size is known.\n"
-" For transfers without a known size, it will instead output one\n"
+" For transfers without a known size, it will instead output one\n"
" '#' character for every 1024 bytes transferred.\n"
"\n"
" --proto-default <protocol>\n"
@@ -2025,12 +2121,12 @@ void hugehelp(void)
"\n"
" curl --proto-default https ftp.mozilla.org\n"
"\n"
-" An unknown or unsupported protocol causes error CURLE_UNSUP-\n"
+" An unknown or unsupported protocol causes error CURLE_UNSUP-\n"
" PORTED_PROTOCOL (1).\n"
"\n"
" This option does not change the default proxy protocol (http).\n"
"\n"
-" Without this option curl would make a guess based on the host,\n"
+" Without this option curl would make a guess based on the host,\n"
" see --url for details.\n"
"\n"
" Added in 7.45.0.\n"
@@ -2038,8 +2134,8 @@ void hugehelp(void)
" --proto-redir <protocols>\n"
, stdout);
fputs(
-" Tells curl to limit what protocols it may use on redirect. Pro-\n"
-" tocols denied by --proto are not overridden by this option. See\n"
+" Tells curl to limit what protocols it may use on redirect. Pro-\n"
+" tocols denied by --proto are not overridden by this option. See\n"
" --proto for how protocols are represented.\n"
"\n"
" Example, allow only HTTP and HTTPS on redirect:\n"
@@ -2049,30 +2145,30 @@ void hugehelp(void)
" By default curl will allow all protocols on redirect except sev-\n"
, stdout);
fputs(
-" eral disabled for security reasons: Since 7.19.4 FILE and SCP\n"
-" are disabled, and since 7.40.0 SMB and SMBS are also disabled.\n"
-" Specifying all or +all enables all protocols on redirect,\n"
+" eral disabled for security reasons: Since 7.19.4 FILE and SCP\n"
+" are disabled, and since 7.40.0 SMB and SMBS are also disabled.\n"
+" Specifying all or +all enables all protocols on redirect,\n"
" including those disabled for security.\n"
"\n"
" Added in 7.20.2.\n"
"\n"
" --proto <protocols>\n"
-" Tells curl to limit what protocols it may use in the transfer.\n"
+" Tells curl to limit what protocols it may use in the transfer.\n"
, stdout);
fputs(
-" Protocols are evaluated left to right, are comma separated, and\n"
+" Protocols are evaluated left to right, are comma separated, and\n"
" are each a protocol name or\n"
"\n"
" + Permit this protocol in addition to protocols already permit-\n"
" ted (this is the default if no modifier is used).\n"
"\n"
-" - Deny this protocol, removing it from the list of protocols\n"
+" - Deny this protocol, removing it from the list of protocols\n"
" already permitted.\n"
"\n"
-" = Permit only this protocol (ignoring the list already permit-\n"
+" = Permit only this protocol (ignoring the list already permit-\n"
, stdout);
fputs(
-" ted), though subject to later modification by subsequent\n"
+" ted), though subject to later modification by subsequent\n"
" entries in the comma separated list.\n"
"\n"
" For example:\n"
@@ -2089,7 +2185,7 @@ void hugehelp(void)
fputs(
" Unknown protocols produce a warning. This allows scripts to safely rely\n"
" on being able to disable potentially dangerous protocols, without rely-\n"
-" ing upon support for that protocol being built into curl to avoid an\n"
+" ing upon support for that protocol being built into curl to avoid an\n"
" error.\n"
"\n"
" This option can be used multiple times, in which case the effect is the\n"
@@ -2100,19 +2196,19 @@ void hugehelp(void)
" --proxy-anyauth\n"
, stdout);
fputs(
-" Tells curl to pick a suitable authentication method when commu-\n"
-" nicating with the given HTTP proxy. This might cause an extra\n"
+" Tells curl to pick a suitable authentication method when commu-\n"
+" nicating with the given HTTP proxy. This might cause an extra\n"
" request/response round-trip.\n"
"\n"
" See also -x, --proxy and --proxy-basic and --proxy-digest. Added\n"
" in 7.13.2.\n"
"\n"
" --proxy-basic\n"
-" Tells curl to use HTTP Basic authentication when communicating\n"
+" Tells curl to use HTTP Basic authentication when communicating\n"
" with the given proxy. Use --basic for enabling HTTP Basic with a\n"
, stdout);
fputs(
-" remote host. Basic is the default authentication method curl\n"
+" remote host. Basic is the default authentication method curl\n"
" uses with proxies.\n"
"\n"
" See also -x, --proxy and --proxy-anyauth and --proxy-digest.\n"
@@ -2120,7 +2216,7 @@ void hugehelp(void)
" --proxy-cacert <file>\n"
" Same as --cacert but used in HTTPS proxy context.\n"
"\n"
-" See also --proxy-capath and --cacert and --capath and -x,\n"
+" See also --proxy-capath and --cacert and --capath and -x,\n"
" --proxy. Added in 7.52.0.\n"
"\n"
" --proxy-capath <dir>\n"
@@ -2128,7 +2224,7 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" See also --proxy-cacert and -x, --proxy and --capath. Added in\n"
+" See also --proxy-cacert and -x, --proxy and --capath. Added in\n"
" 7.52.0.\n"
"\n"
" --proxy-cert-type <type>\n"
@@ -2154,7 +2250,7 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-digest\n"
-" Tells curl to use HTTP Digest authentication when communicating\n"
+" Tells curl to use HTTP Digest authentication when communicating\n"
" with the given proxy. Use --digest for enabling HTTP Digest with\n"
" a remote host.\n"
"\n"
@@ -2163,30 +2259,30 @@ void hugehelp(void)
" --proxy-header <header/@file>\n"
, stdout);
fputs(
-" (HTTP) Extra header to include in the request when sending HTTP\n"
+" (HTTP) Extra header to include in the request when sending HTTP\n"
" to a proxy. You may specify any number of extra headers. This is\n"
-" the equivalent option to -H, --header but is for proxy communi-\n"
-" cation only like in CONNECT requests when you want a separate\n"
-" header sent to the proxy to what is sent to the actual remote\n"
+" the equivalent option to -H, --header but is for proxy communi-\n"
+" cation only like in CONNECT requests when you want a separate\n"
+" header sent to the proxy to what is sent to the actual remote\n"
" host.\n"
"\n"
-" curl will make sure that each header you add/replace is sent\n"
+" curl will make sure that each header you add/replace is sent\n"
, stdout);
fputs(
" with the proper end-of-line marker, you should thus not add that\n"
" as a part of the header content: do not add newlines or carriage\n"
" returns, they will only mess things up for you.\n"
"\n"
-" Headers specified with this option will not be included in\n"
+" Headers specified with this option will not be included in\n"
" requests that curl knows will not be sent to a proxy.\n"
"\n"
-" Starting in 7.55.0, this option can take an argument in @file-\n"
+" Starting in 7.55.0, this option can take an argument in @file-\n"
, stdout);
fputs(
-" name style, which then adds a header for each line in the input\n"
+" name style, which then adds a header for each line in the input\n"
" file. Using @- will make curl read the header file from stdin.\n"
"\n"
-" This option can be used multiple times to add/replace/remove\n"
+" This option can be used multiple times to add/replace/remove\n"
" multiple headers.\n"
"\n"
" Added in 7.37.0.\n"
@@ -2206,7 +2302,7 @@ void hugehelp(void)
" Same as --key but used in HTTPS proxy context.\n"
"\n"
" --proxy-negotiate\n"
-" Tells curl to use HTTP Negotiate (SPNEGO) authentication when\n"
+" Tells curl to use HTTP Negotiate (SPNEGO) authentication when\n"
" communicating with the given proxy. Use --negotiate for enabling\n"
" HTTP Negotiate (SPNEGO) with a remote host.\n"
"\n"
@@ -2215,7 +2311,7 @@ void hugehelp(void)
" See also --proxy-anyauth and --proxy-basic. Added in 7.17.1.\n"
"\n"
" --proxy-ntlm\n"
-" Tells curl to use HTTP NTLM authentication when communicating\n"
+" Tells curl to use HTTP NTLM authentication when communicating\n"
" with the given proxy. Use --ntlm for enabling NTLM with a remote\n"
" host.\n"
"\n"
@@ -2229,7 +2325,7 @@ void hugehelp(void)
" --proxy-service-name <name>\n"
, stdout);
fputs(
-" This option allows you to change the service name for proxy\n"
+" This option allows you to change the service name for proxy\n"
" negotiation.\n"
"\n"
" Added in 7.43.0.\n"
@@ -2262,13 +2358,13 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" -U, --proxy-user <user:password>\n"
-" Specify the user name and password to use for proxy authentica-\n"
+" Specify the user name and password to use for proxy authentica-\n"
" tion.\n"
"\n"
, stdout);
fputs(
-" If you use a Windows SSPI-enabled curl binary and do either\n"
-" Negotiate or NTLM authentication then you can tell curl to\n"
+" If you use a Windows SSPI-enabled curl binary and do either\n"
+" Negotiate or NTLM authentication then you can tell curl to\n"
" select the user name and password from your environment by spec-\n"
" ifying a single colon with this option: \"-U :\".\n"
"\n"
@@ -2279,32 +2375,32 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" The proxy string can be specified with a protocol:// prefix. No\n"
+" The proxy string can be specified with a protocol:// prefix. No\n"
" protocol specified or http:// will be treated as HTTP proxy. Use\n"
" socks4://, socks4a://, socks5:// or socks5h:// to request a spe-\n"
" cific SOCKS version to be used. (The protocol support was added\n"
" in curl 7.21.7)\n"
"\n"
-" HTTPS proxy support via https:// protocol prefix was added in\n"
+" HTTPS proxy support via https:// protocol prefix was added in\n"
" 7.52.0 for OpenSSL, GnuTLS and NSS.\n"
"\n"
, stdout);
fputs(
-" Unrecognized and unsupported proxy protocols cause an error\n"
-" since 7.52.0. Prior versions may ignore the protocol and use\n"
+" Unrecognized and unsupported proxy protocols cause an error\n"
+" since 7.52.0. Prior versions may ignore the protocol and use\n"
" http:// instead.\n"
"\n"
-" If the port number is not specified in the proxy string, it is\n"
+" If the port number is not specified in the proxy string, it is\n"
" assumed to be 1080.\n"
"\n"
-" This option overrides existing environment variables that set\n"
-" the proxy to use. If there's an environment variable setting a\n"
+" This option overrides existing environment variables that set\n"
+" the proxy to use. If there's an environment variable setting a\n"
, stdout);
fputs(
" proxy, you can set proxy to \"\" to override it.\n"
"\n"
" All operations that are performed over an HTTP proxy will trans-\n"
-" parently be converted to HTTP. It means that certain protocol\n"
+" parently be converted to HTTP. It means that certain protocol\n"
" specific operations might not be available. This is not the case\n"
" if you can tunnel through the proxy, as one with the -p, --prox-\n"
" ytunnel option.\n"
@@ -2312,11 +2408,11 @@ void hugehelp(void)
" User and password that might be provided in the proxy string are\n"
, stdout);
fputs(
-" URL decoded by curl. This allows you to pass in special charac-\n"
+" URL decoded by curl. This allows you to pass in special charac-\n"
" ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
-" The proxy host can be specified the exact same way as the proxy\n"
-" environment variables, including the protocol prefix (http://)\n"
+" The proxy host can be specified the exact same way as the proxy\n"
+" environment variables, including the protocol prefix (http://)\n"
" and the embedded user + password.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -2324,24 +2420,24 @@ void hugehelp(void)
" --proxy1.0 <host[:port]>\n"
, stdout);
fputs(
-" Use the specified HTTP 1.0 proxy. If the port number is not\n"
+" Use the specified HTTP 1.0 proxy. If the port number is not\n"
" specified, it is assumed at port 1080.\n"
"\n"
-" The only difference between this and the HTTP proxy option -x,\n"
-" --proxy, is that attempts to use CONNECT through the proxy will\n"
+" The only difference between this and the HTTP proxy option -x,\n"
+" --proxy, is that attempts to use CONNECT through the proxy will\n"
" specify an HTTP 1.0 protocol instead of the default HTTP 1.1.\n"
"\n"
" -p, --proxytunnel\n"
-" When an HTTP proxy is used -x, --proxy, this option will cause\n"
+" When an HTTP proxy is used -x, --proxy, this option will cause\n"
, stdout);
fputs(
-" non-HTTP protocols to attempt to tunnel through the proxy\n"
-" instead of merely using it to do HTTP-like operations. The tun-\n"
-" nel approach is made with the HTTP proxy CONNECT request and\n"
+" non-HTTP protocols to attempt to tunnel through the proxy\n"
+" instead of merely using it to do HTTP-like operations. The tun-\n"
+" nel approach is made with the HTTP proxy CONNECT request and\n"
" requires that the proxy allows direct connect to the remote port\n"
" number curl wants to tunnel through to.\n"
"\n"
-" To suppress proxy CONNECT response headers when curl is set to\n"
+" To suppress proxy CONNECT response headers when curl is set to\n"
, stdout);
fputs(
" output headers use --suppress-connect-headers.\n"
@@ -2354,54 +2450,54 @@ void hugehelp(void)
"\n"
" If this option is used several times, the last one will be used.\n"
" (As of 7.39.0, curl attempts to automatically extract the public\n"
-" key from the private key file, so passing this option is gener-\n"
+" key from the private key file, so passing this option is gener-\n"
, stdout);
fputs(
" ally not required. Note that this public key extraction requires\n"
-" libcurl to be linked against a copy of libssh2 1.2.8 or higher\n"
+" libcurl to be linked against a copy of libssh2 1.2.8 or higher\n"
" that is itself linked against OpenSSL.)\n"
"\n"
" -Q, --quote\n"
-" (FTP SFTP) Send an arbitrary command to the remote FTP or SFTP\n"
-" server. Quote commands are sent BEFORE the transfer takes place\n"
-" (just after the initial PWD command in an FTP transfer, to be\n"
+" (FTP SFTP) Send an arbitrary command to the remote FTP or SFTP\n"
+" server. Quote commands are sent BEFORE the transfer takes place\n"
+" (just after the initial PWD command in an FTP transfer, to be\n"
, stdout);
fputs(
" exact). To make commands take place after a successful transfer,\n"
-" prefix them with a dash '-'. To make commands be sent after\n"
+" prefix them with a dash '-'. To make commands be sent after\n"
" curl has changed the working directory, just before the transfer\n"
-" command(s), prefix the command with a '+' (this is only sup-\n"
+" command(s), prefix the command with a '+' (this is only sup-\n"
" ported for FTP). You may specify any number of commands.\n"
"\n"
-" If the server returns failure for one of the commands, the\n"
+" If the server returns failure for one of the commands, the\n"
, stdout);
fputs(
-" entire operation will be aborted. You must send syntactically\n"
-" correct FTP commands as RFC 959 defines to FTP servers, or one\n"
+" entire operation will be aborted. You must send syntactically\n"
+" correct FTP commands as RFC 959 defines to FTP servers, or one\n"
" of the commands listed below to SFTP servers.\n"
"\n"
-" This option can be used multiple times. When speaking to an FTP\n"
-" server, prefix the command with an asterisk (*) to make curl\n"
-" continue even if the command fails as by default curl will stop\n"
+" This option can be used multiple times. When speaking to an FTP\n"
+" server, prefix the command with an asterisk (*) to make curl\n"
+" continue even if the command fails as by default curl will stop\n"
" at first failure.\n"
"\n"
, stdout);
fputs(
-" SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP\n"
-" quote commands itself before sending them to the server. File\n"
+" SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP\n"
+" quote commands itself before sending them to the server. File\n"
" names may be quoted shell-style to embed spaces or special char-\n"
-" acters. Following is the list of all supported SFTP quote com-\n"
+" acters. Following is the list of all supported SFTP quote com-\n"
" mands:\n"
"\n"
" chgrp group file\n"
-" The chgrp command sets the group ID of the file named by\n"
+" The chgrp command sets the group ID of the file named by\n"
, stdout);
fputs(
-" the file operand to the group ID specified by the group\n"
+" the file operand to the group ID specified by the group\n"
" operand. The group operand is a decimal integer group ID.\n"
"\n"
" chmod mode file\n"
-" The chmod command modifies the file mode bits of the\n"
+" The chmod command modifies the file mode bits of the\n"
" specified file. The mode operand is an octal integer mode\n"
" number.\n"
"\n"
@@ -2409,16 +2505,16 @@ void hugehelp(void)
" The chown command sets the owner of the file named by the\n"
, stdout);
fputs(
-" file operand to the user ID specified by the user oper-\n"
+" file operand to the user ID specified by the user oper-\n"
" and. The user operand is a decimal integer user ID.\n"
"\n"
" ln source_file target_file\n"
" The ln and symlink commands create a symbolic link at the\n"
-" target_file location pointing to the source_file loca-\n"
+" target_file location pointing to the source_file loca-\n"
" tion.\n"
"\n"
" mkdir directory_name\n"
-" The mkdir command creates the directory named by the\n"
+" The mkdir command creates the directory named by the\n"
, stdout);
fputs(
" directory_name operand.\n"
@@ -2428,7 +2524,7 @@ void hugehelp(void)
"\n"
" rename source target\n"
" The rename command renames the file or directory named by\n"
-" the source operand to the destination path named by the\n"
+" the source operand to the destination path named by the\n"
" target operand.\n"
"\n"
" rm file\n"
@@ -2438,7 +2534,7 @@ void hugehelp(void)
" erand.\n"
"\n"
" rmdir directory\n"
-" The rmdir command removes the directory entry specified\n"
+" The rmdir command removes the directory entry specified\n"
" by the directory operand, provided it is empty.\n"
"\n"
" symlink source_file target_file\n"
@@ -2448,12 +2544,12 @@ void hugehelp(void)
" Specify the path name to file containing what will be considered\n"
, stdout);
fputs(
-" as random data. The data may be used to seed the random engine\n"
+" as random data. The data may be used to seed the random engine\n"
" for SSL connections. See also the --egd-file option.\n"
"\n"
" -r, --range <range>\n"
-" (HTTP FTP SFTP FILE) Retrieve a byte range (i.e a partial docu-\n"
-" ment) from a HTTP/1.1, FTP or SFTP server or a local FILE.\n"
+" (HTTP FTP SFTP FILE) Retrieve a byte range (i.e a partial docu-\n"
+" ment) from a HTTP/1.1, FTP or SFTP server or a local FILE.\n"
" Ranges can be specified in a number of ways.\n"
"\n"
" 0-499 specifies the first 500 bytes\n"
@@ -2471,24 +2567,24 @@ void hugehelp(void)
" 100-199,500-599\n"
" specifies two separate 100-byte ranges(*) (HTTP)\n"
"\n"
-" (*) = NOTE that this will cause the server to reply with a mul-\n"
+" (*) = NOTE that this will cause the server to reply with a mul-\n"
" tipart response!\n"
"\n"
, stdout);
fputs(
-" Only digit characters (0-9) are valid in the 'start' and 'stop'\n"
-" fields of the 'start-stop' range syntax. If a non-digit charac-\n"
+" Only digit characters (0-9) are valid in the 'start' and 'stop'\n"
+" fields of the 'start-stop' range syntax. If a non-digit charac-\n"
" ter is given in the range, the server's response will be unspec-\n"
" ified, depending on the server's configuration.\n"
"\n"
-" You should also be aware that many HTTP/1.1 servers do not have\n"
-" this feature enabled, so that when you attempt to get a range,\n"
+" You should also be aware that many HTTP/1.1 servers do not have\n"
+" this feature enabled, so that when you attempt to get a range,\n"
, stdout);
fputs(
" you'll instead get the whole document.\n"
"\n"
-" FTP and SFTP range downloads only support the simple 'start-\n"
-" stop' syntax (optionally with one of the numbers omitted). FTP\n"
+" FTP and SFTP range downloads only support the simple 'start-\n"
+" stop' syntax (optionally with one of the numbers omitted). FTP\n"
" use depends on the extended FTP command SIZE.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -2496,7 +2592,7 @@ void hugehelp(void)
" --raw (HTTP) When used, it disables all internal HTTP decoding of con-\n"
, stdout);
fputs(
-" tent or transfer encodings and instead makes them passed on\n"
+" tent or transfer encodings and instead makes them passed on\n"
" unaltered, raw.\n"
"\n"
" Added in 7.16.2.\n"
@@ -2504,11 +2600,11 @@ void hugehelp(void)
" -e, --referer <URL>\n"
" (HTTP) Sends the \"Referrer Page\" information to the HTTP server.\n"
" This can also be set with the -H, --header flag of course. When\n"
-" used with -L, --location you can append \";auto\" to the -e,\n"
-" --referer URL to make curl automatically set the previous URL\n"
+" used with -L, --location you can append \";auto\" to the -e,\n"
+" --referer URL to make curl automatically set the previous URL\n"
, stdout);
fputs(
-" when it follows a Location: header. The \";auto\" string can be\n"
+" when it follows a Location: header. The \";auto\" string can be\n"
" used alone, even if you don't set an initial -e, --referer.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -2522,24 +2618,24 @@ void hugehelp(void)
fputs(
" extracting a filename from the URL.\n"
"\n"
-" If the server specifies a file name and a file with that name\n"
-" already exists in the current working directory it will not be\n"
+" If the server specifies a file name and a file with that name\n"
+" already exists in the current working directory it will not be\n"
" overwritten and an error will occur. If the server doesn't spec-\n"
" ify a file name then this option has no effect.\n"
"\n"
-" There's no attempt to decode %-sequences (yet) in the provided\n"
+" There's no attempt to decode %-sequences (yet) in the provided\n"
, stdout);
fputs(
" file name, so this option may provide you with rather unexpected\n"
" file names.\n"
"\n"
-" WARNING: Exercise judicious use of this option, especially on\n"
-" Windows. A rogue server could send you the name of a DLL or\n"
-" other file that could possibly be loaded automatically by Win-\n"
+" WARNING: Exercise judicious use of this option, especially on\n"
+" Windows. A rogue server could send you the name of a DLL or\n"
+" other file that could possibly be loaded automatically by Win-\n"
" dows or some third party software.\n"
"\n"
" --remote-name-all\n"
-" This option changes the default action for all given URLs to be\n"
+" This option changes the default action for all given URLs to be\n"
, stdout);
fputs(
" dealt with as if -O, --remote-name were used for each one. So if\n"
@@ -2549,76 +2645,78 @@ void hugehelp(void)
" Added in 7.19.0.\n"
"\n"
" -O, --remote-name\n"
-" Write output to a local file named like the remote file we get.\n"
-" (Only the file part of the remote file is used, the path is cut\n"
+" Write output to a local file named like the remote file we get.\n"
+" (Only the file part of the remote file is used, the path is cut\n"
" off.)\n"
"\n"
, stdout);
fputs(
-" The file will be saved in the current working directory. If you\n"
-" want the file saved in a different directory, make sure you\n"
-" change the current working directory before invoking curl with\n"
+" The file will be saved in the current working directory. If you\n"
+" want the file saved in a different directory, make sure you\n"
+" change the current working directory before invoking curl with\n"
" this option.\n"
"\n"
-" The remote file name to use for saving is extracted from the\n"
-" given URL, nothing else, and if it already exists it will be\n"
+" The remote file name to use for saving is extracted from the\n"
+" given URL, nothing else, and if it already exists it will be\n"
, stdout);
fputs(
-" overwritten. If you want the server to be able to choose the\n"
+" overwritten. If you want the server to be able to choose the\n"
" file name refer to -J, --remote-header-name which can be used in\n"
-" addition to this option. If the server chooses a file name and\n"
+" addition to this option. If the server chooses a file name and\n"
" that name already exists it will not be overwritten.\n"
"\n"
" There is no URL decoding done on the file name. If it has %20 or\n"
-" other URL encoded parts of the name, they will end up as-is as\n"
+" other URL encoded parts of the name, they will end up as-is as\n"
" file name.\n"
"\n"
, stdout);
fputs(
-" You may use this option as many times as the number of URLs you\n"
+" You may use this option as many times as the number of URLs you\n"
" have.\n"
"\n"
" -R, --remote-time\n"
-" When used, this will make curl attempt to figure out the time-\n"
-" stamp of the remote file, and if that is available make the\n"
+" When used, this will make curl attempt to figure out the time-\n"
+" stamp of the remote file, and if that is available make the\n"
" local file get that same timestamp.\n"
"\n"
" --request-target\n"
-" (HTTP) Tells curl to use an alternative \"target\" (path) instead\n"
+" (HTTP) Tells curl to use an alternative \"target\" (path) instead\n"
, stdout);
fputs(
-" of using the path as provided in the URL. Particularly useful\n"
-" when wanting to issue HTTP requests without leading slash or\n"
-" other data that doesn't follow the regular URL pattern, like\n"
+" of using the path as provided in the URL. Particularly useful\n"
+" when wanting to issue HTTP requests without leading slash or\n"
+" other data that doesn't follow the regular URL pattern, like\n"
" \"OPTIONS *\".\n"
"\n"
+" Added in 7.55.0.\n"
+"\n"
" -X, --request <command>\n"
" (HTTP) Specifies a custom request method to use when communicat-\n"
-" ing with the HTTP server. The specified request method will be\n"
+" ing with the HTTP server. The specified request method will be\n"
, stdout);
fputs(
-" used instead of the method otherwise used (which defaults to\n"
-" GET). Read the HTTP 1.1 specification for details and explana-\n"
-" tions. Common additional HTTP requests include PUT and DELETE,\n"
+" used instead of the method otherwise used (which defaults to\n"
+" GET). Read the HTTP 1.1 specification for details and explana-\n"
+" tions. Common additional HTTP requests include PUT and DELETE,\n"
" but related technologies like WebDAV offers PROPFIND, COPY, MOVE\n"
" and more.\n"
"\n"
-" Normally you don't need this option. All sorts of GET, HEAD,\n"
+" Normally you don't need this option. All sorts of GET, HEAD,\n"
" POST and PUT requests are rather invoked by using dedicated com-\n"
, stdout);
fputs(
" mand line options.\n"
"\n"
-" This option only changes the actual word used in the HTTP\n"
-" request, it does not alter the way curl behaves. So for example\n"
-" if you want to make a proper HEAD request, using -X HEAD will\n"
+" This option only changes the actual word used in the HTTP\n"
+" request, it does not alter the way curl behaves. So for example\n"
+" if you want to make a proper HEAD request, using -X HEAD will\n"
" not suffice. You need to use the -I, --head option.\n"
"\n"
-" The method string you set with -X, --request will be used for\n"
-" all requests, which if you for example use -L, --location may\n"
+" The method string you set with -X, --request will be used for\n"
+" all requests, which if you for example use -L, --location may\n"
, stdout);
fputs(
-" cause unintended side-effects when curl doesn't change request\n"
+" cause unintended side-effects when curl doesn't change request\n"
" method according to the HTTP 30x response codes - and similar.\n"
"\n"
" (FTP) Specifies a custom FTP command to use instead of LIST when\n"
@@ -2627,7 +2725,7 @@ void hugehelp(void)
" (POP3) Specifies a custom POP3 command to use instead of LIST or\n"
" RETR. (Added in 7.26.0)\n"
"\n"
-" (IMAP) Specifies a custom IMAP command to use instead of LIST.\n"
+" (IMAP) Specifies a custom IMAP command to use instead of LIST.\n"
, stdout);
fputs(
" (Added in 7.30.0)\n"
@@ -2638,31 +2736,34 @@ void hugehelp(void)
" If this option is used several times, the last one will be used.\n"
"\n"
" --resolve <host:port:address>\n"
-" Provide a custom address for a specific host and port pair.\n"
-" Using this, you can make the curl requests(s) use a specified\n"
+" Provide a custom address for a specific host and port pair.\n"
+" Using this, you can make the curl requests(s) use a specified\n"
, stdout);
fputs(
-" address and prevent the otherwise normally resolved address to\n"
-" be used. Consider it a sort of /etc/hosts alternative provided\n"
-" on the command line. The port number should be the number used\n"
-" for the specific protocol the host will be used for. It means\n"
-" you need several entries if you want to provide address for the\n"
+" address and prevent the otherwise normally resolved address to\n"
+" be used. Consider it a sort of /etc/hosts alternative provided\n"
+" on the command line. The port number should be the number used\n"
+" for the specific protocol the host will be used for. It means\n"
+" you need several entries if you want to provide address for the\n"
" same host but different ports.\n"
"\n"
, stdout);
fputs(
" The provided address set by this option will be used even if -4,\n"
" --ipv4 or -6, --ipv6 is set to make curl use another IP version.\n"
+" Support for providing the IP address within [brackets] was added\n"
+" in 7.57.0.\n"
+"\n"
" This option can be used many times to add many host names to\n"
" resolve.\n"
"\n"
" Added in 7.21.3.\n"
"\n"
" --retry-connrefused\n"
-" In addition to the other conditions, consider ECONNREFUSED as a\n"
-" transient error too for --retry. This option is used together\n"
, stdout);
fputs(
+" In addition to the other conditions, consider ECONNREFUSED as a\n"
+" transient error too for --retry. This option is used together\n"
" with --retry.\n"
"\n"
" Added in 7.52.0.\n"
@@ -2671,11 +2772,11 @@ void hugehelp(void)
" Make curl sleep this amount of time before each retry when a\n"
" transfer has failed with a transient error (it changes the\n"
" default backoff time algorithm between retries). This option is\n"
+, stdout);
+ fputs(
" only interesting if --retry is also used. Setting this delay to\n"
" zero will make curl use the default backoff time.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.12.3.\n"
@@ -2683,10 +2784,10 @@ void hugehelp(void)
" --retry-max-time <seconds>\n"
" The retry timer is reset before the first transfer attempt.\n"
" Retries will be done as usual (see --retry) as long as the timer\n"
-" hasn't reached this given limit. Notice that if the timer hasn't\n"
-" reached the limit, the request will be made and while perform-\n"
, stdout);
fputs(
+" hasn't reached this given limit. Notice that if the timer hasn't\n"
+" reached the limit, the request will be made and while perform-\n"
" ing, it may take longer than this given time period. To limit a\n"
" single request's maximum time, use -m, --max-time. Set this\n"
" option to zero to not timeout retries.\n"
@@ -2695,19 +2796,19 @@ void hugehelp(void)
"\n"
" Added in 7.12.3.\n"
"\n"
-" --retry <num>\n"
-" If a transient error is returned when curl tries to perform a\n"
, stdout);
fputs(
+" --retry <num>\n"
+" If a transient error is returned when curl tries to perform a\n"
" transfer, it will retry this number of times before giving up.\n"
" Setting the number to 0 makes curl do no retries (which is the\n"
" default). Transient error means either: a timeout, an FTP 4xx\n"
" response code or an HTTP 5xx response code.\n"
"\n"
" When curl is about to retry a transfer, it will first wait one\n"
-" second and then for all forthcoming retries it will double the\n"
, stdout);
fputs(
+" second and then for all forthcoming retries it will double the\n"
" waiting time until it reaches 10 minutes which then will be the\n"
" delay between the rest of the retries. By using --retry-delay\n"
" you disable this exponential backoff algorithm. See also\n"
@@ -2715,11 +2816,11 @@ void hugehelp(void)
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.12.3.\n"
"\n"
" --sasl-ir\n"
-, stdout);
- fputs(
" Enable initial response in SASL authentication.\n"
"\n"
" Added in 7.31.0.\n"
@@ -2733,10 +2834,10 @@ void hugehelp(void)
" Added in 7.43.0.\n"
" -S, --show-error\n"
" When used with -s, --silent, it makes curl show an error message\n"
-" if it fails.\n"
-" -s, --silent\n"
, stdout);
fputs(
+" if it fails.\n"
+" -s, --silent\n"
" Silent or quiet mode. Don't show progress meter or error mes-\n"
" sages. Makes Curl mute. It will still output the data you ask\n"
" for, potentially even to the terminal/stdout unless you redirect\n"
@@ -2747,9 +2848,9 @@ void hugehelp(void)
"\n"
" See also -v, --verbose and --stderr.\n"
"\n"
-" --socks4 <host[:port]>\n"
, stdout);
fputs(
+" --socks4 <host[:port]>\n"
" Use the specified SOCKS4 proxy. If the port number is not speci-\n"
" fied, it is assumed at port 1080.\n"
"\n"
@@ -2758,9 +2859,9 @@ void hugehelp(void)
"\n"
" Since 7.21.7, this option is superfluous since you can specify a\n"
" socks4 proxy with -x, --proxy using a socks4:// protocol prefix.\n"
-" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
, stdout);
fputs(
+" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
" such a case curl first connects to the SOCKS proxy and then con-\n"
" nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
@@ -2770,11 +2871,11 @@ void hugehelp(void)
" Added in 7.15.2.\n"
"\n"
" --socks4a <host[:port]>\n"
+, stdout);
+ fputs(
" Use the specified SOCKS4a proxy. If the port number is not spec-\n"
" ified, it is assumed at port 1080.\n"
"\n"
-, stdout);
- fputs(
" This option overrides any previous use of -x, --proxy, as they\n"
" are mutually exclusive.\n"
"\n"
@@ -2782,10 +2883,10 @@ void hugehelp(void)
" socks4a proxy with -x, --proxy using a socks4a:// protocol pre-\n"
" fix.\n"
"\n"
-" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
-" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
, stdout);
fputs(
+" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
+" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
" such a case curl first connects to the SOCKS proxy and then con-\n"
" nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
@@ -2794,10 +2895,10 @@ void hugehelp(void)
" Added in 7.18.0.\n"
"\n"
" --socks5-basic\n"
-" Tells curl to use username/password authentication when connect-\n"
-" ing to a SOCKS5 proxy. The username/password authentication is\n"
, stdout);
fputs(
+" Tells curl to use username/password authentication when connect-\n"
+" ing to a SOCKS5 proxy. The username/password authentication is\n"
" enabled by default. Use --socks5-gssapi to force GSS-API\n"
" authentication to SOCKS5 proxies.\n"
"\n"
@@ -2805,10 +2906,10 @@ void hugehelp(void)
"\n"
" --socks5-gssapi-nec\n"
" As part of the GSS-API negotiation a protection mode is negoti-\n"
-" ated. RFC 1961 says in section 4.3/4.4 it should be protected,\n"
-" but the NEC reference implementation does not. The option\n"
, stdout);
fputs(
+" ated. RFC 1961 says in section 4.3/4.4 it should be protected,\n"
+" but the NEC reference implementation does not. The option\n"
" --socks5-gssapi-nec allows the unprotected exchange of the pro-\n"
" tection mode negotiation.\n"
"\n"
@@ -2818,10 +2919,10 @@ void hugehelp(void)
" The default service name for a socks server is rcmd/server-fqdn.\n"
" This option allows you to change it.\n"
"\n"
-" Examples: --socks5 proxy-name --socks5-gssapi-service sockd\n"
-" would use sockd/proxy-name --socks5 proxy-name --socks5-gssapi-\n"
, stdout);
fputs(
+" Examples: --socks5 proxy-name --socks5-gssapi-service sockd\n"
+" would use sockd/proxy-name --socks5 proxy-name --socks5-gssapi-\n"
" service sockd/real-name would use sockd/real-name for cases\n"
" where the proxy-name does not match the principal name.\n"
"\n"
@@ -2829,10 +2930,10 @@ void hugehelp(void)
"\n"
" --socks5-gssapi\n"
" Tells curl to use GSS-API authentication when connecting to a\n"
-" SOCKS5 proxy. The GSS-API authentication is enabled by default\n"
-" (if curl is compiled with GSS-API support). Use --socks5-basic\n"
, stdout);
fputs(
+" SOCKS5 proxy. The GSS-API authentication is enabled by default\n"
+" (if curl is compiled with GSS-API support). Use --socks5-basic\n"
" to force username/password authentication to SOCKS5 proxies.\n"
"\n"
" Added in 7.55.0.\n"
@@ -2842,22 +2943,22 @@ void hugehelp(void)
" host name). If the port number is not specified, it is assumed\n"
" at port 1080.\n"
"\n"
+, stdout);
+ fputs(
" This option overrides any previous use of -x, --proxy, as they\n"
" are mutually exclusive.\n"
"\n"
-, stdout);
- fputs(
" Since 7.21.7, this option is superfluous since you can specify a\n"
" socks5 hostname proxy with -x, --proxy using a socks5h:// proto-\n"
" col prefix.\n"
"\n"
" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
+, stdout);
+ fputs(
" such a case curl first connects to the SOCKS proxy and then con-\n"
" nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.18.0.\n"
@@ -2867,20 +2968,20 @@ void hugehelp(void)
" locally. If the port number is not specified, it is assumed at\n"
" port 1080.\n"
"\n"
+, stdout);
+ fputs(
" This option overrides any previous use of -x, --proxy, as they\n"
" are mutually exclusive.\n"
"\n"
-, stdout);
- fputs(
" Since 7.21.7, this option is superfluous since you can specify a\n"
" socks5 proxy with -x, --proxy using a socks5:// protocol prefix.\n"
" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
+, stdout);
+ fputs(
" such a case curl first connects to the SOCKS proxy and then con-\n"
" nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
" This option (as well as --socks4) does not work with IPV6, FTPS\n"
" or LDAP.\n"
@@ -2889,22 +2990,22 @@ void hugehelp(void)
"\n"
" -Y, --speed-limit <speed>\n"
" If a download is slower than this given speed (in bytes per sec-\n"
+, stdout);
+ fputs(
" ond) for speed-time seconds it gets aborted. speed-time is set\n"
" with -y, --speed-time and is 30 if not set.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -y, --speed-time <seconds>\n"
" If a download is slower than speed-limit bytes per second during\n"
" a speed-time period, the download gets aborted. If speed-time is\n"
" used, the default speed-limit will be 1 unless set with -Y,\n"
+, stdout);
+ fputs(
" --speed-limit.\n"
"\n"
" This option controls transfers and thus will not affect slow\n"
-, stdout);
- fputs(
" connects etc. If this is a concern for you, try the --connect-\n"
" timeout option.\n"
"\n"
@@ -2913,9 +3014,9 @@ void hugehelp(void)
" --ssl-allow-beast\n"
" This option tells curl to not work around a security flaw in the\n"
" SSL3 and TLS1.0 protocols known as BEAST. If this option isn't\n"
-" used, the SSL layer may use workarounds known to cause interop-\n"
, stdout);
fputs(
+" used, the SSL layer may use workarounds known to cause interop-\n"
" erability problems with some older SSL implementations. WARNING:\n"
" this option loosens the SSL security, and by using this flag you\n"
" ask for exactly that.\n"
@@ -2925,12 +3026,12 @@ void hugehelp(void)
" --ssl-no-revoke\n"
" (WinSSL) This option tells curl to disable certificate revoca-\n"
" tion checks. WARNING: this option loosens the SSL security, and\n"
+, stdout);
+ fputs(
" by using this flag you ask for exactly that.\n"
"\n"
" Added in 7.44.0.\n"
"\n"
-, stdout);
- fputs(
" --ssl-reqd\n"
" (FTP IMAP POP3 SMTP) Require SSL/TLS for the connection. Termi-\n"
" nates the connection if the server doesn't support SSL/TLS.\n"
@@ -2940,9 +3041,9 @@ void hugehelp(void)
" Added in 7.20.0.\n"
"\n"
" --ssl (FTP IMAP POP3 SMTP) Try to use SSL/TLS for the connection.\n"
-" Reverts to a non-secure connection if the server doesn't support\n"
, stdout);
fputs(
+" Reverts to a non-secure connection if the server doesn't support\n"
" SSL/TLS. See also --ftp-ssl-control and --ssl-reqd for differ-\n"
" ent levels of encryption required.\n"
"\n"
@@ -2953,9 +3054,9 @@ void hugehelp(void)
" Added in 7.20.0.\n"
"\n"
" -2, --sslv2\n"
-" (SSL) Forces curl to use SSL version 2 when negotiating with a\n"
, stdout);
fputs(
+" (SSL) Forces curl to use SSL version 2 when negotiating with a\n"
" remote SSL server. Sometimes curl is built without SSLv2 sup-\n"
" port. SSLv2 is widely considered insecure (see RFC 6176).\n"
"\n"
@@ -2964,9 +3065,9 @@ void hugehelp(void)
" rides -3, --sslv3 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
" -3, --sslv3\n"
-" (SSL) Forces curl to use SSL version 3 when negotiating with a\n"
, stdout);
fputs(
+" (SSL) Forces curl to use SSL version 3 when negotiating with a\n"
" remote SSL server. Sometimes curl is built without SSLv3 sup-\n"
" port. SSLv3 is widely considered insecure (see RFC 7568).\n"
"\n"
@@ -2975,9 +3076,9 @@ void hugehelp(void)
" rides -2, --sslv2 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
" --stderr\n"
-" Redirect all writes to stderr to the specified file instead. If\n"
, stdout);
fputs(
+" Redirect all writes to stderr to the specified file instead. If\n"
" the file name is a plain '-', it is instead written to stdout.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -2987,9 +3088,9 @@ void hugehelp(void)
" --suppress-connect-headers\n"
" When -p, --proxytunnel is used and a CONNECT request is made\n"
" don't output proxy CONNECT response headers. This option is\n"
-" meant to be used with -D, --dump-header or -i, --include which\n"
, stdout);
fputs(
+" meant to be used with -D, --dump-header or -i, --include which\n"
" are used to show protocol headers in the output. It has no\n"
" effect on debug options such as -v, --verbose or --trace, or any\n"
" statistics.\n"
@@ -3003,9 +3104,9 @@ void hugehelp(void)
" Added in 7.49.0.\n"
"\n"
" --tcp-nodelay\n"
-" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
, stdout);
fputs(
+" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
" page for details about this option.\n"
"\n"
" Since 7.50.2, curl sets this option by default and you need to\n"
@@ -3018,10 +3119,10 @@ void hugehelp(void)
"\n"
" TTYPE=<term> Sets the terminal type.\n"
"\n"
-" XDISPLOC=<X display> Sets the X display location.\n"
-"\n"
, stdout);
fputs(
+" XDISPLOC=<X display> Sets the X display location.\n"
+"\n"
" NEW_ENV=<var,val> Sets an environment variable.\n"
"\n"
" --tftp-blksize <value>\n"
@@ -3033,9 +3134,9 @@ void hugehelp(void)
"\n"
" Added in 7.20.0.\n"
"\n"
-" --tftp-no-options\n"
, stdout);
fputs(
+" --tftp-no-options\n"
" (TFTP) Tells curl not to send TFTP options requests.\n"
"\n"
" This option improves interop with some legacy servers that do\n"
@@ -3129,38 +3230,39 @@ void hugehelp(void)
" remote TLS server.\n"
"\n"
" Note that TLS 1.3 is only supported by a subset of TLS backends.\n"
-" At the time of writing this, those are BoringSSL and NSS only.\n"
+" At the time of this writing, they are BoringSSL, NSS, and Secure\n"
+, stdout);
+ fputs(
+" Transport (on iOS 11 or later, and macOS 10.13 or later).\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" -1, --tlsv1\n"
-, stdout);
- fputs(
-" (SSL) Tells curl to use TLS version 1.x when negotiating with a\n"
+" (SSL) Tells curl to use TLS version 1.x when negotiating with a\n"
" remote TLS server. That means TLS version 1.0, 1.1 or 1.2.\n"
"\n"
-" See also --http1.1 and --http2. -1, --tlsv1 requires that the\n"
-" underlying libcurl was built to support TLS. This option over-\n"
+" See also --http1.1 and --http2. -1, --tlsv1 requires that the\n"
+" underlying libcurl was built to support TLS. This option over-\n"
" rides --tlsv1.1 and --tlsv1.2 and --tlsv1.3.\n"
"\n"
-" --tr-encoding\n"
-" (HTTP) Request a compressed Transfer-Encoding response using one\n"
, stdout);
fputs(
-" of the algorithms curl supports, and uncompress the data while\n"
+" --tr-encoding\n"
+" (HTTP) Request a compressed Transfer-Encoding response using one\n"
+" of the algorithms curl supports, and uncompress the data while\n"
" receiving it.\n"
"\n"
" Added in 7.21.6.\n"
"\n"
" --trace-ascii <file>\n"
-" Enables a full trace dump of all incoming and outgoing data,\n"
+" Enables a full trace dump of all incoming and outgoing data,\n"
" including descriptive information, to the given output file. Use\n"
" \"-\" as filename to have the output sent to stdout.\n"
"\n"
-" This is very similar to --trace, but leaves out the hex part and\n"
, stdout);
fputs(
-" only shows the ASCII part of the dump. It makes smaller output\n"
+" This is very similar to --trace, but leaves out the hex part and\n"
+" only shows the ASCII part of the dump. It makes smaller output\n"
" that might be easier to read for untrained humans.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3168,58 +3270,58 @@ void hugehelp(void)
" This option overrides --trace and -v, --verbose.\n"
"\n"
" --trace-time\n"
-" Prepends a time stamp to each trace or verbose line that curl\n"
+" Prepends a time stamp to each trace or verbose line that curl\n"
" displays.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.14.0.\n"
"\n"
" --trace <file>\n"
-, stdout);
- fputs(
-" Enables a full trace dump of all incoming and outgoing data,\n"
+" Enables a full trace dump of all incoming and outgoing data,\n"
" including descriptive information, to the given output file. Use\n"
-" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
+" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
" filename to have the output sent to stderr.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" This option overrides -v, --verbose and --trace-ascii.\n"
"\n"
-" --unix-socket <path>\n"
, stdout);
fputs(
+" --unix-socket <path>\n"
" (HTTP) Connect through this Unix domain socket, instead of using\n"
" the network.\n"
"\n"
" Added in 7.40.0.\n"
"\n"
" -T, --upload-file <file>\n"
-" This transfers the specified local file to the remote URL. If\n"
+" This transfers the specified local file to the remote URL. If\n"
" there is no file part in the specified URL, curl will append the\n"
" local file name. NOTE that you must use a trailing / on the last\n"
-" directory to really prove to Curl that there is no file name or\n"
, stdout);
fputs(
+" directory to really prove to Curl that there is no file name or\n"
" curl will think that your last directory name is the remote file\n"
" name to use. That will most likely cause the upload operation to\n"
" fail. If this is used on an HTTP(S) server, the PUT command will\n"
" be used.\n"
"\n"
-" Use the file name \"-\" (a single dash) to use stdin instead of a\n"
-" given file. Alternately, the file name \".\" (a single period)\n"
-" may be specified instead of \"-\" to use stdin in non-blocking\n"
+" Use the file name \"-\" (a single dash) to use stdin instead of a\n"
+" given file. Alternately, the file name \".\" (a single period)\n"
, stdout);
fputs(
-" mode to allow reading server output while stdin is being\n"
+" may be specified instead of \"-\" to use stdin in non-blocking\n"
+" mode to allow reading server output while stdin is being\n"
" uploaded.\n"
"\n"
-" You can specify one -T, --upload-file for each URL on the com-\n"
-" mand line. Each -T, --upload-file + URL pair specifies what to\n"
-" upload and to where. curl also supports \"globbing\" of the -T,\n"
-" --upload-file argument, meaning that you can upload multiple\n"
-" files to a single URL by using the same URL globbing style sup-\n"
+" You can specify one -T, --upload-file for each URL on the com-\n"
+" mand line. Each -T, --upload-file + URL pair specifies what to\n"
+" upload and to where. curl also supports \"globbing\" of the -T,\n"
, stdout);
fputs(
+" --upload-file argument, meaning that you can upload multiple\n"
+" files to a single URL by using the same URL globbing style sup-\n"
" ported in the URL, like this:\n"
"\n"
" curl --upload-file \"{file1,file2}\" http://www.example.com\n"
@@ -3228,43 +3330,43 @@ void hugehelp(void)
"\n"
" curl -T \"img[1-1000].png\" ftp://ftp.example.com/upload/\n"
"\n"
-" When uploading to an SMTP server: the uploaded data is assumed\n"
-" to be RFC 5322 formatted. It has to feature the necessary set of\n"
-" headers and mail body formatted correctly by the user as curl\n"
+" When uploading to an SMTP server: the uploaded data is assumed\n"
, stdout);
fputs(
+" to be RFC 5322 formatted. It has to feature the necessary set of\n"
+" headers and mail body formatted correctly by the user as curl\n"
" will not transcode nor encode it further in any way.\n"
"\n"
" --url <url>\n"
-" Specify a URL to fetch. This option is mostly handy when you\n"
+" Specify a URL to fetch. This option is mostly handy when you\n"
" want to specify URL(s) in a config file.\n"
"\n"
-" If the given URL is missing a scheme name (such as \"http://\" or\n"
-" \"ftp://\" etc) then curl will make a guess based on the host. If\n"
-" the outermost sub-domain name matches DICT, FTP, IMAP, LDAP,\n"
+" If the given URL is missing a scheme name (such as \"http://\" or\n"
, stdout);
fputs(
-" POP3 or SMTP then that protocol will be used, otherwise HTTP\n"
+" \"ftp://\" etc) then curl will make a guess based on the host. If\n"
+" the outermost sub-domain name matches DICT, FTP, IMAP, LDAP,\n"
+" POP3 or SMTP then that protocol will be used, otherwise HTTP\n"
" will be used. Since 7.45.0 guessing can be disabled by setting a\n"
" default protocol, see --proto-default for details.\n"
"\n"
-" This option may be used any number of times. To control where\n"
-" this URL is written, use the -o, --output or the -O, --remote-\n"
+" This option may be used any number of times. To control where\n"
+, stdout);
+ fputs(
+" this URL is written, use the -o, --output or the -O, --remote-\n"
" name options.\n"
"\n"
" -B, --use-ascii\n"
-, stdout);
- fputs(
-" (FTP LDAP) Enable ASCII transfer. For FTP, this can also be\n"
-" enforced by using a URL that ends with \";type=A\". This option\n"
+" (FTP LDAP) Enable ASCII transfer. For FTP, this can also be\n"
+" enforced by using a URL that ends with \";type=A\". This option\n"
" causes data sent to stdout to be in text mode for win32 systems.\n"
"\n"
" -A, --user-agent <name>\n"
" (HTTP) Specify the User-Agent string to send to the HTTP server.\n"
-" To encode blanks in the string, surround the string with single\n"
, stdout);
fputs(
-" quote marks. This can also be set with the -H, --header option\n"
+" To encode blanks in the string, surround the string with single\n"
+" quote marks. This can also be set with the -H, --header option\n"
" of course.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3273,118 +3375,120 @@ void hugehelp(void)
" Specify the user name and password to use for server authentica-\n"
" tion. Overrides -n, --netrc and --netrc-optional.\n"
"\n"
-" If you simply specify the user name, curl will prompt for a\n"
-" password.\n"
-"\n"
, stdout);
fputs(
-" The user name and passwords are split up on the first colon,\n"
-" which makes it impossible to use a colon in the user name with\n"
+" If you simply specify the user name, curl will prompt for a\n"
+" password.\n"
+"\n"
+" The user name and passwords are split up on the first colon,\n"
+" which makes it impossible to use a colon in the user name with\n"
" this option. The password can, still.\n"
"\n"
-" When using Kerberos V5 with a Windows based server you should\n"
-" include the Windows domain name in the user name, in order for\n"
-" the server to successfully obtain a Kerberos Ticket. If you\n"
+" When using Kerberos V5 with a Windows based server you should\n"
+" include the Windows domain name in the user name, in order for\n"
, stdout);
fputs(
+" the server to successfully obtain a Kerberos Ticket. If you\n"
" don't then the initial authentication handshake may fail.\n"
"\n"
-" When using NTLM, the user name can be specified simply as the\n"
-" user name, without the domain, if there is a single domain and\n"
+" When using NTLM, the user name can be specified simply as the\n"
+" user name, without the domain, if there is a single domain and\n"
" forest in your setup for example.\n"
"\n"
-" To specify the domain name use either Down-Level Logon Name or\n"
+" To specify the domain name use either Down-Level Logon Name or\n"
+, stdout);
+ fputs(
" UPN (User Principal Name) formats. For example, EXAMPLE\\user and\n"
" user@example.com respectively.\n"
"\n"
-, stdout);
- fputs(
-" If you use a Windows SSPI-enabled curl binary and perform Ker-\n"
-" beros V5, Negotiate, NTLM or Digest authentication then you can\n"
-" tell curl to select the user name and password from your envi-\n"
+" If you use a Windows SSPI-enabled curl binary and perform Ker-\n"
+" beros V5, Negotiate, NTLM or Digest authentication then you can\n"
+" tell curl to select the user name and password from your envi-\n"
" ronment by specifying a single colon with this option: \"-u :\".\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -v, --verbose\n"
-" Makes curl verbose during the operation. Useful for debugging\n"
-, stdout);
- fputs(
-" and seeing what's going on \"under the hood\". A line starting\n"
-" with '>' means \"header data\" sent by curl, '<' means \"header\n"
-" data\" received by curl that is hidden in normal cases, and a\n"
+" Makes curl verbose during the operation. Useful for debugging\n"
+" and seeing what's going on \"under the hood\". A line starting\n"
+" with '>' means \"header data\" sent by curl, '<' means \"header\n"
+" data\" received by curl that is hidden in normal cases, and a\n"
" line starting with '*' means additional info provided by curl.\n"
"\n"
+, stdout);
+ fputs(
" If you only want HTTP headers in the output, -i, --include might\n"
" be the option you're looking for.\n"
"\n"
-, stdout);
- fputs(
-" If you think this option still doesn't give you enough details,\n"
+" If you think this option still doesn't give you enough details,\n"
" consider using --trace or --trace-ascii instead.\n"
"\n"
" Use -s, --silent to make curl really quiet.\n"
"\n"
-" See also -i, --include. This option overrides --trace and\n"
+" See also -i, --include. This option overrides --trace and\n"
" --trace-ascii.\n"
"\n"
" -V, --version\n"
-" Displays information about curl and the libcurl version it uses.\n"
-" The first line includes the full version of curl, libcurl and\n"
, stdout);
fputs(
+" Displays information about curl and the libcurl version it uses.\n"
+" The first line includes the full version of curl, libcurl and\n"
" other 3rd party libraries linked with the executable.\n"
"\n"
-" The second line (starts with \"Protocols:\") shows all protocols\n"
+" The second line (starts with \"Protocols:\") shows all protocols\n"
" that libcurl reports to support.\n"
"\n"
" The third line (starts with \"Features:\") shows specific features\n"
+, stdout);
+ fputs(
" libcurl reports to offer. Available features include:\n"
"\n"
" IPv6 You can use IPv6 with this.\n"
"\n"
" krb4 Krb4 for FTP is supported.\n"
"\n"
-, stdout);
- fputs(
-" SSL SSL versions of various protocols are supported, such as\n"
+" SSL SSL versions of various protocols are supported, such as\n"
" HTTPS, FTPS, POP3S and so on.\n"
"\n"
-" libz Automatic decompression of compressed files over HTTP is\n"
+" libz Automatic decompression of compressed files over HTTP is\n"
" supported.\n"
"\n"
" NTLM NTLM authentication is supported.\n"
"\n"
-" Debug This curl uses a libcurl built with Debug. This enables\n"
-" more error-tracking and memory debugging etc. For curl-\n"
-" developers only!\n"
-"\n"
, stdout);
fputs(
+" Debug This curl uses a libcurl built with Debug. This enables\n"
+" more error-tracking and memory debugging etc. For curl-\n"
+" developers only!\n"
+"\n"
" AsynchDNS\n"
-" This curl uses asynchronous name resolves. Asynchronous\n"
-" name resolves can be done using either the c-ares or the\n"
+" This curl uses asynchronous name resolves. Asynchronous\n"
+" name resolves can be done using either the c-ares or the\n"
" threaded resolver backends.\n"
"\n"
" SPNEGO SPNEGO authentication is supported.\n"
"\n"
+, stdout);
+ fputs(
" Largefile\n"
" This curl supports transfers of large files, files larger\n"
" than 2GB.\n"
"\n"
" IDN This curl supports IDN - international domain names.\n"
"\n"
-, stdout);
- fputs(
" GSS-API\n"
" GSS-API is supported.\n"
"\n"
" SSPI SSPI is supported.\n"
"\n"
" TLS-SRP\n"
-" SRP (Secure Remote Password) authentication is supported\n"
+" SRP (Secure Remote Password) authentication is supported\n"
" for TLS.\n"
"\n"
+, stdout);
+ fputs(
" HTTP2 HTTP/2 support has been built-in.\n"
"\n"
" UnixSockets\n"
@@ -3394,122 +3498,122 @@ void hugehelp(void)
" This curl is built to support HTTPS proxy.\n"
"\n"
" Metalink\n"
+" This curl supports Metalink (both version 3 and 4 (RFC\n"
+" 5854)), which describes mirrors and hashes. curl will\n"
+" use mirrors for failover if there are errors (such as the\n"
, stdout);
fputs(
-" This curl supports Metalink (both version 3 and 4 (RFC\n"
-" 5854)), which describes mirrors and hashes. curl will\n"
-" use mirrors for failover if there are errors (such as the\n"
" file or server not being available).\n"
"\n"
-" PSL PSL is short for Public Suffix List and means that this\n"
-" curl has been built with knowledge about \"public suf-\n"
+" PSL PSL is short for Public Suffix List and means that this\n"
+" curl has been built with knowledge about \"public suf-\n"
" fixes\".\n"
"\n"
-, stdout);
- fputs(
" -w, --write-out <format>\n"
" Make curl display information on stdout after a completed trans-\n"
-" fer. The format is a string that may contain plain text mixed\n"
-" with any number of variables. The format can be specified as a\n"
-" literal \"string\", or you can have curl read the format from a\n"
-" file with \"@filename\" and to tell curl to read the format from\n"
+" fer. The format is a string that may contain plain text mixed\n"
+, stdout);
+ fputs(
+" with any number of variables. The format can be specified as a\n"
+" literal \"string\", or you can have curl read the format from a\n"
+" file with \"@filename\" and to tell curl to read the format from\n"
" stdin you write \"@-\".\n"
"\n"
+" The variables present in the output format will be substituted\n"
+" by the value or text that curl thinks fit, as described below.\n"
, stdout);
fputs(
-" The variables present in the output format will be substituted\n"
-" by the value or text that curl thinks fit, as described below.\n"
-" All variables are specified as %{variable_name} and to output a\n"
-" normal % you just write them as %%. You can output a newline by\n"
+" All variables are specified as %{variable_name} and to output a\n"
+" normal % you just write them as %%. You can output a newline by\n"
" using \\n, a carriage return with \\r and a tab space with \\t.\n"
"\n"
" NOTE: The %-symbol is a special symbol in the win32-environment,\n"
-, stdout);
- fputs(
-" where all occurrences of % must be doubled when using this\n"
+" where all occurrences of % must be doubled when using this\n"
" option.\n"
"\n"
" The variables available are:\n"
"\n"
-" content_type The Content-Type of the requested document, if\n"
+, stdout);
+ fputs(
+" content_type The Content-Type of the requested document, if\n"
" there was any.\n"
"\n"
" filename_effective\n"
-" The ultimate filename that curl writes out to.\n"
-" This is only meaningful if curl is told to write\n"
+" The ultimate filename that curl writes out to.\n"
+" This is only meaningful if curl is told to write\n"
+" to a file with the -O, --remote-name or -o,\n"
+" --output option. It's most useful in combination\n"
, stdout);
fputs(
-" to a file with the -O, --remote-name or -o,\n"
-" --output option. It's most useful in combination\n"
-" with the -J, --remote-header-name option. (Added\n"
+" with the -J, --remote-header-name option. (Added\n"
" in 7.26.0)\n"
"\n"
" ftp_entry_path The initial path curl ended up in when logging on\n"
" to the remote FTP server. (Added in 7.15.4)\n"
"\n"
+" http_code The numerical response code that was found in the\n"
+" last retrieved HTTP(S) or FTP(s) transfer. In\n"
, stdout);
fputs(
-" http_code The numerical response code that was found in the\n"
-" last retrieved HTTP(S) or FTP(s) transfer. In\n"
-" 7.18.2 the alias response_code was added to show\n"
+" 7.18.2 the alias response_code was added to show\n"
" the same info.\n"
"\n"
-" http_connect The numerical code that was found in the last\n"
-" response (from a proxy) to a curl CONNECT\n"
+" http_connect The numerical code that was found in the last\n"
+" response (from a proxy) to a curl CONNECT\n"
" request. (Added in 7.12.4)\n"
"\n"
-, stdout);
- fputs(
" http_version The http version that was effectively used.\n"
" (Added in 7.50.0)\n"
"\n"
-" local_ip The IP address of the local end of the most\n"
-" recently done connection - can be either IPv4 or\n"
+, stdout);
+ fputs(
+" local_ip The IP address of the local end of the most\n"
+" recently done connection - can be either IPv4 or\n"
" IPv6 (Added in 7.29.0)\n"
"\n"
-" local_port The local port number of the most recently done\n"
+" local_port The local port number of the most recently done\n"
" connection (Added in 7.29.0)\n"
"\n"
-, stdout);
- fputs(
-" num_connects Number of new connects made in the recent trans-\n"
+" num_connects Number of new connects made in the recent trans-\n"
" fer. (Added in 7.12.3)\n"
"\n"
-" num_redirects Number of redirects that were followed in the\n"
+, stdout);
+ fputs(
+" num_redirects Number of redirects that were followed in the\n"
" request. (Added in 7.12.3)\n"
"\n"
" proxy_ssl_verify_result\n"
" The result of the HTTPS proxy's SSL peer certifi-\n"
" cate verification that was requested. 0 means the\n"
-, stdout);
- fputs(
" verification was successful. (Added in 7.52.0)\n"
"\n"
" redirect_url When an HTTP request was made without -L, --loca-\n"
-" tion to follow redirects (or when --max-redir is\n"
-" met), this variable will show the actual URL a\n"
-" redirect would have gone to. (Added in 7.18.2)\n"
-"\n"
-" remote_ip The remote IP address of the most recently done\n"
, stdout);
fputs(
+" tion to follow redirects (or when --max-redir is\n"
+" met), this variable will show the actual URL a\n"
+" redirect would have gone to. (Added in 7.18.2)\n"
+"\n"
+" remote_ip The remote IP address of the most recently done\n"
" connection - can be either IPv4 or IPv6 (Added in\n"
" 7.29.0)\n"
"\n"
-" remote_port The remote port number of the most recently done\n"
+, stdout);
+ fputs(
+" remote_port The remote port number of the most recently done\n"
" connection (Added in 7.29.0)\n"
"\n"
-" scheme The URL scheme (sometimes called protocol) that\n"
+" scheme The URL scheme (sometimes called protocol) that\n"
" was effectively used (Added in 7.52.0)\n"
"\n"
" size_download The total amount of bytes that were downloaded.\n"
"\n"
-, stdout);
- fputs(
" size_header The total amount of bytes of the downloaded head-\n"
" ers.\n"
"\n"
-" size_request The total amount of bytes that were sent in the\n"
+, stdout);
+ fputs(
+" size_request The total amount of bytes that were sent in the\n"
" HTTP request.\n"
"\n"
" size_upload The total amount of bytes that were uploaded.\n"
@@ -3517,77 +3621,77 @@ void hugehelp(void)
" speed_download The average download speed that curl measured for\n"
" the complete download. Bytes per second.\n"
"\n"
-, stdout);
- fputs(
-" speed_upload The average upload speed that curl measured for\n"
+" speed_upload The average upload speed that curl measured for\n"
" the complete upload. Bytes per second.\n"
"\n"
+, stdout);
+ fputs(
" ssl_verify_result\n"
-" The result of the SSL peer certificate verifica-\n"
+" The result of the SSL peer certificate verifica-\n"
" tion that was requested. 0 means the verification\n"
" was successful. (Added in 7.19.0)\n"
"\n"
" time_appconnect\n"
+" The time, in seconds, it took from the start\n"
+" until the SSL/SSH/etc connect/handshake to the\n"
, stdout);
fputs(
-" The time, in seconds, it took from the start\n"
-" until the SSL/SSH/etc connect/handshake to the\n"
" remote host was completed. (Added in 7.19.0)\n"
"\n"
-" time_connect The time, in seconds, it took from the start\n"
-" until the TCP connect to the remote host (or\n"
+" time_connect The time, in seconds, it took from the start\n"
+" until the TCP connect to the remote host (or\n"
" proxy) was completed.\n"
"\n"
" time_namelookup\n"
-, stdout);
- fputs(
-" The time, in seconds, it took from the start\n"
+" The time, in seconds, it took from the start\n"
" until the name resolving was completed.\n"
"\n"
" time_pretransfer\n"
-" The time, in seconds, it took from the start\n"
-" until the file transfer was just about to begin.\n"
-" This includes all pre-transfer commands and nego-\n"
-" tiations that are specific to the particular pro-\n"
, stdout);
fputs(
+" The time, in seconds, it took from the start\n"
+" until the file transfer was just about to begin.\n"
+" This includes all pre-transfer commands and nego-\n"
+" tiations that are specific to the particular pro-\n"
" tocol(s) involved.\n"
"\n"
" time_redirect The time, in seconds, it took for all redirection\n"
+, stdout);
+ fputs(
" steps including name lookup, connect, pretransfer\n"
-" and transfer before the final transaction was\n"
-" started. time_redirect shows the complete execu-\n"
-" tion time for multiple redirections. (Added in\n"
+" and transfer before the final transaction was\n"
+" started. time_redirect shows the complete execu-\n"
+" tion time for multiple redirections. (Added in\n"
" 7.12.3)\n"
"\n"
+" time_starttransfer\n"
+" The time, in seconds, it took from the start\n"
, stdout);
fputs(
-" time_starttransfer\n"
-" The time, in seconds, it took from the start\n"
-" until the first byte was just about to be trans-\n"
-" ferred. This includes time_pretransfer and also\n"
-" the time the server needed to calculate the\n"
+" until the first byte was just about to be trans-\n"
+" ferred. This includes time_pretransfer and also\n"
+" the time the server needed to calculate the\n"
" result.\n"
"\n"
-" time_total The total time, in seconds, that the full opera-\n"
-, stdout);
- fputs(
+" time_total The total time, in seconds, that the full opera-\n"
" tion lasted.\n"
"\n"
" url_effective The URL that was fetched last. This is most mean-\n"
-" ingful if you've told curl to follow location:\n"
+, stdout);
+ fputs(
+" ingful if you've told curl to follow location:\n"
" headers.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --xattr\n"
-" When saving output to a file, this option tells curl to store\n"
-" certain file metadata in extended file attributes. Currently,\n"
+" When saving output to a file, this option tells curl to store\n"
+" certain file metadata in extended file attributes. Currently,\n"
+" the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
, stdout);
fputs(
-" the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
-" the content type is stored in the mime_type attribute. If the\n"
-" file system does not support extended attributes, a warning is\n"
+" the content type is stored in the mime_type attribute. If the\n"
+" file system does not support extended attributes, a warning is\n"
" issued.\n"
"\n"
"FILES\n"
@@ -3596,12 +3700,12 @@ void hugehelp(void)
"\n"
"ENVIRONMENT\n"
" The environment variables can be specified in lower case or upper case.\n"
-, stdout);
- fputs(
" The lower case version has precedence. http_proxy is an exception as it\n"
" is only available in lower case.\n"
"\n"
-" Using an environment variable to set the proxy has the same effect as\n"
+, stdout);
+ fputs(
+" Using an environment variable to set the proxy has the same effect as\n"
" using the -x, --proxy option.\n"
"\n"
" http_proxy [protocol://]<host>[:port]\n"
@@ -3610,48 +3714,48 @@ void hugehelp(void)
" Sets the proxy server to use for HTTPS.\n"
"\n"
" [url-protocol]_PROXY [protocol://]<host>[:port]\n"
+" Sets the proxy server to use for [url-protocol], where the pro-\n"
, stdout);
fputs(
-" Sets the proxy server to use for [url-protocol], where the pro-\n"
-" tocol is a protocol that curl supports and as specified in a\n"
+" tocol is a protocol that curl supports and as specified in a\n"
" URL. FTP, FTPS, POP3, IMAP, SMTP, LDAP etc.\n"
"\n"
" ALL_PROXY [protocol://]<host>[:port]\n"
-" Sets the proxy server to use if no protocol-specific proxy is\n"
+" Sets the proxy server to use if no protocol-specific proxy is\n"
" set.\n"
"\n"
" NO_PROXY <comma-separated list of hosts>\n"
-" list of host names that shouldn't go through any proxy. If set\n"
-, stdout);
- fputs(
+" list of host names that shouldn't go through any proxy. If set\n"
" to a asterisk '*' only, it matches all hosts.\n"
"\n"
-" Since 7.53.0, this environment variable disable the proxy even\n"
-" if specify -x, --proxy option. That is NO_PROXY=direct.exam-\n"
-" ple.com curl -x http://proxy.example.com http://direct.exam-\n"
-" ple.com accesses the target URL directly, and\n"
-" NO_PROXY=direct.example.com curl -x http://proxy.example.com\n"
, stdout);
fputs(
-" http://somewhere.example.com accesses the target URL through\n"
+" Since 7.53.0, this environment variable disable the proxy even\n"
+" if specify -x, --proxy option. That is NO_PROXY=direct.exam-\n"
+" ple.com curl -x http://proxy.example.com http://direct.exam-\n"
+" ple.com accesses the target URL directly, and\n"
+" NO_PROXY=direct.example.com curl -x http://proxy.example.com\n"
+" http://somewhere.example.com accesses the target URL through\n"
" proxy.\n"
"\n"
+, stdout);
+ fputs(
"PROXY PROTOCOL PREFIXES\n"
-" Since curl version 7.21.7, the proxy string may be specified with a\n"
+" Since curl version 7.21.7, the proxy string may be specified with a\n"
" protocol:// prefix to specify alternative proxy protocols.\n"
"\n"
-" If no protocol is specified in the proxy string or if the string\n"
-" doesn't match a supported one, the proxy will be treated as an HTTP\n"
+" If no protocol is specified in the proxy string or if the string\n"
+" doesn't match a supported one, the proxy will be treated as an HTTP\n"
" proxy.\n"
"\n"
-, stdout);
- fputs(
" The supported proxy protocol prefixes are as follows:\n"
"\n"
" socks4://\n"
" Makes it the equivalent of --socks4\n"
"\n"
" socks4a://\n"
+, stdout);
+ fputs(
" Makes it the equivalent of --socks4a\n"
"\n"
" socks5://\n"
@@ -3661,119 +3765,117 @@ void hugehelp(void)
" Makes it the equivalent of --socks5-hostname\n"
"\n"
"EXIT CODES\n"
-" There are a bunch of different error codes and their corresponding\n"
-, stdout);
- fputs(
-" error messages that may appear during bad conditions. At the time of\n"
+" There are a bunch of different error codes and their corresponding\n"
+" error messages that may appear during bad conditions. At the time of\n"
" this writing, the exit codes are:\n"
"\n"
" 1 Unsupported protocol. This build of curl has no support for this\n"
+, stdout);
+ fputs(
" protocol.\n"
"\n"
" 2 Failed to initialize.\n"
"\n"
" 3 URL malformed. The syntax was not correct.\n"
"\n"
-" 4 A feature or option that was needed to perform the desired\n"
-" request was not enabled or was explicitly disabled at build-\n"
-, stdout);
- fputs(
-" time. To make curl able to do this, you probably need another\n"
+" 4 A feature or option that was needed to perform the desired\n"
+" request was not enabled or was explicitly disabled at build-\n"
+" time. To make curl able to do this, you probably need another\n"
" build of libcurl!\n"
"\n"
-" 5 Couldn't resolve proxy. The given proxy host could not be\n"
+" 5 Couldn't resolve proxy. The given proxy host could not be\n"
" resolved.\n"
"\n"
+, stdout);
+ fputs(
" 6 Couldn't resolve host. The given remote host was not resolved.\n"
"\n"
" 7 Failed to connect to host.\n"
"\n"
" 8 Weird server reply. The server sent data curl couldn't parse.\n"
"\n"
-" 9 FTP access denied. The server denied login or denied access to\n"
-, stdout);
- fputs(
-" the particular resource or directory you wanted to reach. Most\n"
-" often you tried to change to a directory that doesn't exist on\n"
+" 9 FTP access denied. The server denied login or denied access to\n"
+" the particular resource or directory you wanted to reach. Most\n"
+" often you tried to change to a directory that doesn't exist on\n"
" the server.\n"
"\n"
-" 10 FTP accept failed. While waiting for the server to connect back\n"
-" when an active FTP session is used, an error code was sent over\n"
+, stdout);
+ fputs(
+" 10 FTP accept failed. While waiting for the server to connect back\n"
+" when an active FTP session is used, an error code was sent over\n"
" the control connection or similar.\n"
"\n"
-" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n"
+" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n"
" PASS request.\n"
-, stdout);
- fputs(
"\n"
-" 12 During an active FTP session while waiting for the server to\n"
+" 12 During an active FTP session while waiting for the server to\n"
" connect back to curl, the timeout expired.\n"
"\n"
-" 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the\n"
+, stdout);
+ fputs(
+" 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the\n"
" PASV request.\n"
"\n"
-" 14 FTP weird 227 format. Curl couldn't parse the 227-line the\n"
+" 14 FTP weird 227 format. Curl couldn't parse the 227-line the\n"
" server sent.\n"
"\n"
-" 15 FTP can't get host. Couldn't resolve the host IP we got in the\n"
+" 15 FTP can't get host. Couldn't resolve the host IP we got in the\n"
" 227-line.\n"
"\n"
-, stdout);
- fputs(
" 16 HTTP/2 error. A problem was detected in the HTTP2 framing layer.\n"
" This is somewhat generic and can be one out of several problems,\n"
+, stdout);
+ fputs(
" see the error message for details.\n"
"\n"
-" 17 FTP couldn't set binary. Couldn't change transfer method to\n"
+" 17 FTP couldn't set binary. Couldn't change transfer method to\n"
" binary.\n"
"\n"
" 18 Partial file. Only a part of the file was transferred.\n"
"\n"
-" 19 FTP couldn't download/access the given file, the RETR (or simi-\n"
+" 19 FTP couldn't download/access the given file, the RETR (or simi-\n"
" lar) command failed.\n"
"\n"
+" 21 FTP quote error. A quote command returned error from the server.\n"
+" 22 HTTP page not retrieved. The requested url was not found or\n"
, stdout);
fputs(
-" 21 FTP quote error. A quote command returned error from the server.\n"
-" 22 HTTP page not retrieved. The requested url was not found or\n"
-" returned another error with the HTTP error code being 400 or\n"
+" returned another error with the HTTP error code being 400 or\n"
" above. This return code only appears if -f, --fail is used.\n"
"\n"
-" 23 Write error. Curl couldn't write data to a local filesystem or\n"
+" 23 Write error. Curl couldn't write data to a local filesystem or\n"
" similar.\n"
"\n"
-" 25 FTP couldn't STOR file. The server denied the STOR operation,\n"
-, stdout);
- fputs(
+" 25 FTP couldn't STOR file. The server denied the STOR operation,\n"
" used for FTP uploading.\n"
"\n"
" 26 Read error. Various reading problems.\n"
"\n"
" 27 Out of memory. A memory allocation request failed.\n"
"\n"
-" 28 Operation timeout. The specified time-out period was reached\n"
+, stdout);
+ fputs(
+" 28 Operation timeout. The specified time-out period was reached\n"
" according to the conditions.\n"
"\n"
-" 30 FTP PORT failed. The PORT command failed. Not all FTP servers\n"
-" support the PORT command, try doing a transfer using PASV\n"
+" 30 FTP PORT failed. The PORT command failed. Not all FTP servers\n"
+" support the PORT command, try doing a transfer using PASV\n"
" instead!\n"
"\n"
-, stdout);
- fputs(
-" 31 FTP couldn't use REST. The REST command failed. This command is\n"
+" 31 FTP couldn't use REST. The REST command failed. This command is\n"
" used for resumed FTP transfers.\n"
"\n"
" 33 HTTP range error. The range \"command\" didn't work.\n"
"\n"
+, stdout);
+ fputs(
" 34 HTTP post error. Internal post-request generation error.\n"
"\n"
" 35 SSL connect error. The SSL handshaking failed.\n"
"\n"
-" 36 Bad download resume. Couldn't continue an earlier aborted down-\n"
+" 36 Bad download resume. Couldn't continue an earlier aborted down-\n"
" load.\n"
"\n"
-, stdout);
- fputs(
" 37 FILE couldn't read file. Failed to open the file. Permissions?\n"
"\n"
" 38 LDAP cannot bind. LDAP bind operation failed.\n"
@@ -3782,30 +3884,30 @@ void hugehelp(void)
"\n"
" 41 Function not found. A required LDAP function was not found.\n"
"\n"
+, stdout);
+ fputs(
" 42 Aborted by callback. An application told curl to abort the oper-\n"
" ation.\n"
"\n"
" 43 Internal error. A function was called with a bad parameter.\n"
"\n"
-, stdout);
- fputs(
-" 45 Interface error. A specified outgoing interface could not be\n"
+" 45 Interface error. A specified outgoing interface could not be\n"
" used.\n"
"\n"
" 47 Too many redirects. When following redirects, curl hit the maxi-\n"
" mum amount.\n"
"\n"
-" 48 Unknown option specified to libcurl. This indicates that you\n"
-" passed a weird option to curl that was passed on to libcurl and\n"
+" 48 Unknown option specified to libcurl. This indicates that you\n"
+, stdout);
+ fputs(
+" passed a weird option to curl that was passed on to libcurl and\n"
" rejected. Read up in the manual!\n"
"\n"
" 49 Malformed telnet option.\n"
"\n"
-, stdout);
- fputs(
" 51 The peer's SSL certificate or SSH MD5 fingerprint was not OK.\n"
"\n"
-" 52 The server didn't reply anything, which here is considered an\n"
+" 52 The server didn't reply anything, which here is considered an\n"
" error.\n"
"\n"
" 53 SSL crypto engine not found.\n"
@@ -3814,15 +3916,15 @@ void hugehelp(void)
"\n"
" 55 Failed sending network data.\n"
"\n"
+, stdout);
+ fputs(
" 56 Failure in receiving network data.\n"
"\n"
" 58 Problem with the local certificate.\n"
"\n"
" 59 Couldn't use specified SSL cipher.\n"
"\n"
-, stdout);
- fputs(
-" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
+" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
" cates.\n"
"\n"
" 61 Unrecognized transfer encoding.\n"
@@ -3835,13 +3937,13 @@ void hugehelp(void)
"\n"
" 65 Sending the data requires a rewind that failed.\n"
"\n"
+, stdout);
+ fputs(
" 66 Failed to initialise SSL Engine.\n"
"\n"
-" 67 The user name, password, or similar was not accepted and curl\n"
+" 67 The user name, password, or similar was not accepted and curl\n"
" failed to log in.\n"
"\n"
-, stdout);
- fputs(
" 68 File not found on TFTP server.\n"
"\n"
" 69 Permission problem on TFTP server.\n"
@@ -3856,23 +3958,25 @@ void hugehelp(void)
"\n"
" 74 No such user (TFTP).\n"
"\n"
+, stdout);
+ fputs(
" 75 Character conversion failed.\n"
"\n"
" 76 Character conversion functions required.\n"
"\n"
" 77 Problem with reading the SSL CA cert (path? access rights?).\n"
"\n"
-, stdout);
- fputs(
" 78 The resource referenced in the URL does not exist.\n"
"\n"
" 79 An unspecified error occurred during the SSH session.\n"
"\n"
" 80 Failed to shut down the SSL connection.\n"
"\n"
-" 82 Could not load CRL file, missing or wrong format (added in\n"
+" 82 Could not load CRL file, missing or wrong format (added in\n"
" 7.19.0).\n"
"\n"
+, stdout);
+ fputs(
" 83 Issuer check failed (added in 7.19.0).\n"
"\n"
" 84 The FTP PRET command failed\n"
@@ -3881,8 +3985,6 @@ void hugehelp(void)
"\n"
" 86 RTSP: mismatch of Session Identifiers\n"
"\n"
-, stdout);
- fputs(
" 87 unable to parse FTP file list\n"
"\n"
" 88 FTP chunk callback reported error\n"
@@ -3891,13 +3993,13 @@ void hugehelp(void)
"\n"
" 90 SSL public key does not matched pinned public key\n"
"\n"
+, stdout);
+ fputs(
" XX More error codes will appear here in future releases. The exist-\n"
" ing ones are meant to never change.\n"
"\n"
"AUTHORS / CONTRIBUTORS\n"
-" Daniel Stenberg is the main author, but the whole list of contributors\n"
-, stdout);
- fputs(
+" Daniel Stenberg is the main author, but the whole list of contributors\n"
" is found in the separate THANKS file.\n"
"\n"
"WWW\n"
@@ -3911,6 +4013,8 @@ void hugehelp(void)
" You always find news about what's going on as well as the latest versions\n"
" from the curl web pages, located at:\n"
"\n"
+, stdout);
+ fputs(
" https://curl.haxx.se\n"
"\n"
"SIMPLE USAGE\n"
@@ -3923,8 +4027,6 @@ void hugehelp(void)
"\n"
" curl ftp://ftp.funet.fi/README\n"
"\n"
-, stdout);
- fputs(
" Get a web page from a server using port 8000:\n"
"\n"
" curl http://www.weirdserver.com:8000/\n"
@@ -3935,6 +4037,8 @@ void hugehelp(void)
"\n"
" Get the definition of curl from a dictionary:\n"
"\n"
+, stdout);
+ fputs(
" curl dict://dict.org/m:curl\n"
"\n"
" Fetch two documents at once:\n"
@@ -3945,8 +4049,6 @@ void hugehelp(void)
"\n"
" curl ftps://files.are.secure.com/secrets.txt\n"
"\n"
-, stdout);
- fputs(
" or use the more appropriate FTPS way to get the same file:\n"
"\n"
" curl --ftp-ssl ftp://files.are.secure.com/secrets.txt\n"
@@ -3955,6 +4057,8 @@ void hugehelp(void)
"\n"
" curl -u username sftp://example.com/etc/issue\n"
"\n"
+, stdout);
+ fputs(
" Get a file from an SSH server using SCP using a private key\n"
" (not password-protected) to authenticate:\n"
"\n"
@@ -3962,8 +4066,6 @@ void hugehelp(void)
" scp://example.com/~/file.txt\n"
"\n"
" Get a file from an SSH server using SCP using a private key\n"
-, stdout);
- fputs(
" (password-protected) to authenticate:\n"
"\n"
" curl -u username: --key ~/.ssh/id_rsa --pass private_key_password \\\n"
@@ -3971,6 +4073,8 @@ void hugehelp(void)
"\n"
" Get the main page from an IPv6 web server:\n"
"\n"
+, stdout);
+ fputs(
" curl \"http://[2001:1890:1112:1::20]/\"\n"
"\n"
" Get a file from an SMB server:\n"
@@ -3981,14 +4085,14 @@ void hugehelp(void)
"\n"
" Get a web page and store in a local file with a specific name:\n"
"\n"
-, stdout);
- fputs(
" curl -o thatpage.html http://www.netscape.com/\n"
"\n"
" Get a web page and store in a local file, make the local file get the name\n"
" of the remote document (if no file name part is specified in the URL, this\n"
" will fail):\n"
"\n"
+, stdout);
+ fputs(
" curl -O http://www.netscape.com/index.html\n"
"\n"
" Fetch two files and store them with their remote names:\n"
@@ -4001,8 +4105,6 @@ void hugehelp(void)
"\n"
" To ftp files using name+passwd, include them in the URL like:\n"
"\n"
-, stdout);
- fputs(
" curl ftp://name:passwd@machine.domain:port/full/path/to/file\n"
"\n"
" or specify them with the -u flag like\n"
@@ -4011,6 +4113,8 @@ void hugehelp(void)
"\n"
" FTPS\n"
"\n"
+, stdout);
+ fputs(
" It is just like for FTP, but you may also want to specify and use\n"
" SSL-specific options for certificates etc.\n"
"\n"
@@ -4018,18 +4122,16 @@ void hugehelp(void)
" standards while the recommended \"explicit\" way is done by using FTP:// and\n"
" the --ftp-ssl option.\n"
"\n"
-, stdout);
- fputs(
" SFTP / SCP\n"
"\n"
" This is similar to FTP, but you can use the --key option to specify a\n"
" private key to use instead of a password. Note that the private key may\n"
+, stdout);
+ fputs(
" itself be protected by a password that is unrelated to the login password\n"
" of the remote system; this password is specified using the --pass option.\n"
" Typically, curl will automatically extract the public key from the private\n"
" key file, but in cases where curl does not have the proper library support,\n"
-, stdout);
- fputs(
" a matching public key file must be specified using the --pubkey option.\n"
"\n"
" HTTP\n"
@@ -4037,6 +4139,8 @@ void hugehelp(void)
" Curl also supports user and password in HTTP URLs, thus you can pick a file\n"
" like:\n"
"\n"
+, stdout);
+ fputs(
" curl http://name:passwd@machine.domain/full/path/to/file\n"
"\n"
" or specify user and password separately like in\n"
@@ -4044,18 +4148,16 @@ void hugehelp(void)
" curl -u name:passwd http://machine.domain/full/path/to/file\n"
"\n"
" HTTP offers many different methods of authentication and curl supports\n"
-, stdout);
- fputs(
" several: Basic, Digest, NTLM and Negotiate (SPNEGO). Without telling which\n"
" method to use, curl defaults to Basic. You can also ask curl to pick the\n"
" most secure ones out of the ones that the server accepts for the given URL,\n"
+, stdout);
+ fputs(
" by using --anyauth.\n"
"\n"
" NOTE! According to the URL specification, HTTP URLs can not contain a user\n"
" and password, so that style will not work when using curl via a proxy, even\n"
" though curl allows it at other times. When using a proxy, you _must_ use\n"
-, stdout);
- fputs(
" the -u style for user and password.\n"
"\n"
" HTTPS\n"
@@ -4065,13 +4167,13 @@ void hugehelp(void)
"PROXY\n"
"\n"
" curl supports both HTTP and SOCKS proxy servers, with optional authentication.\n"
+, stdout);
+ fputs(
" It does not have special support for FTP proxy servers since there are no\n"
" standards for those, but it can still be made to work with many of them. You\n"
" can also use both HTTP and SOCKS proxies to transfer files to and from FTP\n"
" servers.\n"
"\n"
-, stdout);
- fputs(
" Get an ftp file using an HTTP proxy named my-proxy that uses port 888:\n"
"\n"
" curl -x my-proxy:888 ftp://ftp.leachsite.com/README\n"
@@ -4079,20 +4181,22 @@ void hugehelp(void)
" Get a file from an HTTP server that requires user and password, using the\n"
" same proxy as above:\n"
"\n"
+, stdout);
+ fputs(
" curl -u user:passwd -x my-proxy:888 http://www.get.this/\n"
"\n"
" Some proxies require special authentication. Specify by using -U as above:\n"
"\n"
" curl -U user:passwd -x my-proxy:888 http://www.get.this/\n"
"\n"
-, stdout);
- fputs(
" A comma-separated list of hosts and domains which do not use the proxy can\n"
" be specified as:\n"
"\n"
" curl --noproxy localhost,get.this -x my-proxy:888 http://www.get.this/\n"
"\n"
" If the proxy is specified with --proxy1.0 instead of --proxy or -x, then\n"
+, stdout);
+ fputs(
" curl will use HTTP/1.0 instead of HTTP/1.1 for any CONNECT attempts.\n"
"\n"
" curl also supports SOCKS4 and SOCKS5 proxies with --socks4 and --socks5.\n"
@@ -4100,24 +4204,24 @@ void hugehelp(void)
" See also the environment variables Curl supports that offer further proxy\n"
" control.\n"
"\n"
-, stdout);
- fputs(
" Most FTP proxy servers are set up to appear as a normal FTP server from the\n"
" client's perspective, with special commands to select the remote FTP server.\n"
" curl supports the -u, -Q and --ftp-account options that can be used to\n"
+, stdout);
+ fputs(
" set up transfers through many FTP proxies. For example, a file can be\n"
" uploaded to a remote FTP server using a Blue Coat FTP proxy with the\n"
" options:\n"
"\n"
" curl -u \"Remote-FTP-Username@remote.ftp.server Proxy-Username:Remote-Pass\" \\\n"
-, stdout);
- fputs(
" --ftp-account Proxy-Password --upload-file local-file \\\n"
" ftp://my-ftp.proxy.server:21/remote/upload/path/\n"
"\n"
" See the manual for your FTP proxy to determine the form it expects to set up\n"
" transfers, and curl's -v option to see exactly what curl is sending.\n"
"\n"
+, stdout);
+ fputs(
"RANGES\n"
"\n"
" HTTP 1.1 introduced byte-ranges. Using this, a client can request\n"
@@ -4126,8 +4230,6 @@ void hugehelp(void)
"\n"
" Get the first 100 bytes of a document:\n"
"\n"
-, stdout);
- fputs(
" curl -r 0-99 http://www.get.this/\n"
"\n"
" Get the last 500 bytes of a document:\n"
@@ -4137,6 +4239,8 @@ void hugehelp(void)
" Curl also supports simple ranges for FTP files as well. Then you can only\n"
" specify start and stop position.\n"
"\n"
+, stdout);
+ fputs(
" Get the first 100 bytes of a document using FTP:\n"
"\n"
" curl -r 0-99 ftp://www.get.this/README\n"
@@ -4149,8 +4253,6 @@ void hugehelp(void)
"\n"
" curl -T - ftp://ftp.upload.com/myfile\n"
"\n"
-, stdout);
- fputs(
" Upload data from a specified file, login with user and password:\n"
"\n"
" curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile\n"
@@ -4158,6 +4260,8 @@ void hugehelp(void)
" Upload a local file to the remote site, and use the local file name at the remote\n"
" site too:\n"
"\n"
+, stdout);
+ fputs(
" curl -T uploadfile -u user:passwd ftp://ftp.upload.com/\n"
"\n"
" Upload a local file to get appended to the remote file:\n"
@@ -4165,8 +4269,6 @@ void hugehelp(void)
" curl -T localfile -a ftp://ftp.upload.com/remotefile\n"
"\n"
" Curl also supports ftp upload through a proxy, but only if the proxy is\n"
-, stdout);
- fputs(
" configured to allow that kind of tunneling. If it does, you can run curl in\n"
" a fashion similar to:\n"
"\n"
@@ -4175,6 +4277,8 @@ void hugehelp(void)
"SMB / SMBS\n"
"\n"
" curl -T file.txt -u \"domain\\username:passwd\" \n"
+, stdout);
+ fputs(
" smb://server.example.com/share/\n"
"\n"
" HTTP\n"
@@ -4186,22 +4290,20 @@ void hugehelp(void)
" Note that the HTTP server must have been configured to accept PUT before\n"
" this can be done successfully.\n"
"\n"
-, stdout);
- fputs(
" For other ways to do HTTP data upload, see the POST section below.\n"
"\n"
"VERBOSE / DEBUG\n"
"\n"
" If curl fails where it isn't supposed to, if the servers don't let you in,\n"
" if you can't understand the responses: use the -v flag to get verbose\n"
+, stdout);
+ fputs(
" fetching. Curl will output lots of info and what it sends and receives in\n"
" order to let the user see all client-server interaction (but it won't show\n"
" you the actual data).\n"
"\n"
" curl -v ftp://ftp.upload.com/\n"
"\n"
-, stdout);
- fputs(
" To get even more details and information on what curl does, try using the\n"
" --trace or --trace-ascii options with a given file name to log to, like\n"
" this:\n"
@@ -4211,23 +4313,23 @@ void hugehelp(void)
"\n"
"DETAILED INFORMATION\n"
"\n"
+, stdout);
+ fputs(
" Different protocols provide different ways of getting detailed information\n"
" about specific files/documents. To get curl to show detailed information\n"
" about a single file, you should use -I/--head option. It displays all\n"
-, stdout);
- fputs(
" available info on a single file for HTTP and FTP. The HTTP information is a\n"
" lot more extensive.\n"
"\n"
" For HTTP, you can get the header information (the same as -I would show)\n"
" shown before the data by using -i/--include. Curl understands the\n"
+, stdout);
+ fputs(
" -D/--dump-header option when getting files from both FTP and HTTP, and it\n"
" will then store the headers in the specified file.\n"
"\n"
" Store the HTTP headers in a separate file (headers.txt in the example):\n"
"\n"
-, stdout);
- fputs(
" curl --dump-header headers.txt curl.haxx.se\n"
"\n"
" Note that headers stored in a separate file can be very useful at a later\n"
@@ -4236,14 +4338,14 @@ void hugehelp(void)
"\n"
"POST (HTTP)\n"
"\n"
+, stdout);
+ fputs(
" It's easy to post data using curl. This is done using the -d <data>\n"
" option. The post data must be urlencoded.\n"
"\n"
" Post a simple \"name\" and \"phone\" guestbook.\n"
"\n"
" curl -d \"name=Rafael%20Sagula&phone=3320780\" \\\n"
-, stdout);
- fputs(
" http://www.where.com/guest.cgi\n"
"\n"
" How to post a form with curl, lesson #1:\n"
@@ -4251,17 +4353,19 @@ void hugehelp(void)
" Dig out all the <input> tags in the form that you want to fill in. (There's\n"
" a perl program called formfind.pl on the curl site that helps with this).\n"
"\n"
+, stdout);
+ fputs(
" If there's a \"normal\" post, you use -d to post. -d takes a full \"post\n"
" string\", which is in the format\n"
"\n"
" <variable1>=<data1>&<variable2>=<data2>&...\n"
"\n"
" The 'variable' names are the names set with \"name=\" in the <input> tags, and\n"
-, stdout);
- fputs(
" the data is the contents you want to fill in for the inputs. The data *must*\n"
" be properly URL encoded. That means you replace space with + and that you\n"
" replace weird letters with %XX where XX is the hexadecimal representation of\n"
+, stdout);
+ fputs(
" the letter's ASCII code.\n"
"\n"
" Example:\n"
@@ -4271,8 +4375,6 @@ void hugehelp(void)
" <form action=\"post.cgi\" method=\"post\">\n"
" <input name=user size=10>\n"
" <input name=pass type=password size=10>\n"
-, stdout);
- fputs(
" <input name=id type=hidden value=\"blablabla\">\n"
" <input name=ding value=\"submit\">\n"
" </form>\n"
@@ -4281,47 +4383,49 @@ void hugehelp(void)
"\n"
" To post to this, you enter a curl command line like:\n"
"\n"
+, stdout);
+ fputs(
" curl -d \"user=foobar&pass=12345&id=blablabla&ding=submit\" (continues)\n"
" http://www.formpost.com/getthis/post.cgi\n"
"\n"
"\n"
" While -d uses the application/x-www-form-urlencoded mime-type, generally\n"
-, stdout);
- fputs(
" understood by CGI's and similar, curl also supports the more capable\n"
" multipart/form-data type. This latter type supports things like file upload.\n"
"\n"
" -F accepts parameters like -F \"name=contents\". If you want the contents to\n"
+, stdout);
+ fputs(
" be read from a file, use <@filename> as contents. When specifying a file,\n"
" you can also specify the file content type by appending ';type=<mime type>'\n"
" to the file name. You can also post the contents of several files in one\n"
-, stdout);
- fputs(
" field. For example, the field name 'coolfiles' is used to send three files,\n"
" with different content types using the following syntax:\n"
"\n"
" curl -F \"coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html\" \\\n"
" http://www.post.com/postit.cgi\n"
"\n"
+, stdout);
+ fputs(
" If the content-type is not specified, curl will try to guess from the file\n"
" extension (it only knows a few), or use the previously specified type (from\n"
" an earlier file if several files are specified in a list) or else it will\n"
-, stdout);
- fputs(
" use the default type 'application/octet-stream'.\n"
"\n"
" Emulate a fill-in form with -F. Let's say you fill in three fields in a\n"
" form. One field is a file name which to post, one field is your name and one\n"
+, stdout);
+ fputs(
" field is a file description. We want to post the file we have written named\n"
" \"cooltext.txt\". To let curl do the posting of this data instead of your\n"
" favourite browser, you have to read the HTML source of the form page and\n"
-, stdout);
- fputs(
" find the names of the input fields. In our example, the input field names\n"
" are 'file', 'yourname' and 'filedescription'.\n"
"\n"
" curl -F \"file=@cooltext.txt\" -F \"yourname=Daniel\" \\\n"
" -F \"filedescription=Cool text file with cool text inside\" \\\n"
+, stdout);
+ fputs(
" http://www.post.com/postit.cgi\n"
"\n"
" To send two files in one post you can do it in two ways:\n"
@@ -4330,14 +4434,14 @@ void hugehelp(void)
"\n"
" curl -F \"pictures=@dog.gif,cat.gif\"\n"
"\n"
-, stdout);
- fputs(
" 2. Send two fields with two field names:\n"
"\n"
" curl -F \"docpicture=@dog.gif\" -F \"catpicture=@cat.gif\"\n"
"\n"
" To send a field value literally without interpreting a leading '@'\n"
" or '<', or an embedded ';type=', use --form-string instead of\n"
+, stdout);
+ fputs(
" -F. This is recommended when the value is obtained from a user or\n"
" some other unpredictable source. Under these circumstances, using\n"
" -F instead of --form-string would allow a user to trick curl into\n"
@@ -4345,11 +4449,11 @@ void hugehelp(void)
"\n"
"REFERRER\n"
"\n"
-, stdout);
- fputs(
" An HTTP request has the option to include information about which address\n"
" referred it to the actual page. Curl allows you to specify the\n"
" referrer to be used on the command line. It is especially useful to\n"
+, stdout);
+ fputs(
" fool or trick stupid servers or CGI scripts that rely on that information\n"
" being available or contain certain data.\n"
"\n"
@@ -4359,11 +4463,11 @@ void hugehelp(void)
"\n"
"USER AGENT\n"
"\n"
-, stdout);
- fputs(
" An HTTP request has the option to include information about the browser\n"
" that generated the request. Curl allows it to be specified on the command\n"
" line. It is especially useful to fool or trick stupid servers or CGI\n"
+, stdout);
+ fputs(
" scripts that only accept certain browsers.\n"
"\n"
" Example:\n"
@@ -4372,19 +4476,17 @@ void hugehelp(void)
"\n"
" Other common strings:\n"
" 'Mozilla/3.0 (Win95; I)' Netscape Version 3 for Windows 95\n"
-, stdout);
- fputs(
" 'Mozilla/3.04 (Win95; U)' Netscape Version 3 for Windows 95\n"
" 'Mozilla/2.02 (OS/2; U)' Netscape Version 2 for OS/2\n"
" 'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)' NS for AIX\n"
" 'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)' NS for Linux\n"
"\n"
+, stdout);
+ fputs(
" Note that Internet Explorer tries hard to be compatible in every way:\n"
" 'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)' MSIE for W95\n"
"\n"
" Mozilla is not the only possible User-Agent name:\n"
-, stdout);
- fputs(
" 'Konqueror/1.0' KDE File Manager desktop client\n"
" 'Lynx/2.7.1 libwww-FM/2.14' Lynx command line browser\n"
"\n"
@@ -4392,21 +4494,21 @@ void hugehelp(void)
"\n"
" Cookies are generally used by web servers to keep state information at the\n"
" client's side. The server sets cookies by sending a response line in the\n"
-" headers that looks like 'Set-Cookie: <data>' where the data part then\n"
-" typically contains a set of NAME=VALUE pairs (separated by semicolons ';'\n"
, stdout);
fputs(
+" headers that looks like 'Set-Cookie: <data>' where the data part then\n"
+" typically contains a set of NAME=VALUE pairs (separated by semicolons ';'\n"
" like \"NAME1=VALUE1; NAME2=VALUE2;\"). The server can also specify for what\n"
" path the \"cookie\" should be used for (by specifying \"path=value\"), when the\n"
" cookie should expire (\"expire=DATE\"), for what domain to use it\n"
" (\"domain=NAME\") and if it should be used on secure connections only\n"
" (\"secure\").\n"
"\n"
+, stdout);
+ fputs(
" If you've received a page from a server that contains a header like:\n"
" Set-Cookie: sessionid=boo123; path=\"/foo\";\n"
"\n"
-, stdout);
- fputs(
" it means the server wants that first pair passed on when we get anything in\n"
" a path beginning with \"/foo\".\n"
"\n"
@@ -4416,12 +4518,12 @@ void hugehelp(void)
"\n"
" Curl also has the ability to use previously received cookies in following\n"
" sessions. If you get cookies from a server and store them in a file in a\n"
+, stdout);
+ fputs(
" manner similar to:\n"
"\n"
" curl --dump-header headers www.example.com\n"
"\n"
-, stdout);
- fputs(
" ... you can then in a second connect to that (or another) site, use the\n"
" cookies from the 'headers' file like:\n"
"\n"
@@ -4432,10 +4534,10 @@ void hugehelp(void)
" save the incoming cookies using the well-known netscape cookie format like\n"
" this:\n"
"\n"
-" curl -c cookies.txt www.example.com\n"
-"\n"
, stdout);
fputs(
+" curl -c cookies.txt www.example.com\n"
+"\n"
" Note that by specifying -b you enable the \"cookie awareness\" and with -L\n"
" you can make curl follow a location: (which often is used in combination\n"
" with cookies). So that if a site sends cookies and a location, you can\n"
@@ -4444,9 +4546,9 @@ void hugehelp(void)
" curl -L -b empty.txt www.example.com\n"
"\n"
" The file to read cookies from must be formatted using plain HTTP headers OR\n"
-" as netscape's cookie file. Curl will determine what kind it is based on the\n"
, stdout);
fputs(
+" as netscape's cookie file. Curl will determine what kind it is based on the\n"
" file contents. In the above command, curl will parse the header and store\n"
" the cookies received from www.example.com. curl will send to the server the\n"
" stored cookies which match the request as it follows the location. The\n"
@@ -4455,12 +4557,12 @@ void hugehelp(void)
" To read and write cookies from a netscape cookie file, you can set both -b\n"
" and -c to use the same file:\n"
"\n"
+, stdout);
+ fputs(
" curl -b cookies.txt -c cookies.txt www.example.com\n"
"\n"
"PROGRESS METER\n"
"\n"
-, stdout);
- fputs(
" The progress meter exists to show a user that something actually is\n"
" happening. The different fields in the output have the following meaning:\n"
"\n"
@@ -4469,9 +4571,9 @@ void hugehelp(void)
" 0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287\n"
"\n"
" From left-to-right:\n"
-" % - percentage completed of the whole transfer\n"
, stdout);
fputs(
+" % - percentage completed of the whole transfer\n"
" Total - total size of the whole expected transfer\n"
" % - percentage completed of the download\n"
" Received - currently downloaded amount of bytes\n"
@@ -4481,9 +4583,9 @@ void hugehelp(void)
" Dload - the average transfer speed of the download\n"
" Average Speed\n"
" Upload - the average transfer speed of the upload\n"
-" Time Total - expected time to complete the operation\n"
, stdout);
fputs(
+" Time Total - expected time to complete the operation\n"
" Time Current - time passed since the invoke\n"
" Time Left - expected time left to completion\n"
" Curr.Speed - the average transfer speed the last 5 seconds (the first\n"
@@ -4494,9 +4596,9 @@ void hugehelp(void)
"\n"
"SPEED LIMIT\n"
"\n"
-" Curl allows the user to set the transfer speed conditions that must be met\n"
, stdout);
fputs(
+" Curl allows the user to set the transfer speed conditions that must be met\n"
" to let the transfer keep going. By using the switch -y and -Y you\n"
" can make curl abort transfers if the transfer speed is below the specified\n"
" lowest limit for a specified time.\n"
@@ -4507,10 +4609,10 @@ void hugehelp(void)
" curl -Y 3000 -y 60 www.far-away-site.com\n"
"\n"
" This can very well be used in combination with the overall time limit, so\n"
-" that the above operation must be completed in whole within 30 minutes:\n"
-"\n"
, stdout);
fputs(
+" that the above operation must be completed in whole within 30 minutes:\n"
+"\n"
" curl -m 1800 -Y 3000 -y 60 www.far-away-site.com\n"
"\n"
" Forcing curl not to transfer data faster than a given rate is also possible,\n"
@@ -4520,14 +4622,14 @@ void hugehelp(void)
"\n"
" Make curl transfer data no faster than 10 kilobytes per second:\n"
"\n"
+, stdout);
+ fputs(
" curl --limit-rate 10K www.far-away-site.com\n"
"\n"
" or\n"
"\n"
" curl --limit-rate 10240 www.far-away-site.com\n"
"\n"
-, stdout);
- fputs(
" Or prevent curl from uploading data faster than 1 megabyte per second:\n"
"\n"
" curl -T upload --limit-rate 1M ftp://uploadshereplease.com\n"
@@ -4535,24 +4637,24 @@ void hugehelp(void)
" When using the --limit-rate option, the transfer rate is regulated on a\n"
" per-second basis, which will cause the total transfer speed to become lower\n"
" than the given number. Sometimes of course substantially lower, if your\n"
+, stdout);
+ fputs(
" transfer stalls during periods.\n"
"\n"
"CONFIG FILE\n"
"\n"
" Curl automatically tries to read the .curlrc file (or _curlrc file on win32\n"
-, stdout);
- fputs(
" systems) from the user's home dir on startup.\n"
"\n"
" The config file could be made up with normal command line switches, but you\n"
" can also specify the long options without the dashes to make it more\n"
" readable. You can separate the options and the parameter with spaces, or\n"
" with = or :. Comments can be used within the file. If the first letter on a\n"
+, stdout);
+ fputs(
" line is a '#'-symbol the rest of the line is treated as a comment.\n"
"\n"
" If you want the parameter to contain spaces, you must enclose the entire\n"
-, stdout);
- fputs(
" parameter within double quotes (\"). Within those quotes, you specify a\n"
" quote as \\\".\n"
"\n"
@@ -4563,11 +4665,11 @@ void hugehelp(void)
" # We want a 30 minute timeout:\n"
" -m 1800\n"
" # ... and we use a proxy for all accesses:\n"
+, stdout);
+ fputs(
" proxy = proxy.our.domain.com:8080\n"
"\n"
" White spaces ARE significant at the end of lines, but all white spaces\n"
-, stdout);
- fputs(
" leading up to the first characters of each line are ignored.\n"
"\n"
" Prevent curl from reading the default file by using -q as the first command\n"
@@ -4579,11 +4681,11 @@ void hugehelp(void)
" without URL by making a config file similar to:\n"
"\n"
" # default url to get\n"
+, stdout);
+ fputs(
" url = \"http://help.with.curl.com/curlhelp.html\"\n"
"\n"
" You can specify another config file to be read by using the -K/--config\n"
-, stdout);
- fputs(
" flag. If you set config file name to \"-\" it'll read the config from stdin,\n"
" which can be handy if you want to hide options from being visible in process\n"
" tables etc:\n"
@@ -4593,11 +4695,11 @@ void hugehelp(void)
"EXTRA HEADERS\n"
"\n"
" When using curl in your own very special programs, you may end up needing\n"
+, stdout);
+ fputs(
" to pass on your own custom headers when getting a web page. You can do\n"
" this by using the -H flag.\n"
"\n"
-, stdout);
- fputs(
" Example, send the header \"X-you-and-me: yes\" to the server when getting a\n"
" page:\n"
"\n"
@@ -4606,11 +4708,11 @@ void hugehelp(void)
" This can also be useful in case you want curl to send a different text in a\n"
" header than it normally does. The -H header you specify then replaces the\n"
" header curl would normally send. If you replace an internal header with an\n"
+, stdout);
+ fputs(
" empty one, you prevent that header from being sent. To prevent the Host:\n"
" header from being used:\n"
"\n"
-, stdout);
- fputs(
" curl -H \"Host:\" www.server.com\n"
"\n"
"FTP and PATH NAMES\n"
@@ -4622,12 +4724,12 @@ void hugehelp(void)
" curl ftp://user:passwd@my.site.com/README\n"
"\n"
" But if you want the README file from the root directory of that very same\n"
+, stdout);
+ fputs(
" site, you need to specify the absolute file name:\n"
"\n"
" curl ftp://user:passwd@my.site.com//README\n"
"\n"
-, stdout);
- fputs(
" (I.e with an extra slash in front of the file name.)\n"
"\n"
"SFTP and SCP and PATH NAMES\n"
@@ -4640,9 +4742,9 @@ void hugehelp(void)
"\n"
"FTP and firewalls\n"
"\n"
-" The FTP protocol requires one of the involved parties to open a second\n"
, stdout);
fputs(
+" The FTP protocol requires one of the involved parties to open a second\n"
" connection as soon as data is about to get transferred. There are two ways to\n"
" do this.\n"
"\n"
@@ -4653,9 +4755,9 @@ void hugehelp(void)
"\n"
" curl ftp.download.com\n"
"\n"
-" If the server, for example, is behind a firewall that doesn't allow connections\n"
, stdout);
fputs(
+" If the server, for example, is behind a firewall that doesn't allow connections\n"
" on ports other than 21 (or if it just doesn't support the PASV command), the\n"
" other way to do it is to use the PORT command and instruct the server to\n"
" connect to the client on the given IP number and port (as parameters to the\n"
@@ -4663,10 +4765,10 @@ void hugehelp(void)
"\n"
" The -P flag to curl supports a few different options. Your machine may have\n"
" several IP-addresses and/or network interfaces and curl allows you to select\n"
-" which of them to use. Default address can also be used:\n"
-"\n"
, stdout);
fputs(
+" which of them to use. Default address can also be used:\n"
+"\n"
" curl -P - ftp.download.com\n"
"\n"
" Download with PORT but use the IP address of our 'le0' interface (this does\n"
@@ -4682,12 +4784,12 @@ void hugehelp(void)
"\n"
" Get a web page from a server using a specified port for the interface:\n"
"\n"
+, stdout);
+ fputs(
" curl --interface eth0:1 http://www.netscape.com/\n"
"\n"
" or\n"
"\n"
-, stdout);
- fputs(
" curl --interface 192.168.1.10 http://www.netscape.com/\n"
"\n"
"HTTPS\n"
@@ -4701,17 +4803,17 @@ void hugehelp(void)
" curl https://www.secure-site.com\n"
"\n"
" Curl is also capable of using your personal certificates to get/post files\n"
-" from sites that require valid certificates. The only drawback is that the\n"
, stdout);
fputs(
+" from sites that require valid certificates. The only drawback is that the\n"
" certificate needs to be in PEM-format. PEM is a standard and open format to\n"
" store certificates with, but it is not used by the most commonly used\n"
" browsers (Netscape and MSIE both use the so called PKCS#12 format). If you\n"
" want curl to use the certificates you use with your (favourite) browser, you\n"
" may need to download/compile a converter that can convert your browser's\n"
-" formatted certificates to PEM formatted ones. This kind of converter is\n"
, stdout);
fputs(
+" formatted certificates to PEM formatted ones. This kind of converter is\n"
" included in recent versions of OpenSSL, and for older versions Dr Stephen\n"
" N. Henson has written a patch for SSLeay that adds this functionality. You\n"
" can get his patch (that requires an SSLeay installation) from his site at:\n"
@@ -4720,10 +4822,10 @@ void hugehelp(void)
" Example on how to automatically retrieve a document using a certificate with\n"
" a personal password:\n"
"\n"
-" curl -E /path/to/cert.pem:password https://secure.site.com/\n"
-"\n"
, stdout);
fputs(
+" curl -E /path/to/cert.pem:password https://secure.site.com/\n"
+"\n"
" If you neglect to specify the password on the command line, you will be\n"
" prompted for the correct password before any data can be received.\n"
"\n"
@@ -4732,10 +4834,10 @@ void hugehelp(void)
" SSL-version curl should use. Use -3, -2 or -1 to specify that exact SSL\n"
" version to use (for SSLv3, SSLv2 or TLSv1 respectively):\n"
"\n"
-" curl -2 https://secure.site.com/\n"
-"\n"
, stdout);
fputs(
+" curl -2 https://secure.site.com/\n"
+"\n"
" Otherwise, curl will first attempt to use v3 and then v2.\n"
"\n"
" To use OpenSSL to convert your favourite browser's certificate into a PEM\n"
@@ -5147,7 +5249,6 @@ void hugehelp(void) {}
#else
/*
* NEVER EVER edit this manually, fix the mkhelp.pl script instead!
- * Generation time: Sun Aug 13 18:22:49 2017
*/
#ifdef USE_MANUAL
#include "tool_hugehelp.h"
@@ -5155,4673 +5256,4788 @@ void hugehelp(void) {}
#include "memdebug.h" /* keep this as LAST include */
static const unsigned char hugehelpgz[] = {
/* This mumbo-jumbo is the huge help text compressed with gzip.
- Thanks to this operation, the size of this data shrank from 190526
- to 55962 bytes. You can disable the use of compressed help
+ Thanks to this operation, the size of this data shrank from 194646
+ to 57342 bytes. You can disable the use of compressed help
texts by NOT passing -c to the mkhelp.pl tool. */
0x1f, 0x8b, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xfd,
- 0x7b, 0x7b, 0xdc, 0x46, 0x92, 0x25, 0x0e, 0xff, 0xcf, 0x4f, 0x81, 0xa9,
- 0x7e, 0x7b, 0x48, 0x4e, 0x57, 0x15, 0x2f, 0xba, 0xd8, 0x62, 0x4b, 0x1e,
- 0xd3, 0x14, 0x65, 0x73, 0x4c, 0x89, 0x5c, 0x16, 0x65, 0xbb, 0xd7, 0xf6,
- 0xa3, 0x07, 0x55, 0x05, 0x92, 0x68, 0x55, 0x01, 0xd5, 0x00, 0x8a, 0x14,
- 0x7b, 0x76, 0xf6, 0xb3, 0xbf, 0x19, 0x27, 0x22, 0x32, 0x13, 0xc8, 0xac,
- 0x22, 0xed, 0xb6, 0x7b, 0xe7, 0xf7, 0xec, 0xf6, 0xee, 0x58, 0x12, 0x09,
- 0x24, 0xf2, 0x1a, 0x19, 0x97, 0x13, 0x27, 0x92, 0xe4, 0xa1, 0xff, 0x7d,
- 0xc0, 0xff, 0x7d, 0x30, 0xff, 0x33, 0x7f, 0x6e, 0x24, 0xc9, 0x79, 0x55,
- 0xfe, 0x35, 0x9b, 0x34, 0xf1, 0x67, 0x3f, 0x7c, 0xf8, 0x5f, 0x09, 0xff,
- 0x3f, 0xf3, 0xce, 0x4f, 0xe6, 0xcf, 0x8d, 0xb5, 0x6d, 0xef, 0x24, 0xee,
- 0x85, 0xff, 0xf5, 0x61, 0x3b, 0x79, 0xe8, 0x85, 0xff, 0x95, 0x6c, 0xe1,
- 0x85, 0x0f, 0xf2, 0x85, 0x97, 0xf4, 0xf7, 0x0f, 0x1f, 0xd6, 0x7f, 0xe4,
- 0x27, 0xea, 0x15, 0xfd, 0x67, 0x87, 0xde, 0xfb, 0xe9, 0x03, 0xfd, 0xd5,
- 0xfc, 0x64, 0x63, 0xe3, 0xdd, 0xe1, 0xdb, 0x63, 0x7d, 0x75, 0xb2, 0xac,
- 0x66, 0xc9, 0x20, 0x69, 0xaa, 0xb4, 0xa8, 0xaf, 0xb2, 0x2a, 0x49, 0x93,
- 0xf7, 0x17, 0xa7, 0x1b, 0x1b, 0xa3, 0xbf, 0xbc, 0x3b, 0x3b, 0x1f, 0x9d,
- 0x8c, 0x5a, 0x8f, 0xfd, 0x58, 0x2e, 0x9a, 0xbc, 0x2c, 0xea, 0x9f, 0x93,
- 0x1f, 0xcd, 0x43, 0xc3, 0xe1, 0xf0, 0xe7, 0x8d, 0x8d, 0xd7, 0xc7, 0xa3,
- 0xa3, 0x8b, 0x93, 0xf3, 0xcb, 0x93, 0xb3, 0x77, 0xad, 0x67, 0x93, 0xbc,
- 0x4e, 0x4c, 0x63, 0x4d, 0x59, 0xce, 0xcc, 0x7f, 0x5c, 0xfb, 0xd3, 0xb4,
- 0x49, 0x93, 0xab, 0xaa, 0x9c, 0x27, 0x65, 0x45, 0xbf, 0x48, 0x93, 0x3a,
- 0xab, 0x6e, 0xb3, 0xaa, 0x9f, 0x2c, 0xeb, 0xbc, 0xb8, 0x4e, 0xca, 0x22,
- 0x4b, 0xca, 0xab, 0xa4, 0xb9, 0xc9, 0xb4, 0xb9, 0x7a, 0xb9, 0x58, 0x94,
- 0x55, 0x93, 0x4d, 0x93, 0x45, 0x55, 0x36, 0xe5, 0xa4, 0x9c, 0xd5, 0xc9,
- 0xd6, 0xeb, 0x93, 0xa3, 0xcb, 0x7e, 0xf2, 0xe6, 0xe4, 0xf4, 0xd8, 0xfc,
- 0xf7, 0xf2, 0x1c, 0xff, 0x19, 0xf5, 0x93, 0xaf, 0xcf, 0xce, 0xbf, 0x39,
- 0xbe, 0xe8, 0x27, 0xdf, 0x5c, 0xd2, 0xcf, 0xe8, 0xbf, 0xe6, 0x87, 0xc9,
- 0xc9, 0xdb, 0xc3, 0xf3, 0xbe, 0x36, 0x47, 0xff, 0xa0, 0x1f, 0x9e, 0xbe,
- 0x36, 0x3f, 0xe4, 0x3f, 0xe8, 0x9f, 0xe7, 0x67, 0xe7, 0x4f, 0xe4, 0x0f,
- 0xfa, 0xe7, 0xc5, 0xe5, 0x5b, 0xf3, 0xdb, 0x8b, 0xcb, 0x91, 0xf9, 0xef,
- 0xe8, 0x88, 0xfe, 0x83, 0xaf, 0x8c, 0xde, 0x7e, 0x85, 0xff, 0x8c, 0x6c,
- 0x73, 0xa3, 0xb7, 0xfc, 0x73, 0x7c, 0xe9, 0xf2, 0xf8, 0xf4, 0xdd, 0xf1,
- 0x65, 0x92, 0x16, 0xd3, 0xe4, 0xd2, 0x3c, 0xbf, 0x3d, 0x4c, 0x2e, 0x6f,
- 0xb2, 0x64, 0x52, 0xce, 0xe7, 0xf4, 0x23, 0x33, 0x23, 0xd3, 0xac, 0xce,
- 0xaf, 0x0b, 0x33, 0x14, 0x33, 0xf2, 0xbb, 0xb2, 0xfa, 0x98, 0x24, 0x77,
- 0x79, 0x73, 0x53, 0x2e, 0x1b, 0x6d, 0x6e, 0x69, 0x66, 0x23, 0xc9, 0x8b,
- 0x26, 0xab, 0xd2, 0x09, 0xcd, 0xf5, 0x70, 0xa3, 0x35, 0xab, 0xe5, 0x95,
- 0x99, 0xc3, 0xda, 0x4c, 0xda, 0x78, 0x59, 0xcf, 0xca, 0x74, 0x4a, 0x53,
- 0x65, 0x5e, 0xb9, 0x5a, 0x9a, 0x49, 0xae, 0xf2, 0xc9, 0xc7, 0x3a, 0x99,
- 0xe5, 0x1f, 0x33, 0x9a, 0xa8, 0x4f, 0xf7, 0x3a, 0x71, 0x7d, 0x6e, 0x34,
- 0x5d, 0x9a, 0x39, 0x2d, 0x06, 0xda, 0x5c, 0x93, 0x4f, 0x52, 0xfa, 0x00,
- 0x66, 0x2e, 0x59, 0x2e, 0xa8, 0x35, 0x9e, 0xb1, 0x64, 0x51, 0xd6, 0xe6,
- 0xa5, 0xd1, 0xe8, 0xd4, 0xf4, 0xbc, 0x28, 0x32, 0xf4, 0xa3, 0xee, 0x9b,
- 0x7f, 0x94, 0x1f, 0xf3, 0xcc, 0xfc, 0xe5, 0x2a, 0x9f, 0x65, 0x09, 0xaf,
- 0xa8, 0x6d, 0x8e, 0x96, 0x36, 0xa9, 0xb2, 0x7a, 0x39, 0xcf, 0xcc, 0xec,
- 0xbd, 0xcd, 0x9a, 0x74, 0x96, 0x17, 0x1f, 0xcd, 0x5f, 0x69, 0xe0, 0xf3,
- 0xb2, 0xca, 0x86, 0xc9, 0x61, 0x9d, 0xdc, 0x97, 0x4b, 0x33, 0xe0, 0xd9,
- 0xcc, 0xac, 0x79, 0x96, 0x8c, 0xb3, 0x59, 0x79, 0xd7, 0xa7, 0x95, 0x4e,
- 0x8a, 0xe5, 0x7c, 0x6c, 0x1a, 0x28, 0xaf, 0x5c, 0x73, 0x69, 0xb3, 0x34,
- 0xcd, 0xf1, 0xd3, 0xf3, 0xd4, 0x8c, 0xc9, 0xbc, 0x5b, 0x25, 0x37, 0x99,
- 0x19, 0x73, 0xbd, 0xc8, 0x8b, 0x7f, 0x69, 0xcf, 0x8b, 0x99, 0xda, 0x45,
- 0x79, 0x97, 0x55, 0x66, 0x66, 0xc7, 0xf7, 0x89, 0x99, 0x84, 0x31, 0x6f,
- 0xc2, 0x2b, 0xb3, 0xc9, 0x92, 0xd4, 0x34, 0x61, 0x37, 0xe0, 0xa0, 0xca,
- 0x66, 0x29, 0x6d, 0x26, 0xfb, 0x8d, 0xa1, 0x59, 0xc4, 0xcc, 0xee, 0x36,
- 0x79, 0x75, 0xeb, 0xc9, 0x36, 0x5e, 0x9e, 0x9a, 0x91, 0xe4, 0xb3, 0xda,
- 0x2c, 0x03, 0x1d, 0x0b, 0x79, 0x86, 0x16, 0x95, 0x8e, 0x89, 0xd9, 0x9b,
- 0xf7, 0x45, 0x93, 0x7e, 0xc2, 0xe7, 0x65, 0x6f, 0x0e, 0xa6, 0xd9, 0x22,
- 0x2b, 0xa6, 0x59, 0xd1, 0x0c, 0x93, 0xbf, 0x94, 0xcb, 0x4d, 0xf3, 0xed,
- 0xab, 0xdc, 0xcc, 0x41, 0x2a, 0x4d, 0x99, 0x2f, 0x9b, 0x4d, 0x30, 0xa9,
- 0xf2, 0x85, 0xb7, 0x14, 0x65, 0x61, 0xd6, 0x3c, 0xb9, 0x78, 0x73, 0x94,
- 0x3c, 0x79, 0xf1, 0xf9, 0x73, 0xb7, 0xe6, 0xa6, 0x81, 0x64, 0x92, 0x16,
- 0x66, 0xc4, 0xd9, 0x24, 0xbf, 0xba, 0x4f, 0xe6, 0xcb, 0x59, 0x93, 0x2f,
- 0xcc, 0xec, 0x9b, 0x8f, 0xd7, 0x74, 0x80, 0x16, 0x69, 0xd5, 0xd4, 0xb4,
- 0x09, 0xf0, 0x03, 0x8c, 0xfd, 0xae, 0xca, 0x1b, 0x3a, 0x48, 0xf8, 0x9d,
- 0xe9, 0x61, 0xd6, 0xd4, 0xda, 0x1c, 0xed, 0x35, 0xf3, 0x9d, 0xb1, 0xd9,
- 0x5b, 0x66, 0x6a, 0xd3, 0xda, 0x7c, 0xf4, 0x60, 0xc3, 0xc9, 0x90, 0x9b,
- 0xa6, 0x59, 0x1c, 0xec, 0xec, 0xd4, 0x79, 0x93, 0x0d, 0xff, 0xd3, 0x9c,
- 0xc3, 0x7e, 0x73, 0x57, 0xf6, 0x9b, 0x9b, 0x2a, 0xcb, 0xfe, 0x6b, 0x68,
- 0xf6, 0xb0, 0x7d, 0xd2, 0x7c, 0xf7, 0x5e, 0x3a, 0x76, 0x9d, 0x35, 0xe6,
- 0x0b, 0x7f, 0x5b, 0x66, 0x05, 0xb5, 0x68, 0xfa, 0x91, 0xce, 0x16, 0x37,
- 0xa9, 0x59, 0xce, 0xcc, 0xec, 0x46, 0x3a, 0xd9, 0x66, 0xc3, 0x50, 0xaf,
- 0xf8, 0x6c, 0xff, 0xf8, 0x73, 0xf8, 0xd1, 0x2b, 0x7c, 0xd3, 0xfc, 0x77,
- 0x98, 0x7d, 0x4a, 0xe7, 0x66, 0x6c, 0xf4, 0xa9, 0x1d, 0xda, 0x62, 0x3f,
- 0xee, 0x0d, 0xf6, 0x76, 0x77, 0x7f, 0x1e, 0x36, 0x9f, 0x9a, 0xc7, 0x3d,
- 0xbf, 0xbb, 0xeb, 0xde, 0xa0, 0x47, 0xb7, 0x68, 0xbc, 0xc9, 0xcc, 0x6c,
- 0x19, 0xfa, 0xf8, 0xdf, 0xb3, 0xaa, 0xac, 0xb7, 0x1f, 0xd7, 0x52, 0x3a,
- 0xf8, 0x7b, 0xfb, 0xbb, 0xef, 0xb2, 0x1a, 0x7b, 0xc6, 0x8d, 0x35, 0x49,
- 0x2b, 0xb3, 0x6f, 0xcb, 0xc6, 0x89, 0xa7, 0xbe, 0x39, 0x94, 0x8d, 0x9d,
- 0x19, 0x73, 0xe6, 0xcc, 0xd3, 0x46, 0xb0, 0xa5, 0x33, 0x92, 0x69, 0x75,
- 0x52, 0x64, 0x9f, 0xec, 0x29, 0x37, 0xa7, 0x3f, 0x4b, 0x27, 0x37, 0x49,
- 0x69, 0x36, 0x7f, 0x15, 0x59, 0x02, 0xbf, 0x43, 0x69, 0x35, 0xb9, 0xc9,
- 0x6f, 0xcd, 0x6c, 0xbc, 0x78, 0xf1, 0x7c, 0x60, 0xfe, 0xf3, 0xe2, 0xe7,
- 0x9d, 0xdb, 0x72, 0x66, 0x26, 0xe7, 0xe9, 0xcf, 0x3b, 0xb4, 0xc4, 0xff,
- 0x99, 0xf6, 0xc7, 0xfd, 0xc9, 0x7f, 0x0d, 0x6f, 0x9a, 0xf9, 0x6c, 0xe5,
- 0xc6, 0x49, 0x0b, 0xf3, 0x7f, 0xf3, 0x72, 0x59, 0x34, 0x76, 0xb3, 0x98,
- 0x3d, 0xd7, 0x78, 0xc2, 0xc9, 0x1c, 0x57, 0x73, 0x46, 0x69, 0x6b, 0xd3,
- 0x1e, 0xa2, 0x53, 0x67, 0x0e, 0xa8, 0x3b, 0x8e, 0xcd, 0xe4, 0xc6, 0x8c,
- 0xdf, 0x6c, 0x9e, 0x54, 0xe6, 0xa0, 0xc9, 0x53, 0x3a, 0x98, 0x46, 0x3e,
- 0x90, 0xbc, 0x42, 0x53, 0xfc, 0xb1, 0xdc, 0x3c, 0x57, 0x56, 0xd3, 0xac,
- 0x6a, 0x6f, 0x63, 0x74, 0xc7, 0xf5, 0x27, 0x31, 0xf3, 0xb9, 0x30, 0x1f,
- 0x5f, 0x92, 0xa8, 0xc3, 0x49, 0xa3, 0x16, 0xcc, 0x19, 0xbd, 0x36, 0x53,
- 0x65, 0xa6, 0x87, 0x36, 0x16, 0xcd, 0xde, 0x7d, 0xf2, 0xce, 0xac, 0x21,
- 0xcb, 0x07, 0x6f, 0xff, 0xcd, 0xb2, 0xa6, 0x79, 0x70, 0xe6, 0xdc, 0x26,
- 0x3a, 0xd8, 0x0b, 0xf6, 0xd1, 0xaa, 0xe7, 0xcd, 0xd2, 0x1f, 0xec, 0xb7,
- 0x1f, 0xfe, 0xde, 0xc8, 0x4d, 0xb7, 0x83, 0xcd, 0xd7, 0xff, 0xf3, 0xbf,
- 0xbc, 0x8d, 0x70, 0x47, 0xbf, 0xcd, 0x8b, 0xdb, 0xf2, 0xa3, 0x19, 0x38,
- 0x2e, 0xb6, 0xb4, 0x35, 0xa9, 0x09, 0x89, 0x86, 0xf9, 0xa2, 0xb1, 0x37,
- 0x06, 0xed, 0x10, 0xf3, 0xa3, 0x71, 0x3a, 0x9e, 0xdd, 0x27, 0x37, 0xe9,
- 0x6d, 0x46, 0xe3, 0x5d, 0x98, 0xad, 0x43, 0x33, 0x60, 0x24, 0xf9, 0x0c,
- 0xa2, 0x45, 0xce, 0xea, 0xb4, 0x5c, 0x8e, 0xcd, 0x79, 0xff, 0xdb, 0xb2,
- 0x6c, 0x78, 0x62, 0xd2, 0xdb, 0x32, 0x9f, 0xb6, 0xae, 0xc7, 0x9b, 0x8c,
- 0x64, 0x0c, 0x7d, 0x18, 0xf7, 0x86, 0x91, 0x71, 0xd4, 0x53, 0xec, 0xfd,
- 0xbc, 0xa1, 0x1b, 0xc8, 0x48, 0xa7, 0x74, 0x56, 0x97, 0x49, 0x72, 0x5d,
- 0xd2, 0xc6, 0x85, 0x4c, 0xc4, 0xce, 0x33, 0x8b, 0x72, 0x93, 0xd2, 0x45,
- 0x63, 0xee, 0x14, 0xbb, 0x35, 0xab, 0x0c, 0xe2, 0x11, 0x2b, 0x95, 0xce,
- 0xfa, 0x7c, 0xa1, 0xd0, 0x3b, 0x32, 0x55, 0xc9, 0xe6, 0xbf, 0x6e, 0xf6,
- 0x93, 0xcd, 0x7f, 0xdf, 0x84, 0x68, 0xdf, 0xfc, 0xb7, 0x4d, 0xb7, 0xce,
- 0x46, 0x43, 0xba, 0xcd, 0xa7, 0x74, 0x37, 0x98, 0x91, 0x9c, 0x9c, 0xdf,
- 0x3e, 0x4f, 0xfe, 0x4e, 0xd7, 0xb9, 0x11, 0x7f, 0xd9, 0x27, 0xdd, 0x24,
- 0x3a, 0x36, 0xf3, 0x76, 0x62, 0xe4, 0x60, 0xba, 0xa0, 0x7b, 0x3d, 0xab,
- 0x26, 0x66, 0x47, 0xa5, 0xd7, 0x66, 0x0f, 0x99, 0xeb, 0x51, 0x9b, 0xa3,
- 0xf6, 0xe9, 0x15, 0x1e, 0x96, 0x91, 0x59, 0x49, 0x91, 0xce, 0xcd, 0x26,
- 0x3d, 0xa5, 0x1e, 0xe5, 0x45, 0xb8, 0x98, 0x3f, 0x5e, 0x65, 0x9f, 0xef,
- 0x1e, 0x1c, 0x3c, 0xf9, 0xe3, 0xfe, 0xb3, 0xac, 0xb9, 0xd9, 0xfd, 0x79,
- 0xc7, 0x3e, 0x72, 0x72, 0x85, 0x69, 0xd7, 0xed, 0xa7, 0x9d, 0x30, 0x17,
- 0xaf, 0x15, 0xdc, 0xe6, 0x7d, 0xf3, 0xf7, 0xec, 0x2a, 0xff, 0xd4, 0x57,
- 0x15, 0x86, 0x8f, 0x41, 0x6a, 0xb6, 0x9a, 0x59, 0x3f, 0x3a, 0xb5, 0xda,
- 0xdc, 0xf5, 0x32, 0xab, 0xcd, 0x4c, 0xde, 0xdd, 0xa4, 0x4d, 0x62, 0x1b,
- 0xe0, 0x95, 0x9d, 0xe7, 0xd7, 0x37, 0x4d, 0x72, 0x97, 0x92, 0xfc, 0x3f,
- 0x69, 0xb8, 0x09, 0xba, 0x78, 0x8d, 0xd4, 0xbf, 0x4a, 0x8d, 0xf8, 0xa6,
- 0x35, 0xc4, 0x2d, 0x3b, 0x76, 0x97, 0x7e, 0x63, 0xb6, 0x39, 0x2f, 0x88,
- 0xd3, 0x70, 0xc6, 0x69, 0x4d, 0x07, 0xa9, 0x30, 0xe7, 0xb5, 0x31, 0xd7,
- 0xf6, 0x92, 0xfe, 0x75, 0x63, 0x2e, 0x66, 0xcc, 0x81, 0x74, 0x14, 0x77,
- 0xd7, 0x1b, 0x5a, 0x4e, 0x5a, 0x1b, 0x7b, 0x9f, 0x98, 0x45, 0xea, 0xcb,
- 0x32, 0xdb, 0x37, 0x6a, 0x73, 0xe0, 0x8c, 0xb0, 0xb0, 0x3b, 0xa3, 0x47,
- 0x72, 0xaf, 0xc7, 0xe3, 0x44, 0x1f, 0xd3, 0x9a, 0xee, 0x6e, 0xbe, 0xa1,
- 0x4d, 0xe7, 0xbd, 0xc1, 0x9a, 0x49, 0x4b, 0x3f, 0x92, 0x96, 0xd0, 0xd1,
- 0x45, 0xf0, 0xda, 0xb4, 0x34, 0x9b, 0xcc, 0xf4, 0xd6, 0xc8, 0x47, 0x1a,
- 0x19, 0x49, 0x3d, 0xcc, 0x0a, 0x36, 0xb9, 0x69, 0x93, 0x7e, 0x98, 0x37,
- 0x24, 0xf6, 0xa1, 0x58, 0x9a, 0xfe, 0x9a, 0x49, 0x81, 0x6e, 0x68, 0x64,
- 0xa7, 0x37, 0x7e, 0xdc, 0x58, 0xe6, 0xd9, 0xe4, 0xd6, 0x28, 0x0e, 0x46,
- 0x47, 0xcc, 0xec, 0x5b, 0xb8, 0x62, 0x27, 0xa4, 0xae, 0xcc, 0xcc, 0x79,
- 0x99, 0x94, 0x55, 0x45, 0x4a, 0x38, 0xad, 0xe0, 0x98, 0xe5, 0xda, 0x3c,
- 0x33, 0x37, 0xbb, 0x3f, 0x9d, 0x39, 0xdd, 0x31, 0x46, 0xbe, 0x18, 0x55,
- 0x01, 0x12, 0xc4, 0x5c, 0xe9, 0x10, 0xc3, 0x18, 0x38, 0x7a, 0x47, 0x6d,
- 0x4f, 0x26, 0xd9, 0xa2, 0xa9, 0x63, 0x63, 0xd2, 0x05, 0x37, 0xdd, 0xa9,
- 0x32, 0x9a, 0x79, 0x5f, 0x0f, 0xc2, 0xbc, 0xda, 0x7b, 0x18, 0xaa, 0x90,
- 0xaa, 0x16, 0x46, 0x35, 0xaa, 0xed, 0xac, 0x35, 0xd8, 0x1b, 0x46, 0x8c,
- 0x61, 0xce, 0xe7, 0xd4, 0x51, 0x7a, 0xb8, 0xe6, 0x93, 0x0a, 0x71, 0x49,
- 0x0b, 0xc9, 0xca, 0x2f, 0x7f, 0x97, 0x6e, 0x13, 0x33, 0x9f, 0xb6, 0x71,
- 0xf3, 0x55, 0xbb, 0xa6, 0xf4, 0xf9, 0xda, 0x98, 0x0d, 0xe6, 0x72, 0x9d,
- 0xd6, 0x37, 0x46, 0x1f, 0xaa, 0xe5, 0x64, 0xe7, 0x73, 0xb3, 0x67, 0x6e,
- 0x69, 0x7d, 0x17, 0x59, 0x36, 0x1d, 0x26, 0x67, 0x57, 0x24, 0x55, 0x2b,
- 0xd3, 0xe9, 0x06, 0xbf, 0x26, 0x41, 0x6f, 0xe6, 0x6d, 0x0a, 0xbd, 0xda,
- 0x1e, 0x2d, 0xee, 0x8a, 0x27, 0xb1, 0x69, 0xa7, 0x99, 0xc9, 0x4e, 0x48,
- 0xca, 0xcd, 0xda, 0xb7, 0x02, 0xce, 0xa1, 0x91, 0xde, 0xd4, 0xbd, 0x71,
- 0x96, 0x60, 0x27, 0x8e, 0xb3, 0xe6, 0x2e, 0xcb, 0x6c, 0x73, 0x75, 0x66,
- 0x6e, 0x22, 0x5a, 0x34, 0x56, 0xc6, 0x20, 0x0c, 0x69, 0x6a, 0xcf, 0x2f,
- 0xce, 0xbe, 0xbe, 0x38, 0x1e, 0x8d, 0x92, 0xb7, 0xc7, 0x97, 0xc7, 0x17,
- 0xad, 0x99, 0x2e, 0xca, 0x6a, 0x8e, 0x15, 0x9d, 0xe6, 0xf5, 0x62, 0x96,
- 0xde, 0xd3, 0x52, 0x9b, 0x91, 0x5c, 0x57, 0x74, 0xb2, 0xe6, 0x19, 0xdd,
- 0x0a, 0xd3, 0x25, 0x24, 0x59, 0x52, 0x1a, 0xf9, 0x90, 0x8a, 0x12, 0x4a,
- 0xc2, 0x04, 0x9a, 0x6b, 0x71, 0xed, 0x66, 0xda, 0x48, 0x1c, 0xb9, 0xdc,
- 0xe8, 0x76, 0xb3, 0xeb, 0x41, 0xda, 0x20, 0xec, 0x8d, 0xbe, 0xfb, 0x19,
- 0x4f, 0x53, 0x8d, 0x31, 0x99, 0x3d, 0x9b, 0xcf, 0x21, 0xec, 0xcc, 0x9f,
- 0x4e, 0x01, 0xcc, 0xae, 0x8c, 0xf6, 0x6b, 0x2e, 0x3c, 0x56, 0xde, 0xbb,
- 0x7d, 0xd2, 0xde, 0x5a, 0x95, 0xd5, 0x6c, 0x43, 0x12, 0xcd, 0xd4, 0x20,
- 0x77, 0x85, 0xbf, 0x60, 0x85, 0x98, 0x51, 0x13, 0x48, 0xf6, 0xc9, 0x63,
- 0x0b, 0xea, 0x42, 0x66, 0x56, 0x76, 0xca, 0xcd, 0xd7, 0xcb, 0x2b, 0x1c,
- 0xe4, 0x64, 0xcb, 0x28, 0xcb, 0x6f, 0x8d, 0x01, 0x63, 0x8c, 0x88, 0x7e,
- 0x72, 0xbe, 0x8d, 0xf7, 0xf6, 0x76, 0xf7, 0x9f, 0xb2, 0x20, 0x18, 0x6a,
- 0x73, 0x6f, 0x3c, 0x41, 0xbc, 0xf7, 0x91, 0x96, 0x97, 0x1f, 0xa2, 0xc6,
- 0x87, 0xc9, 0xde, 0x5b, 0xfe, 0xc9, 0xd3, 0xcf, 0x9f, 0x7d, 0xf6, 0x5c,
- 0x7e, 0xd8, 0xde, 0xe0, 0xb6, 0xff, 0xd8, 0x1d, 0x30, 0xc6, 0xc8, 0x3a,
- 0x33, 0x3d, 0x31, 0xa3, 0x9b, 0xe7, 0x85, 0x39, 0x26, 0xe6, 0x58, 0x89,
- 0xac, 0xa2, 0xfd, 0x6c, 0x3a, 0x7f, 0xc5, 0x92, 0x4d, 0xd6, 0xb5, 0x6d,
- 0xe5, 0x99, 0x97, 0xcd, 0x96, 0x35, 0xb2, 0xdc, 0x2e, 0x12, 0x66, 0xc2,
- 0x1c, 0x30, 0xba, 0x75, 0xc6, 0x24, 0x60, 0xc9, 0xd4, 0x31, 0x3a, 0x69,
- 0x16, 0xfd, 0x9a, 0xbd, 0x15, 0xcd, 0x1b, 0xa6, 0x6f, 0xe6, 0x4e, 0xa4,
- 0x6b, 0x2e, 0x9c, 0x77, 0x23, 0x0a, 0x20, 0x21, 0xef, 0xf2, 0x1a, 0xa2,
- 0xe1, 0xae, 0x5c, 0xce, 0x8c, 0x61, 0x41, 0x0f, 0x2c, 0x17, 0x78, 0xc1,
- 0x7c, 0x6a, 0xe1, 0x64, 0xc0, 0x3c, 0xff, 0x44, 0x7b, 0xa7, 0xdb, 0x8a,
- 0xe9, 0x9a, 0xf9, 0xe7, 0xc2, 0x6c, 0x25, 0xee, 0xce, 0xb0, 0x7b, 0x43,
- 0x40, 0xf6, 0x05, 0x3b, 0x91, 0xce, 0x3c, 0x84, 0xf6, 0xf9, 0xd9, 0xe8,
- 0x92, 0x34, 0x80, 0xf3, 0xf7, 0x97, 0xa6, 0x21, 0xa3, 0x02, 0xd4, 0x8d,
- 0xd9, 0x94, 0xf4, 0x62, 0x91, 0xc1, 0xaa, 0xd3, 0xe6, 0xcc, 0xde, 0xcb,
- 0x21, 0xa8, 0xa0, 0xd6, 0xe8, 0x27, 0xb9, 0x8f, 0x6c, 0xf6, 0xd2, 0x11,
- 0x54, 0xa3, 0x97, 0xef, 0x70, 0xfb, 0x4e, 0xb2, 0xf5, 0xc5, 0xb6, 0xd9,
- 0xb3, 0x83, 0xd2, 0xce, 0xce, 0x60, 0x20, 0xaf, 0x9a, 0x6f, 0xd7, 0xf9,
- 0x3c, 0x9f, 0xa5, 0x9e, 0x7a, 0x25, 0x12, 0x95, 0xce, 0xa7, 0x95, 0x2b,
- 0x13, 0xb3, 0x6b, 0xd0, 0x6d, 0x67, 0xdd, 0xd1, 0x1c, 0x42, 0x2a, 0xb9,
- 0xa5, 0x9a, 0x92, 0x42, 0x00, 0x25, 0x76, 0x91, 0xdb, 0xa9, 0xa3, 0x35,
- 0x23, 0x71, 0xd5, 0x9a, 0xa8, 0xee, 0xba, 0x05, 0x13, 0x47, 0x37, 0x12,
- 0xdc, 0x07, 0x76, 0xea, 0x92, 0xde, 0x38, 0xad, 0x7a, 0x89, 0x95, 0xc5,
- 0x7c, 0x36, 0xe9, 0x84, 0x54, 0xd9, 0xf5, 0xd2, 0x8c, 0x20, 0xe1, 0xd9,
- 0xa5, 0x91, 0xfe, 0xc1, 0x1b, 0xa9, 0x36, 0x30, 0x18, 0xd3, 0x23, 0x79,
- 0xcd, 0x96, 0xdf, 0x95, 0x31, 0x25, 0xe8, 0xd0, 0xa8, 0x66, 0x0b, 0x8d,
- 0x46, 0x76, 0x4c, 0x64, 0xc3, 0xd8, 0x5d, 0x5a, 0xd2, 0x51, 0x69, 0x32,
- 0x23, 0x68, 0x20, 0xfe, 0xe9, 0xc9, 0x81, 0x59, 0xb2, 0xc1, 0xa0, 0x36,
- 0xf3, 0x4f, 0xea, 0xf0, 0x42, 0xcc, 0xec, 0x33, 0xf8, 0x30, 0xac, 0xc3,
- 0xe3, 0x8c, 0x5d, 0x1d, 0x7c, 0x6d, 0xf2, 0xbb, 0x10, 0xa1, 0x46, 0x51,
- 0xbd, 0x33, 0x1f, 0x4e, 0xcd, 0x92, 0x99, 0x03, 0xf7, 0x96, 0x26, 0x8a,
- 0xdd, 0x15, 0x89, 0x34, 0x55, 0x27, 0xd8, 0x19, 0x39, 0x9d, 0xfb, 0xd4,
- 0xe9, 0x32, 0xd3, 0x69, 0x4e, 0xbf, 0x35, 0xe7, 0xcb, 0xdc, 0x70, 0xcb,
- 0x0c, 0xe6, 0x80, 0x4c, 0xea, 0xdc, 0x4d, 0x26, 0x2c, 0xcb, 0xfa, 0xa6,
- 0x24, 0xcb, 0xad, 0xc7, 0xb2, 0x78, 0x40, 0xdf, 0xea, 0xe1, 0x3e, 0x9f,
- 0x27, 0xfa, 0x2d, 0xf9, 0x94, 0x19, 0xc7, 0xd4, 0xd7, 0xcd, 0xfa, 0xe6,
- 0xa2, 0xb9, 0xf7, 0xf4, 0x76, 0xc8, 0x6a, 0xee, 0x7b, 0x65, 0x15, 0x1e,
- 0x73, 0xa5, 0x2e, 0x48, 0x99, 0x12, 0x19, 0x8e, 0xcb, 0x10, 0x47, 0xb6,
- 0xe6, 0xae, 0xf5, 0xcd, 0xdc, 0xd2, 0x93, 0xd7, 0x37, 0xfa, 0xa8, 0x77,
- 0xb1, 0xa6, 0x66, 0x70, 0x74, 0x39, 0x90, 0x89, 0x3b, 0x55, 0xb9, 0x5f,
- 0x56, 0x2c, 0xcc, 0x66, 0xa5, 0xd9, 0xcb, 0x3d, 0x56, 0x59, 0xa5, 0xdb,
- 0xd4, 0x6b, 0xea, 0x25, 0xcd, 0x38, 0xbb, 0x7e, 0x4a, 0xbb, 0x36, 0xb6,
- 0xd3, 0x32, 0x5f, 0xf5, 0x83, 0x5d, 0x73, 0x13, 0x35, 0xc2, 0x1c, 0x99,
- 0xab, 0xb3, 0xa6, 0x7d, 0xac, 0x33, 0x8f, 0xed, 0x6d, 0xae, 0xba, 0xcd,
- 0x86, 0xcf, 0x23, 0xcc, 0x9e, 0xce, 0xcc, 0xd7, 0xd8, 0x3e, 0x72, 0x91,
- 0xd9, 0x91, 0x99, 0x11, 0x4d, 0xf3, 0x14, 0xfb, 0x84, 0x97, 0x06, 0xca,
- 0x88, 0x33, 0xd2, 0x22, 0x7a, 0xf0, 0x7d, 0xd7, 0xc6, 0x9a, 0xcd, 0xfc,
- 0x2b, 0x49, 0xfb, 0x34, 0x38, 0x33, 0x63, 0x3f, 0xc5, 0x38, 0x06, 0xb7,
- 0x09, 0x1d, 0x3f, 0x63, 0x36, 0xd0, 0x59, 0x1c, 0x9c, 0x9d, 0xde, 0x7a,
- 0xc7, 0x88, 0x8c, 0xe9, 0x82, 0xf4, 0x94, 0x3e, 0x1c, 0x16, 0xe3, 0xb2,
- 0x34, 0x96, 0xab, 0x1b, 0x1a, 0xdd, 0x07, 0x59, 0x41, 0xbb, 0x5d, 0x56,
- 0xd4, 0x88, 0x84, 0x85, 0x95, 0xb7, 0xf7, 0xc6, 0x5c, 0x4a, 0xaf, 0xd3,
- 0xdc, 0xee, 0x37, 0x39, 0x19, 0xd3, 0x44, 0x1f, 0x2e, 0x4a, 0x79, 0x9e,
- 0x96, 0x8a, 0x54, 0x20, 0x91, 0x5b, 0xcb, 0x9a, 0x8f, 0x8f, 0x19, 0x95,
- 0x91, 0x3c, 0x90, 0x1d, 0xd2, 0x2e, 0xa9, 0x8d, 0xda, 0xdc, 0x18, 0x8a,
- 0x32, 0xe9, 0x9c, 0x10, 0xbe, 0xd0, 0x20, 0x4d, 0x8b, 0xbd, 0x61, 0xf2,
- 0x4d, 0x79, 0x97, 0xc1, 0x7d, 0x07, 0xfd, 0x3e, 0x27, 0x07, 0x94, 0x51,
- 0x05, 0xef, 0xb2, 0x64, 0x6e, 0x54, 0x4f, 0x33, 0x9b, 0xd0, 0x3e, 0xf0,
- 0x33, 0xd3, 0x4f, 0x67, 0xb3, 0x94, 0x77, 0x3c, 0x4b, 0x76, 0x14, 0x76,
- 0x29, 0xaf, 0xf8, 0x48, 0x24, 0x5b, 0x50, 0x6f, 0x26, 0x34, 0x5b, 0x8b,
- 0xc6, 0x8d, 0xc2, 0x4e, 0xc8, 0x5d, 0x5a, 0x7b, 0x87, 0x8b, 0x8d, 0xd3,
- 0xe4, 0xb3, 0xe1, 0xde, 0x8b, 0xe1, 0xee, 0x90, 0x4c, 0x91, 0xec, 0x36,
- 0x2f, 0x97, 0x35, 0xad, 0x27, 0xf5, 0xc4, 0x3b, 0x9d, 0xe4, 0x26, 0xa2,
- 0xe5, 0xbd, 0xbe, 0x9e, 0xb1, 0xe2, 0xb3, 0x53, 0x5e, 0x5d, 0x25, 0x9e,
- 0x72, 0x54, 0x65, 0x0b, 0xb6, 0x81, 0x68, 0x6e, 0xe4, 0xc0, 0xb1, 0x50,
- 0xf5, 0xb5, 0x22, 0x99, 0x4d, 0xe7, 0x51, 0x18, 0x0c, 0xd2, 0x71, 0xdd,
- 0x90, 0x39, 0x35, 0x58, 0x16, 0xf9, 0xa7, 0x41, 0x5d, 0x4e, 0x3e, 0x9a,
- 0x65, 0x79, 0xb9, 0x48, 0x9b, 0x9b, 0x2f, 0x3a, 0x9e, 0xda, 0x2d, 0xba,
- 0x4d, 0xb6, 0x93, 0xe4, 0x88, 0x15, 0x4b, 0x9a, 0x8b, 0x8a, 0x4f, 0x9c,
- 0x59, 0x4f, 0x69, 0x25, 0x79, 0x6f, 0x5a, 0x31, 0xbb, 0x79, 0x6e, 0x96,
- 0x35, 0xe1, 0xc6, 0xfa, 0x2a, 0x4c, 0x3b, 0xcd, 0xc1, 0x0b, 0x48, 0x17,
- 0x09, 0x9c, 0x69, 0xe6, 0xf0, 0x94, 0xd5, 0xc7, 0x21, 0xb9, 0x2d, 0x8c,
- 0xd5, 0x78, 0x40, 0x1b, 0xba, 0x31, 0x62, 0xac, 0xe1, 0x79, 0xaf, 0x45,
- 0x08, 0x53, 0xb7, 0x58, 0x26, 0x3b, 0x29, 0xa5, 0xf3, 0xa9, 0x3d, 0x90,
- 0xcf, 0x26, 0x6a, 0x6f, 0xc8, 0xd6, 0xdb, 0xfc, 0xd2, 0x58, 0x80, 0x37,
- 0xbc, 0xf0, 0x68, 0x8c, 0xc7, 0x68, 0xf6, 0xe8, 0xb5, 0xb1, 0x21, 0x8a,
- 0xa6, 0xd3, 0x9c, 0xf9, 0x2a, 0x5d, 0xd6, 0x74, 0xcf, 0xb0, 0xb9, 0x8b,
- 0x6d, 0x22, 0x6e, 0x19, 0x6b, 0x81, 0x0e, 0x37, 0x3a, 0xaf, 0x1d, 0xea,
- 0xaa, 0x7e, 0x36, 0x7c, 0xf6, 0xc4, 0x2c, 0xaa, 0x3f, 0xd1, 0xc5, 0x3d,
- 0xb9, 0x33, 0xe3, 0x93, 0x7a, 0x69, 0xee, 0xd2, 0x9a, 0xd5, 0x13, 0x73,
- 0x86, 0xaf, 0xf2, 0xeb, 0x65, 0x95, 0xf1, 0xa5, 0x06, 0x0f, 0xa8, 0x3a,
- 0x3e, 0xe9, 0x9e, 0xb8, 0x29, 0xe1, 0x2f, 0x34, 0xf2, 0x25, 0x9b, 0x5d,
- 0xf5, 0xbb, 0xb3, 0x40, 0x1a, 0x1d, 0x6d, 0x01, 0x0c, 0x11, 0x9b, 0xc8,
- 0x68, 0x6e, 0x68, 0xac, 0xc8, 0xe4, 0x5e, 0x9f, 0x9b, 0x09, 0x4e, 0xc8,
- 0x61, 0x96, 0x4c, 0x66, 0x69, 0x3e, 0x87, 0xb9, 0x23, 0x0e, 0xa1, 0x61,
- 0xa7, 0xb9, 0x4b, 0x51, 0xc7, 0xa1, 0x89, 0x8f, 0xc9, 0x1a, 0xa8, 0x6a,
- 0x12, 0x56, 0x34, 0x09, 0xa9, 0x2a, 0x13, 0xac, 0x6b, 0xdf, 0x64, 0x93,
- 0x8f, 0xba, 0x9a, 0x7a, 0x0b, 0x0f, 0x3a, 0xcd, 0x91, 0x27, 0x14, 0x26,
- 0x87, 0x79, 0x6a, 0x69, 0xd6, 0x74, 0x51, 0xd6, 0x75, 0x4e, 0x1e, 0x05,
- 0xd2, 0x90, 0x97, 0x13, 0x28, 0xce, 0x64, 0x62, 0x7f, 0x32, 0x2b, 0xa9,
- 0x5b, 0x22, 0x31, 0x7b, 0xac, 0x98, 0x0e, 0x9a, 0x2a, 0x5f, 0xac, 0xea,
- 0x1d, 0x5f, 0x19, 0xed, 0x3b, 0xbb, 0x16, 0x23, 0x06, 0xf6, 0x01, 0x5b,
- 0x0c, 0x93, 0xa4, 0x33, 0x9b, 0x9d, 0xe6, 0x78, 0x6e, 0xfb, 0x64, 0x22,
- 0xe7, 0x46, 0x84, 0xb2, 0xfe, 0x08, 0x0f, 0x90, 0xd1, 0x16, 0xe5, 0x2c,
- 0x1b, 0xc5, 0x36, 0x9f, 0xe0, 0x5e, 0xc8, 0xaf, 0x33, 0xf2, 0x38, 0x9b,
- 0xe3, 0xdd, 0xcc, 0xcc, 0x6d, 0xe1, 0x09, 0x0a, 0xbb, 0xe2, 0x45, 0x76,
- 0x5d, 0x36, 0x24, 0xa0, 0x83, 0x6d, 0xf2, 0x1e, 0x1b, 0xdf, 0xee, 0x09,
- 0xd5, 0x84, 0xfc, 0x6b, 0x2a, 0x67, 0x15, 0xc5, 0x7c, 0x9a, 0x35, 0x21,
- 0x31, 0xc2, 0xea, 0xc6, 0xec, 0xc0, 0xee, 0xaa, 0x9b, 0xd6, 0x26, 0x19,
- 0xd4, 0x51, 0xdc, 0xa5, 0x7a, 0x95, 0xab, 0x0e, 0x34, 0x26, 0x93, 0x8d,
- 0xcc, 0xe3, 0xbb, 0x7c, 0x92, 0xa9, 0x87, 0x42, 0x3c, 0x69, 0xb3, 0x3c,
- 0xdc, 0xfb, 0xf3, 0x65, 0x0d, 0xab, 0x89, 0xd5, 0x14, 0x32, 0x28, 0xef,
- 0x72, 0x52, 0x63, 0x4e, 0xae, 0xe4, 0xac, 0xd2, 0x2d, 0xca, 0xe7, 0x23,
- 0xad, 0x72, 0x58, 0xcf, 0xa6, 0x39, 0xe9, 0xa7, 0x67, 0xe4, 0xa8, 0xdd,
- 0xe6, 0xfa, 0x8d, 0xf7, 0x45, 0xb3, 0x73, 0x1a, 0x1d, 0x0c, 0xc9, 0xab,
- 0x34, 0x9f, 0x45, 0xe6, 0x09, 0x0a, 0xaa, 0xb1, 0x48, 0x6f, 0xb2, 0x4a,
- 0xd6, 0x60, 0x49, 0x93, 0x4e, 0xd1, 0x81, 0xe0, 0xe9, 0x51, 0x96, 0xb1,
- 0x8a, 0x05, 0x7d, 0xec, 0xd3, 0xbd, 0x9d, 0x5e, 0xdc, 0x63, 0xbc, 0x76,
- 0xf2, 0x77, 0x5e, 0x3e, 0xef, 0x78, 0xa6, 0xd4, 0x6a, 0xba, 0x20, 0x37,
- 0x78, 0xf7, 0x84, 0x92, 0x36, 0x4a, 0x91, 0x94, 0x6d, 0x75, 0xaa, 0x89,
- 0x53, 0xb1, 0xb0, 0x11, 0x08, 0x08, 0x07, 0x72, 0xf8, 0xcb, 0x11, 0xe6,
- 0x76, 0x44, 0x53, 0xea, 0x34, 0x67, 0x54, 0x33, 0xf2, 0x13, 0xc2, 0x08,
- 0x6f, 0xed, 0x58, 0x63, 0x10, 0x57, 0xd6, 0x0f, 0x4e, 0x4e, 0x30, 0x9a,
- 0x6f, 0xd5, 0x3d, 0x71, 0x66, 0xf1, 0x52, 0xa7, 0x39, 0xd2, 0x86, 0x49,
- 0x75, 0x30, 0x87, 0x26, 0xa7, 0xfd, 0x88, 0x4d, 0xa0, 0xae, 0x50, 0xb3,
- 0x7d, 0xd9, 0x33, 0xa6, 0x72, 0x95, 0x95, 0x0d, 0x74, 0xf7, 0x6a, 0x96,
- 0x5e, 0x9b, 0x7d, 0xd7, 0x69, 0x2e, 0xbf, 0x36, 0x36, 0x2e, 0x07, 0x24,
- 0xea, 0xd2, 0xdc, 0x1e, 0x34, 0x6e, 0xb1, 0xf7, 0x8d, 0xb9, 0x67, 0xb6,
- 0xd9, 0x6c, 0x09, 0x09, 0x78, 0x66, 0x06, 0x38, 0x1a, 0x7d, 0xb3, 0xed,
- 0x0b, 0x38, 0xcc, 0xef, 0x63, 0xc4, 0x1b, 0xe4, 0x13, 0x4c, 0x93, 0xe4,
- 0x2b, 0xac, 0x49, 0x57, 0xca, 0xf1, 0x4a, 0x47, 0x26, 0x4f, 0x27, 0x82,
- 0x5c, 0x44, 0x43, 0x11, 0x00, 0x90, 0x00, 0x98, 0x26, 0xf5, 0x56, 0xf1,
- 0x0e, 0x27, 0x2f, 0x02, 0x5f, 0xd3, 0xe6, 0x6f, 0xcb, 0x7a, 0x49, 0x86,
- 0x7b, 0xa7, 0xb9, 0x85, 0x11, 0x64, 0x8d, 0x31, 0xde, 0x8c, 0x44, 0x5a,
- 0x16, 0xf4, 0xa7, 0xd5, 0x2e, 0x72, 0xe8, 0xb9, 0xb4, 0x24, 0x15, 0x39,
- 0x07, 0xc9, 0x42, 0xb0, 0x77, 0xb3, 0x11, 0x2d, 0xd2, 0x72, 0x77, 0x69,
- 0xe1, 0x3e, 0xa1, 0xe0, 0x05, 0xc4, 0xce, 0x34, 0xa7, 0xc0, 0x17, 0x1d,
- 0xbc, 0x15, 0x52, 0x7c, 0xab, 0x5e, 0x1a, 0x39, 0x43, 0x5a, 0x15, 0x0b,
- 0x91, 0x40, 0x80, 0xa8, 0x90, 0x31, 0x0a, 0x9c, 0x27, 0x4d, 0xb6, 0x7f,
- 0xeb, 0x63, 0x82, 0x85, 0xf3, 0x57, 0x72, 0x62, 0xf4, 0x59, 0xa3, 0xa9,
- 0xbe, 0x3c, 0x3a, 0x4c, 0xe8, 0x2f, 0x24, 0x3b, 0xcd, 0x77, 0x03, 0x7d,
- 0xe0, 0xf2, 0x74, 0x14, 0x5b, 0xda, 0xb6, 0x5b, 0xdd, 0x6b, 0x40, 0x3c,
- 0x4f, 0x25, 0xe9, 0x4d, 0x46, 0xf9, 0x0c, 0x66, 0x8f, 0x2e, 0xf8, 0xcc,
- 0x74, 0x58, 0x4c, 0x0a, 0x0e, 0xd9, 0x91, 0x40, 0x33, 0x0a, 0x55, 0x43,
- 0x0a, 0x85, 0xf5, 0x32, 0xb5, 0x3b, 0x06, 0xb7, 0x52, 0x77, 0xab, 0x78,
- 0xbf, 0xdf, 0xaa, 0xb7, 0xad, 0x4c, 0x33, 0xad, 0x9c, 0x1f, 0xbf, 0x85,
- 0x8a, 0x9f, 0x9a, 0x2d, 0xf4, 0x4e, 0x3d, 0x3a, 0x1a, 0x91, 0x1b, 0x2f,
- 0xf3, 0x59, 0xcb, 0x6d, 0xea, 0xac, 0x12, 0x84, 0xc3, 0x78, 0x87, 0xa1,
- 0x6b, 0x1c, 0x00, 0xc8, 0xe1, 0x41, 0xeb, 0xee, 0xb7, 0xe6, 0x7e, 0x21,
- 0xce, 0xbf, 0x65, 0xdd, 0xb2, 0xb1, 0xf5, 0x9e, 0x9e, 0x35, 0x50, 0x43,
- 0x48, 0xf5, 0xf7, 0xda, 0x0c, 0xd6, 0x0a, 0xdd, 0xa2, 0x6b, 0xe1, 0xba,
- 0xc8, 0xff, 0x2e, 0x5e, 0x86, 0xac, 0xb8, 0xcd, 0xab, 0xb2, 0x20, 0xa5,
- 0xc5, 0x58, 0x07, 0x55, 0x0e, 0x31, 0x4d, 0x8a, 0xaf, 0x11, 0x24, 0x9b,
- 0x47, 0xef, 0x2f, 0x4e, 0x3f, 0x1c, 0x1d, 0x7e, 0xf8, 0xea, 0xfd, 0xbb,
- 0xd7, 0xa7, 0xc7, 0x9b, 0xdd, 0xe3, 0x7d, 0xc5, 0x02, 0x82, 0x8e, 0x4c,
- 0x4d, 0xaa, 0x19, 0xce, 0x8a, 0xe9, 0x22, 0xb7, 0x7c, 0x9d, 0xdf, 0x1a,
- 0x01, 0x07, 0x25, 0x0b, 0x6e, 0x4c, 0xfc, 0x0d, 0x86, 0xbf, 0x4c, 0x78,
- 0xa7, 0xb9, 0xb1, 0xb9, 0x99, 0x4d, 0xa7, 0xf9, 0x1c, 0xca, 0xe0, 0xf5,
- 0xcc, 0x88, 0x61, 0xa3, 0x1d, 0x0c, 0x46, 0x46, 0x4b, 0x4c, 0xd7, 0x0a,
- 0x29, 0x77, 0x9e, 0x1e, 0xed, 0x79, 0x34, 0x97, 0x8d, 0x51, 0x23, 0xd5,
- 0x87, 0x6a, 0xec, 0xb4, 0xf2, 0xa3, 0xc6, 0x46, 0x8d, 0x0e, 0x7a, 0x18,
- 0x59, 0xee, 0x9a, 0xd7, 0x85, 0xa7, 0x62, 0x93, 0x5a, 0x32, 0x3b, 0x79,
- 0x20, 0x9d, 0x9c, 0x54, 0x8d, 0x51, 0x00, 0xb3, 0x1c, 0x47, 0x44, 0x83,
- 0x3f, 0xa4, 0x20, 0xc3, 0x7f, 0xd1, 0xd5, 0x54, 0x8c, 0x79, 0x78, 0x4f,
- 0x73, 0x40, 0x8d, 0x0c, 0xb3, 0x4f, 0x19, 0xce, 0xa0, 0xbc, 0x75, 0xb4,
- 0xac, 0x70, 0xaa, 0xbf, 0x37, 0xda, 0x09, 0xc9, 0xc2, 0xd7, 0x70, 0x80,
- 0x98, 0x17, 0xf4, 0x21, 0x73, 0xed, 0x74, 0xaf, 0xc0, 0x72, 0x36, 0x25,
- 0x47, 0x03, 0x8c, 0x4d, 0xb8, 0x06, 0xce, 0x0f, 0x2f, 0xbf, 0x09, 0xe6,
- 0x84, 0x04, 0xbe, 0x03, 0x22, 0xc8, 0x56, 0x84, 0x89, 0x54, 0x37, 0x72,
- 0x40, 0xde, 0x8d, 0x46, 0x09, 0xc2, 0xdc, 0xb3, 0x7c, 0x5c, 0xa5, 0xf4,
- 0x4d, 0xfa, 0x31, 0xfd, 0xd4, 0x6c, 0xeb, 0x4e, 0x73, 0xe7, 0xdf, 0x1e,
- 0x8d, 0xfe, 0xb0, 0xb7, 0x67, 0xd4, 0xc0, 0xe9, 0xd2, 0xcc, 0xcb, 0x96,
- 0x79, 0xa5, 0xa8, 0xcd, 0xc9, 0x9c, 0x0f, 0xeb, 0x72, 0x1b, 0xd7, 0x38,
- 0x74, 0x3f, 0x5c, 0x14, 0xe9, 0xad, 0xb9, 0x7f, 0xb1, 0x93, 0x78, 0x8e,
- 0x69, 0x3f, 0x77, 0x15, 0x76, 0x5e, 0x60, 0x45, 0x01, 0x18, 0xd9, 0x61,
- 0x6e, 0xf0, 0xd9, 0x7d, 0x30, 0x8a, 0xad, 0xfc, 0x6c, 0x24, 0x31, 0xf4,
- 0x74, 0x62, 0xfe, 0x4a, 0xd6, 0xd4, 0x36, 0x8d, 0xad, 0x7d, 0xc6, 0x74,
- 0x5c, 0x23, 0xd6, 0x4f, 0x2f, 0xc9, 0xd9, 0x89, 0xd0, 0x7f, 0x28, 0x17,
- 0x8a, 0xee, 0xf1, 0x72, 0xf0, 0x0a, 0x74, 0x76, 0x9c, 0x4e, 0x3e, 0xde,
- 0xa5, 0xd5, 0x94, 0x5d, 0x27, 0x66, 0xcf, 0x8c, 0xf3, 0x59, 0xde, 0xdc,
- 0xf3, 0x3d, 0xd2, 0x1d, 0x05, 0x07, 0x91, 0x68, 0x0a, 0xcd, 0x49, 0xba,
- 0x36, 0x56, 0x11, 0xe9, 0xa3, 0x64, 0x2b, 0x9a, 0x83, 0xe1, 0x69, 0xfd,
- 0x50, 0x9a, 0x1a, 0xab, 0xf4, 0xd8, 0x6f, 0x77, 0x9a, 0x83, 0x23, 0x8a,
- 0x4e, 0x12, 0xba, 0xe9, 0x76, 0xaf, 0x0a, 0x42, 0x5f, 0x4c, 0xe9, 0x06,
- 0x4a, 0xea, 0x7b, 0x73, 0xef, 0xcf, 0x93, 0x88, 0xd2, 0x08, 0xd4, 0x43,
- 0xf2, 0x6d, 0x76, 0x6f, 0x4c, 0x8c, 0xbc, 0x70, 0xb2, 0x92, 0xbd, 0x45,
- 0x19, 0xd9, 0xac, 0xac, 0x9d, 0xe6, 0xea, 0x71, 0xcc, 0xc4, 0x69, 0xcc,
- 0x77, 0x4a, 0x68, 0x63, 0xf1, 0xfb, 0xaa, 0x99, 0x53, 0x13, 0x9b, 0x75,
- 0x4b, 0x28, 0xe3, 0x4b, 0xb1, 0xad, 0x18, 0x5c, 0xa1, 0x70, 0x9e, 0x70,
- 0x74, 0x98, 0x9c, 0xcf, 0x35, 0xef, 0xbd, 0x59, 0x5a, 0x37, 0xb0, 0x2e,
- 0x30, 0x6e, 0xf1, 0x51, 0xb4, 0x6f, 0x13, 0xc8, 0x91, 0x97, 0xe6, 0xa0,
- 0xfd, 0xe3, 0x57, 0x08, 0x1f, 0x57, 0x1c, 0xcf, 0x50, 0xaa, 0xca, 0x5c,
- 0xb5, 0xae, 0x92, 0xb7, 0x7a, 0x67, 0x50, 0x27, 0xac, 0x1f, 0x65, 0xc1,
- 0x51, 0x3f, 0x56, 0x74, 0xd8, 0x21, 0x14, 0x2a, 0xae, 0x64, 0xd3, 0x8b,
- 0xdf, 0xe0, 0xa0, 0x97, 0x6c, 0x65, 0xc3, 0x6b, 0xd3, 0x5e, 0x8f, 0xda,
- 0xd9, 0x3b, 0xa0, 0xff, 0xee, 0xe3, 0xbf, 0x4f, 0x7a, 0x0a, 0x99, 0xf1,
- 0x97, 0x9a, 0xee, 0x9b, 0xae, 0xb4, 0x14, 0xa7, 0x3a, 0xdd, 0x3f, 0x72,
- 0x01, 0x89, 0x00, 0x26, 0xb9, 0x1c, 0x3f, 0x1c, 0xac, 0x67, 0x9d, 0xf6,
- 0x23, 0xba, 0x90, 0x9b, 0x08, 0xdc, 0x6d, 0xb0, 0x52, 0xc7, 0xe4, 0x80,
- 0x32, 0x63, 0x9b, 0x18, 0x5d, 0x06, 0xbe, 0x00, 0x0e, 0x51, 0xd1, 0x74,
- 0x4c, 0x3e, 0x54, 0xd9, 0x4d, 0x5a, 0x1b, 0xb5, 0x6a, 0xd9, 0xe0, 0x74,
- 0x74, 0x6d, 0x08, 0x73, 0xa4, 0x66, 0xb9, 0x75, 0xbe, 0xc8, 0x87, 0x87,
- 0xd6, 0x54, 0x91, 0x55, 0x64, 0x37, 0xe6, 0xac, 0xbc, 0xd3, 0x27, 0x06,
- 0x82, 0x61, 0x89, 0x5d, 0x5c, 0x66, 0x35, 0x01, 0x83, 0xa1, 0xc7, 0xfc,
- 0x70, 0xd4, 0x9c, 0xf4, 0x1e, 0x02, 0xd8, 0x98, 0x23, 0x78, 0x65, 0x66,
- 0x8c, 0x6c, 0x90, 0x19, 0xd6, 0x8d, 0xac, 0x2d, 0xf4, 0x3a, 0xd0, 0x85,
- 0x44, 0x27, 0xc9, 0xaf, 0xc4, 0x05, 0x23, 0xff, 0x86, 0xc4, 0x17, 0xfd,
- 0xa0, 0xe6, 0x90, 0x55, 0x57, 0x39, 0x78, 0x78, 0x6b, 0xeb, 0x01, 0xb6,
- 0x77, 0xb1, 0x0c, 0x96, 0xbd, 0x9e, 0xba, 0xaf, 0x45, 0x37, 0x8e, 0x99,
- 0xdc, 0xa6, 0x57, 0x1c, 0x3d, 0xf8, 0xf5, 0x87, 0xc4, 0xf4, 0x78, 0x40,
- 0x0e, 0x8f, 0x65, 0xfd, 0x88, 0x33, 0xe2, 0x09, 0x05, 0x7e, 0xc7, 0xba,
- 0x7c, 0x38, 0x34, 0xe7, 0x4f, 0x40, 0x77, 0x17, 0xde, 0x7b, 0x6e, 0x97,
- 0x23, 0xef, 0x64, 0x8d, 0xb8, 0xa1, 0x0b, 0x31, 0xea, 0xb7, 0xd2, 0x8f,
- 0xe9, 0x30, 0x39, 0x3b, 0x1a, 0x9d, 0xd3, 0x27, 0xcc, 0xd6, 0x28, 0xae,
- 0x4d, 0x2f, 0x4e, 0x47, 0x9d, 0xe6, 0x8c, 0xad, 0x9e, 0x15, 0x75, 0x0b,
- 0xf4, 0xb5, 0x72, 0x9a, 0xd5, 0x15, 0xa8, 0x31, 0x72, 0xe9, 0xac, 0xb1,
- 0x4d, 0x11, 0xdc, 0xa2, 0x58, 0x0d, 0x05, 0x52, 0x13, 0x3e, 0x6a, 0xc1,
- 0x87, 0x16, 0x66, 0xc3, 0x4f, 0xb7, 0xad, 0x73, 0xa1, 0xaf, 0x7b, 0xc1,
- 0xfa, 0xfc, 0xeb, 0xe5, 0x35, 0xe9, 0xcb, 0xb5, 0x5a, 0x39, 0xf6, 0x0b,
- 0x66, 0x36, 0x82, 0x0b, 0x5e, 0x87, 0x6d, 0xce, 0x04, 0x1f, 0x1b, 0xa3,
- 0xe0, 0x13, 0x1c, 0x02, 0x97, 0x78, 0x51, 0xba, 0x56, 0x49, 0xa7, 0x07,
- 0x1a, 0x2b, 0x87, 0x97, 0x7c, 0x92, 0x19, 0x25, 0x69, 0x1a, 0xb9, 0xa4,
- 0x78, 0x51, 0x54, 0xc5, 0xbf, 0x12, 0x04, 0x56, 0xc4, 0x63, 0x81, 0x86,
- 0x26, 0xac, 0x44, 0xd0, 0xae, 0x87, 0xb7, 0x31, 0x27, 0xf7, 0x2c, 0xa9,
- 0x74, 0x6c, 0x5c, 0x52, 0x7b, 0xf6, 0xec, 0x7f, 0x5d, 0x2c, 0xcd, 0xc4,
- 0x47, 0x6e, 0x0b, 0xba, 0xf6, 0xe9, 0xee, 0xa3, 0x09, 0x5c, 0xe7, 0x8a,
- 0x7a, 0xba, 0xd7, 0x76, 0x45, 0x61, 0xb3, 0x19, 0x15, 0x35, 0x4b, 0x5e,
- 0xd2, 0x7f, 0x1f, 0x94, 0xca, 0x88, 0x3f, 0xfb, 0x52, 0x18, 0xef, 0x4a,
- 0x00, 0x83, 0xe5, 0xe8, 0x9a, 0x1d, 0x87, 0xd0, 0xf6, 0x90, 0xc4, 0x5e,
- 0x3f, 0x79, 0x7d, 0x7c, 0x81, 0xe5, 0x3f, 0x7e, 0xf7, 0x35, 0xbc, 0xc3,
- 0x56, 0xb5, 0x9d, 0xa2, 0xcd, 0x9a, 0xad, 0x5e, 0x8e, 0xee, 0x88, 0xf8,
- 0xef, 0x4e, 0x35, 0x89, 0x4f, 0x72, 0xea, 0x23, 0xf6, 0x3f, 0xfd, 0xfd,
- 0x2e, 0xae, 0xc0, 0x5a, 0x3a, 0xee, 0xcb, 0xd4, 0x89, 0x0f, 0xe1, 0x63,
- 0x76, 0xef, 0xfe, 0x86, 0xe9, 0xf4, 0xe6, 0xd8, 0x3d, 0xfc, 0xd2, 0x9b,
- 0x99, 0x1f, 0x0f, 0x08, 0x5f, 0x60, 0xd4, 0xa7, 0xe9, 0xcf, 0xbf, 0xee,
- 0x2a, 0x14, 0x87, 0x4d, 0xd2, 0xbe, 0x13, 0x23, 0x7e, 0x01, 0xb8, 0x64,
- 0x34, 0x92, 0xcf, 0x81, 0x3b, 0x16, 0xec, 0x82, 0x2f, 0x25, 0xe8, 0x29,
- 0xed, 0xf4, 0xb4, 0x60, 0x85, 0x88, 0x44, 0x34, 0xc3, 0x37, 0x00, 0xe7,
- 0xe8, 0x1e, 0x97, 0x49, 0x39, 0x0b, 0x2e, 0xb9, 0x96, 0x4d, 0x05, 0x55,
- 0x73, 0x5f, 0xae, 0x35, 0xd8, 0x19, 0x72, 0xf9, 0xb0, 0x7a, 0xd7, 0x3d,
- 0x07, 0x56, 0xd9, 0x03, 0x32, 0xca, 0xbf, 0x12, 0x13, 0xef, 0x65, 0x04,
- 0xaa, 0xd0, 0x3d, 0xd6, 0xd4, 0x86, 0xb2, 0xbc, 0x59, 0x54, 0x33, 0x35,
- 0xab, 0xab, 0xb3, 0x6b, 0x96, 0x9d, 0x9c, 0x22, 0x6e, 0x0f, 0x71, 0x04,
- 0x80, 0x97, 0xd9, 0xc8, 0xb7, 0x2a, 0x17, 0xd5, 0x91, 0x01, 0x65, 0xdd,
- 0xc3, 0xac, 0xf1, 0x42, 0x71, 0x9a, 0x88, 0x61, 0x8f, 0x6d, 0xa5, 0xfb,
- 0x8a, 0xb7, 0x1f, 0x19, 0x49, 0x3d, 0x6f, 0x4a, 0x7a, 0xb1, 0xa5, 0x68,
- 0x38, 0x74, 0x21, 0xe7, 0x25, 0xbf, 0xa5, 0xa9, 0xd3, 0xbd, 0xe3, 0x7c,
- 0x70, 0x6d, 0x9d, 0xac, 0x2c, 0xe8, 0xcf, 0x82, 0x7c, 0x37, 0xff, 0x12,
- 0xd9, 0x90, 0xd1, 0xbd, 0x48, 0x6e, 0x5c, 0x09, 0xeb, 0x40, 0x73, 0x21,
- 0x08, 0x93, 0xc0, 0x3a, 0x23, 0x5a, 0x7a, 0xcc, 0xd6, 0x50, 0xad, 0x43,
- 0x4d, 0x0a, 0xcf, 0xce, 0x08, 0xd4, 0xf0, 0xee, 0x06, 0x31, 0xf2, 0xbb,
- 0xa1, 0x80, 0x30, 0xef, 0x5d, 0x72, 0x13, 0xe6, 0x93, 0x8f, 0xc0, 0xfd,
- 0xc8, 0xd5, 0xd4, 0x92, 0x1f, 0x82, 0xba, 0x61, 0xbc, 0x58, 0x64, 0x09,
- 0x60, 0xe6, 0x90, 0xff, 0x92, 0xf6, 0x24, 0x5d, 0xcb, 0x79, 0xc1, 0xca,
- 0xda, 0x4a, 0x03, 0xd8, 0xf4, 0xf5, 0xc3, 0xeb, 0x93, 0x8b, 0x64, 0xcb,
- 0xac, 0xea, 0xb8, 0xab, 0xdc, 0xe8, 0xbd, 0xbe, 0x93, 0x35, 0x93, 0x9d,
- 0xc5, 0xc7, 0x7c, 0xc7, 0xd8, 0x41, 0xd3, 0xf1, 0xb6, 0xd5, 0xee, 0xf1,
- 0x39, 0x6c, 0x42, 0xb5, 0x99, 0xd4, 0x68, 0x82, 0xd5, 0xd4, 0x3d, 0x0d,
- 0x9e, 0x15, 0xc5, 0x90, 0x71, 0x67, 0x3c, 0x61, 0x9a, 0xd8, 0xc5, 0x00,
- 0xb8, 0x0a, 0xc7, 0x36, 0x13, 0xf2, 0x13, 0x66, 0xec, 0x42, 0x35, 0xe6,
- 0x5f, 0xf7, 0xac, 0x32, 0x76, 0x49, 0x7c, 0x0c, 0xec, 0x5b, 0x50, 0xc0,
- 0x8d, 0xdc, 0x13, 0x4e, 0xdb, 0xeb, 0x13, 0x54, 0x8a, 0x26, 0x65, 0x41,
- 0x77, 0xd1, 0x94, 0x5c, 0x55, 0xdd, 0xe6, 0xe0, 0x3c, 0xeb, 0x0d, 0x77,
- 0x7a, 0x89, 0x05, 0x87, 0x99, 0x59, 0x06, 0xbe, 0xd1, 0xa1, 0xf1, 0xcc,
- 0x16, 0xbb, 0x5a, 0xd6, 0xec, 0x7e, 0x25, 0x7b, 0xdf, 0xae, 0xd7, 0x30,
- 0x26, 0x50, 0xbd, 0xe5, 0xb4, 0xca, 0x96, 0x51, 0x8a, 0x71, 0xae, 0xac,
- 0x21, 0x39, 0xb6, 0x9d, 0xc2, 0x52, 0xf5, 0x7e, 0xea, 0x25, 0x1e, 0xb8,
- 0xa8, 0xe5, 0x24, 0xcb, 0x5d, 0xf8, 0xdf, 0xbb, 0x02, 0xcc, 0x55, 0x6c,
- 0x4f, 0xf0, 0x34, 0x9b, 0xe5, 0xf3, 0xbc, 0x81, 0x0e, 0xef, 0x75, 0x21,
- 0x58, 0x8a, 0x76, 0x97, 0x7e, 0x0a, 0xbb, 0xa4, 0x80, 0xbd, 0x94, 0x7e,
- 0x6d, 0xba, 0x04, 0x67, 0x0d, 0xe3, 0xa9, 0xe2, 0xe6, 0x5c, 0xbb, 0x43,
- 0x16, 0xf2, 0xb7, 0x26, 0xea, 0xf3, 0xfb, 0x58, 0xbc, 0xed, 0x23, 0x53,
- 0x37, 0x00, 0x16, 0xd1, 0x39, 0x13, 0x27, 0xc6, 0x98, 0x2f, 0x07, 0x3d,
- 0x63, 0xa9, 0x3e, 0x1e, 0xc8, 0x6e, 0xf3, 0xfa, 0x8e, 0x0a, 0x1e, 0x48,
- 0x1e, 0x75, 0x7f, 0xb0, 0x19, 0x6a, 0x0e, 0x0c, 0xcc, 0xce, 0x8f, 0x62,
- 0x75, 0x42, 0x03, 0x82, 0xb0, 0x62, 0xf7, 0x4f, 0x57, 0xdf, 0x55, 0x61,
- 0x3f, 0xc8, 0x8a, 0x49, 0x39, 0xed, 0xd8, 0x67, 0x34, 0x09, 0x9e, 0x90,
- 0xc3, 0x8e, 0xe7, 0x48, 0x0a, 0x76, 0x79, 0xdc, 0xb1, 0x46, 0x1e, 0x1d,
- 0xf6, 0xf6, 0xfd, 0xa2, 0x7d, 0x1f, 0x33, 0xef, 0xb1, 0xed, 0x7f, 0xd5,
- 0xae, 0xff, 0xa7, 0xe9, 0x11, 0x9e, 0xfa, 0xf5, 0x08, 0x45, 0x62, 0x30,
- 0xc9, 0x17, 0x37, 0xe4, 0x7d, 0x7f, 0x89, 0x80, 0x34, 0xb9, 0xc8, 0xf8,
- 0x07, 0x71, 0x05, 0x62, 0x24, 0x57, 0x5e, 0x2d, 0x7e, 0x02, 0x7d, 0x5b,
- 0xc4, 0x4b, 0xae, 0x00, 0x6a, 0x35, 0xc6, 0x04, 0x04, 0x91, 0x07, 0xd6,
- 0x2a, 0x85, 0x24, 0xf4, 0x65, 0xbe, 0xe9, 0xed, 0xed, 0xc2, 0x78, 0x47,
- 0xfd, 0xed, 0xd0, 0x98, 0x0c, 0xe9, 0x94, 0x10, 0x4d, 0x66, 0x9a, 0x90,
- 0x80, 0x81, 0x9f, 0x77, 0x9a, 0x43, 0xe7, 0x25, 0x31, 0x81, 0x6f, 0x5d,
- 0x33, 0xa3, 0xef, 0x2f, 0x4e, 0x0f, 0xba, 0xf3, 0x04, 0x5c, 0x6c, 0x7d,
- 0xb0, 0xb3, 0x03, 0xd7, 0xdb, 0x4d, 0xfa, 0xe9, 0xd3, 0xb0, 0xce, 0x76,
- 0xa6, 0xe5, 0xa4, 0xde, 0xa9, 0xeb, 0x99, 0xce, 0x46, 0x1b, 0x39, 0xfe,
- 0x3b, 0xf8, 0x2c, 0xca, 0xf9, 0xa2, 0x82, 0x11, 0x1d, 0x0f, 0x68, 0xa8,
- 0x95, 0x04, 0xd8, 0xb4, 0x3c, 0xe9, 0x4c, 0x86, 0x6e, 0x56, 0x90, 0x59,
- 0xf8, 0xeb, 0xb2, 0x32, 0x1b, 0x6e, 0x5e, 0xc7, 0xcc, 0x64, 0x75, 0x67,
- 0xd5, 0xea, 0x0e, 0xa8, 0xc9, 0x96, 0x67, 0xb3, 0x7d, 0x59, 0x78, 0x1f,
- 0x30, 0xb3, 0x80, 0x58, 0xf5, 0xd0, 0x8e, 0x35, 0xee, 0xa2, 0xd3, 0x91,
- 0x77, 0x0c, 0x2d, 0xb1, 0xb4, 0x12, 0x18, 0xd9, 0x85, 0xf3, 0xa1, 0x25,
- 0x38, 0xc8, 0xa6, 0xcb, 0xfd, 0x58, 0xef, 0x30, 0x45, 0x55, 0x46, 0xcf,
- 0x42, 0x18, 0x56, 0x55, 0xe9, 0x49, 0xc0, 0xc1, 0xb7, 0xd0, 0x44, 0xcc,
- 0xb1, 0xca, 0xaf, 0x93, 0x97, 0x74, 0x88, 0xbf, 0x08, 0x76, 0xbe, 0x6e,
- 0x9b, 0x94, 0x54, 0x2b, 0x82, 0xa9, 0x48, 0x32, 0x0e, 0x19, 0x59, 0x66,
- 0xe7, 0x70, 0xc8, 0x4c, 0xc2, 0xf0, 0x1c, 0xe6, 0x6c, 0xe5, 0x20, 0x05,
- 0x3b, 0x89, 0xe0, 0x9d, 0xee, 0x71, 0x0a, 0x0f, 0xeb, 0xbe, 0x46, 0xf3,
- 0xa2, 0xeb, 0xba, 0x85, 0x4d, 0x48, 0x8e, 0x43, 0xad, 0x34, 0xcf, 0x74,
- 0x55, 0x03, 0x20, 0x2b, 0xac, 0x19, 0x13, 0x4b, 0x30, 0xe8, 0x8e, 0x47,
- 0x51, 0x56, 0x3a, 0xbd, 0x39, 0x52, 0x5a, 0x52, 0x40, 0xb8, 0x6a, 0xab,
- 0x14, 0x7b, 0x89, 0x05, 0x9e, 0xb3, 0x99, 0x1a, 0xec, 0x9a, 0x47, 0xfc,
- 0x6b, 0x86, 0xd6, 0x29, 0x28, 0x15, 0x17, 0xa8, 0x39, 0xc1, 0x4d, 0x06,
- 0x70, 0x11, 0x25, 0x32, 0xcd, 0x4a, 0x27, 0x99, 0xcd, 0xee, 0x33, 0xb2,
- 0x04, 0xc0, 0xf3, 0xee, 0x75, 0x7d, 0x5a, 0x32, 0xfc, 0x94, 0x03, 0x69,
- 0x0c, 0xa3, 0xe6, 0x28, 0xb6, 0x6a, 0xc9, 0x33, 0x68, 0x24, 0xec, 0xeb,
- 0x77, 0xf2, 0x80, 0xd6, 0x2f, 0x66, 0x47, 0x08, 0x00, 0x8b, 0x31, 0xed,
- 0x39, 0x32, 0x28, 0x04, 0xdf, 0xcf, 0x78, 0x32, 0xf5, 0x7f, 0xd4, 0x65,
- 0x5f, 0x9a, 0x9a, 0x91, 0x27, 0xbf, 0x92, 0x3e, 0x76, 0x77, 0x94, 0xc5,
- 0xee, 0xfb, 0x88, 0x26, 0x5a, 0x1f, 0x0b, 0xcb, 0xaa, 0x43, 0x9f, 0xab,
- 0x9b, 0xcc, 0x98, 0xaa, 0x13, 0x40, 0xdc, 0xd0, 0x91, 0x2a, 0xd3, 0x2f,
- 0x18, 0x63, 0xbe, 0xd3, 0x29, 0xed, 0xc7, 0x20, 0x54, 0xfc, 0x2d, 0x8c,
- 0xcb, 0xeb, 0x80, 0xc2, 0xb9, 0xec, 0x2a, 0xc7, 0x2f, 0x8b, 0xcc, 0x3d,
- 0x00, 0x75, 0xbf, 0xb4, 0x71, 0x2b, 0x7f, 0x21, 0xdb, 0xcf, 0xc9, 0x6e,
- 0xe9, 0xfa, 0x3a, 0x8a, 0xc9, 0xac, 0x54, 0x18, 0x9c, 0x79, 0x9f, 0x33,
- 0x29, 0xcc, 0xa9, 0xff, 0x5e, 0x14, 0x66, 0x59, 0x01, 0xf9, 0x45, 0x5f,
- 0x64, 0xc5, 0x55, 0x49, 0x8e, 0xb9, 0xd0, 0x79, 0x26, 0xfa, 0x4b, 0x37,
- 0x11, 0xc8, 0xa9, 0xad, 0x07, 0x49, 0xf2, 0xd3, 0x4f, 0xfd, 0x84, 0x94,
- 0xa7, 0x9f, 0x8c, 0x49, 0xf6, 0x93, 0xd9, 0x68, 0x3f, 0x31, 0xf0, 0xf4,
- 0xa7, 0xdb, 0x61, 0xd2, 0x0d, 0xb5, 0x90, 0xc7, 0xa1, 0x9e, 0x91, 0x2b,
- 0x91, 0xaf, 0xe2, 0xb6, 0xa5, 0xc6, 0x59, 0x2e, 0x30, 0xfa, 0xd9, 0x5f,
- 0xe6, 0x07, 0xb2, 0x81, 0x1f, 0x09, 0x4d, 0xcb, 0xe5, 0xbc, 0x10, 0x0d,
- 0x86, 0xf7, 0x21, 0x8e, 0x38, 0x80, 0x7b, 0x9b, 0x7f, 0xd8, 0x74, 0x7b,
- 0xa6, 0xaf, 0xee, 0x9e, 0x46, 0xe5, 0x6a, 0xe4, 0x38, 0xe9, 0xc1, 0xd7,
- 0x9c, 0x10, 0x04, 0xb2, 0x18, 0x56, 0x61, 0xe4, 0xe6, 0x19, 0xf9, 0x5a,
- 0x18, 0xd9, 0x5b, 0x5a, 0x3c, 0x14, 0x00, 0xce, 0x8b, 0x9b, 0xfb, 0x9a,
- 0x62, 0x4d, 0x31, 0x69, 0x13, 0x9e, 0x92, 0xe1, 0x4a, 0x21, 0xd7, 0x68,
- 0xe8, 0x12, 0x7a, 0x19, 0xed, 0x82, 0x96, 0x88, 0x34, 0xdd, 0xd9, 0x1c,
- 0x6c, 0x5a, 0xcf, 0xa8, 0xc4, 0xf7, 0x02, 0x70, 0x94, 0x4a, 0x04, 0x0f,
- 0x3c, 0x11, 0x7c, 0xd2, 0x0b, 0xe8, 0x97, 0x3e, 0x5c, 0xc3, 0xe5, 0x2b,
- 0x51, 0xc2, 0x81, 0xc6, 0x1c, 0xe4, 0xfb, 0x22, 0x67, 0x22, 0x56, 0x08,
- 0x60, 0x1d, 0x88, 0x07, 0xd9, 0x7b, 0x9e, 0x54, 0x64, 0xe7, 0x2c, 0x1c,
- 0x0c, 0x90, 0xcd, 0xb9, 0xe0, 0x0c, 0x4c, 0xda, 0x1d, 0x88, 0x93, 0xdc,
- 0x13, 0xb8, 0x77, 0x11, 0xc4, 0xd6, 0x15, 0xca, 0xa0, 0xf9, 0x33, 0x74,
- 0x90, 0x29, 0xed, 0xef, 0xae, 0x90, 0xb4, 0xad, 0x51, 0x09, 0x55, 0x7d,
- 0x82, 0x88, 0x8b, 0x84, 0xf7, 0x04, 0x26, 0x1c, 0x51, 0x13, 0xe9, 0xb2,
- 0x0b, 0x74, 0x05, 0xea, 0xcf, 0xab, 0xa4, 0xb7, 0x5a, 0x63, 0xe8, 0x75,
- 0xdf, 0x00, 0x82, 0xc3, 0xd9, 0xbd, 0x92, 0x02, 0x85, 0x8e, 0x6c, 0x09,
- 0x04, 0x60, 0xf0, 0x37, 0xc6, 0xf7, 0x30, 0x4a, 0x57, 0xae, 0xd2, 0x6d,
- 0x06, 0x38, 0xd5, 0x41, 0x5c, 0xaf, 0xf2, 0xa2, 0xc2, 0xde, 0xfe, 0x70,
- 0x71, 0xd5, 0x1c, 0xde, 0x10, 0xdc, 0x52, 0x7c, 0xab, 0x79, 0x4f, 0x77,
- 0xe5, 0x8f, 0x7d, 0x9b, 0x40, 0x84, 0xf4, 0x3d, 0xf1, 0x52, 0xe8, 0x15,
- 0xa1, 0xe7, 0xdb, 0xa8, 0xc2, 0xc8, 0x86, 0x54, 0xf8, 0x22, 0x94, 0xdc,
- 0x60, 0x76, 0xf6, 0xb6, 0x2d, 0xe0, 0x1d, 0x29, 0x8d, 0x8c, 0x2c, 0x13,
- 0x95, 0xa0, 0x77, 0x53, 0x72, 0xec, 0xb3, 0x77, 0x40, 0x58, 0x6c, 0x06,
- 0x76, 0xf1, 0x18, 0x35, 0xb3, 0xad, 0xd3, 0x1c, 0x22, 0xcb, 0xdf, 0x9c,
- 0xbd, 0x3d, 0x6e, 0x23, 0x88, 0xf0, 0x93, 0x98, 0x45, 0x6e, 0xe4, 0xd5,
- 0x1b, 0x23, 0x5f, 0x78, 0x0f, 0xa4, 0x81, 0x91, 0xc3, 0x7b, 0xcb, 0x74,
- 0xeb, 0x3a, 0x6b, 0x16, 0x77, 0xcb, 0x7c, 0xba, 0xb5, 0x4d, 0x7b, 0x84,
- 0xf0, 0x83, 0x03, 0xc0, 0x56, 0xd9, 0x3a, 0xa9, 0x93, 0x2d, 0x56, 0x64,
- 0xab, 0xac, 0x59, 0x56, 0x05, 0x7b, 0x51, 0xa8, 0xef, 0x61, 0x34, 0x44,
- 0xae, 0x34, 0xdf, 0x7a, 0x90, 0xcc, 0x64, 0x0e, 0xb9, 0x72, 0x83, 0xdb,
- 0x24, 0x04, 0x8c, 0x20, 0x45, 0xe4, 0x19, 0x0b, 0x8f, 0xb1, 0x04, 0xf7,
- 0x94, 0x3f, 0x13, 0xc9, 0xe1, 0xf9, 0xf9, 0xeb, 0xc3, 0xcb, 0x43, 0x3b,
- 0x36, 0x5c, 0xc4, 0x90, 0x2c, 0xd0, 0x24, 0x8d, 0x48, 0x22, 0xed, 0x88,
- 0x9e, 0xdc, 0xfc, 0xe3, 0xfb, 0xd1, 0xf1, 0x45, 0x77, 0x61, 0xcf, 0x2f,
- 0xce, 0x28, 0xed, 0xfb, 0x8f, 0x3f, 0x1d, 0x52, 0x90, 0x45, 0x5c, 0xc4,
- 0xaf, 0xd3, 0x26, 0xdd, 0x0c, 0x4e, 0xf5, 0xfe, 0x36, 0xf5, 0xef, 0xce,
- 0xf6, 0xef, 0x4a, 0x2e, 0x33, 0x58, 0xcb, 0xc9, 0x07, 0x5a, 0xd0, 0x6a,
- 0xa2, 0xf0, 0x21, 0x3b, 0x1b, 0x98, 0x00, 0xa0, 0x7f, 0x56, 0x0f, 0xa4,
- 0x74, 0x92, 0x4c, 0x03, 0xdf, 0x3a, 0x59, 0xb3, 0x24, 0xfb, 0x64, 0x8c,
- 0xd2, 0x46, 0xb7, 0x3c, 0xf6, 0x17, 0x25, 0xe6, 0x74, 0xe7, 0x25, 0x58,
- 0x1e, 0xe7, 0x59, 0x63, 0x29, 0x80, 0xbc, 0x30, 0xb3, 0xd1, 0x00, 0xf1,
- 0x1a, 0x4a, 0x6f, 0x59, 0x8a, 0xc5, 0x62, 0x58, 0x19, 0xfb, 0xda, 0x90,
- 0x27, 0xc6, 0x5d, 0x0a, 0x26, 0xe4, 0x0f, 0xe6, 0x34, 0x0e, 0x92, 0x63,
- 0x01, 0x30, 0x63, 0xe0, 0xe6, 0x07, 0xc1, 0x43, 0x9a, 0x39, 0x64, 0x85,
- 0x7d, 0x5c, 0x56, 0x78, 0xb9, 0x93, 0xbd, 0xae, 0xf2, 0xcc, 0xd9, 0x0a,
- 0xe6, 0x21, 0xea, 0x36, 0x4d, 0x3a, 0xac, 0x8c, 0x5e, 0x24, 0x44, 0x3b,
- 0x48, 0xaf, 0x69, 0x7b, 0x99, 0x47, 0x8d, 0x16, 0x6d, 0x8c, 0x0b, 0xfa,
- 0xd7, 0xce, 0xde, 0x70, 0xb7, 0x17, 0x76, 0x9e, 0x0e, 0x0b, 0x52, 0x51,
- 0xad, 0xab, 0x95, 0xa4, 0x61, 0x53, 0x96, 0x0f, 0xf6, 0x8f, 0x45, 0x98,
- 0xd1, 0x43, 0x17, 0xa6, 0xfd, 0x68, 0x57, 0x06, 0x67, 0x01, 0x3e, 0x8a,
- 0x10, 0x47, 0x95, 0x0a, 0x45, 0x23, 0x13, 0x8b, 0xf2, 0x8e, 0x46, 0x62,
- 0xb6, 0xda, 0x6c, 0xd6, 0xca, 0x19, 0xee, 0xc5, 0xa7, 0xb9, 0x40, 0x7a,
- 0x7e, 0xd6, 0x9d, 0xed, 0x68, 0x1c, 0x43, 0x95, 0x4c, 0x5f, 0x93, 0xb3,
- 0x10, 0x1d, 0x58, 0x5b, 0x76, 0x27, 0xf8, 0xf9, 0x61, 0x46, 0xca, 0x05,
- 0x72, 0x6f, 0xe6, 0xc7, 0xe9, 0x06, 0x1a, 0x2c, 0x1c, 0x50, 0x23, 0xa4,
- 0x7d, 0xbe, 0xe4, 0xf4, 0xa3, 0xc0, 0xe6, 0x7d, 0x9b, 0x7e, 0xca, 0xe7,
- 0xcb, 0x39, 0x3e, 0x46, 0x7b, 0x5b, 0x1e, 0x13, 0x27, 0x13, 0xdc, 0x0e,
- 0x1c, 0xac, 0xc4, 0x26, 0xdf, 0xac, 0x13, 0xcf, 0xf2, 0x8d, 0x5d, 0x32,
- 0xe6, 0x4a, 0x1e, 0xba, 0xe1, 0x15, 0xc0, 0x9d, 0x90, 0x17, 0xaa, 0xee,
- 0x58, 0xcd, 0x46, 0x5b, 0x48, 0x29, 0x02, 0x65, 0xcc, 0x79, 0x0d, 0xdd,
- 0x46, 0xc4, 0x39, 0xe7, 0xbf, 0x89, 0x0e, 0xe7, 0xe1, 0x6b, 0xb2, 0x2a,
- 0x2f, 0xa7, 0xf6, 0xdc, 0x90, 0x92, 0x98, 0x17, 0x4b, 0x33, 0xcf, 0xd4,
- 0x16, 0x5d, 0xa9, 0x0a, 0xe1, 0x0b, 0x22, 0x60, 0x40, 0x05, 0x8e, 0x00,
- 0xf6, 0x54, 0xc8, 0xcc, 0x67, 0xc3, 0x27, 0xfb, 0xc3, 0xdd, 0x7e, 0xcb,
- 0xf0, 0x95, 0x34, 0x41, 0x73, 0xba, 0x26, 0xf9, 0xdc, 0xa6, 0x10, 0x0c,
- 0xff, 0x69, 0x0e, 0x0e, 0x4a, 0x9e, 0x18, 0xcc, 0xd3, 0x4f, 0x58, 0xbe,
- 0xe8, 0xb2, 0x96, 0xc9, 0xcb, 0x6f, 0xce, 0x46, 0x97, 0x7b, 0x07, 0xe7,
- 0x67, 0x17, 0xe6, 0xbf, 0xf4, 0xf7, 0x7d, 0xfc, 0x7d, 0x3f, 0xb0, 0x1e,
- 0xdf, 0x08, 0xe2, 0x47, 0xc1, 0xc6, 0xd0, 0x50, 0xa0, 0xd1, 0xf0, 0x6c,
- 0x26, 0x5e, 0x43, 0x04, 0x10, 0x87, 0x18, 0x9c, 0x58, 0x88, 0x7a, 0x77,
- 0x89, 0xbd, 0x4f, 0x29, 0xfc, 0x52, 0x81, 0x84, 0x3e, 0xbc, 0x24, 0x6f,
- 0x54, 0x9b, 0x92, 0xf4, 0x26, 0x4d, 0x9c, 0xea, 0x3a, 0xc3, 0x38, 0x35,
- 0x45, 0xf0, 0xc5, 0xca, 0x0a, 0x02, 0xa4, 0x40, 0xfb, 0x57, 0x93, 0x99,
- 0xd1, 0xf4, 0x33, 0x8a, 0x2c, 0x4e, 0x33, 0x4e, 0x49, 0xa7, 0x9f, 0xc4,
- 0x0c, 0x10, 0x73, 0xfc, 0x04, 0x70, 0x39, 0xec, 0xf6, 0x0b, 0x3b, 0x52,
- 0x00, 0x65, 0x94, 0x09, 0x68, 0xfa, 0x98, 0xd7, 0x37, 0x32, 0x1d, 0x45,
- 0xd6, 0x74, 0x9b, 0x63, 0xb6, 0x0e, 0xdf, 0xd9, 0x83, 0xbc, 0x2b, 0x64,
- 0x50, 0xbd, 0x3b, 0xbb, 0x4c, 0xd2, 0xab, 0x2b, 0x4d, 0xf7, 0x22, 0x44,
- 0x25, 0x69, 0xac, 0x3b, 0x0b, 0xbe, 0xc9, 0x10, 0xb2, 0x08, 0x25, 0x1f,
- 0xeb, 0x23, 0x97, 0xa7, 0xa3, 0x1d, 0xf2, 0xf4, 0x30, 0x24, 0x62, 0xf4,
- 0xee, 0xa4, 0xdf, 0xf2, 0x01, 0xfa, 0x81, 0xd0, 0x6d, 0xba, 0x29, 0xe3,
- 0x0a, 0x45, 0xea, 0xdd, 0x85, 0x2e, 0x89, 0x98, 0x20, 0x16, 0x58, 0xd2,
- 0x9e, 0x38, 0x43, 0x7a, 0x58, 0xda, 0x5e, 0xa2, 0xae, 0x74, 0xd8, 0xbf,
- 0xf3, 0x45, 0x08, 0x60, 0x80, 0x83, 0xb4, 0x8f, 0xd4, 0x5a, 0x52, 0x3a,
- 0x7a, 0x64, 0x93, 0xd0, 0xb0, 0x30, 0xa4, 0xde, 0x90, 0x9b, 0xdd, 0xef,
- 0xa1, 0x55, 0x34, 0x6a, 0xfe, 0x4e, 0x6d, 0x62, 0xd3, 0x8e, 0xb3, 0x18,
- 0x1c, 0x91, 0x3f, 0xe4, 0x35, 0x9e, 0xd8, 0xe6, 0x4d, 0xc7, 0x2c, 0xce,
- 0x5e, 0x77, 0x07, 0x09, 0x98, 0xb2, 0xca, 0xaf, 0x29, 0x78, 0xd4, 0x85,
- 0xbe, 0xbb, 0x8e, 0x04, 0x81, 0x5a, 0x52, 0xc6, 0xea, 0xa6, 0xe7, 0xb9,
- 0x0c, 0x9a, 0x00, 0x50, 0x08, 0x60, 0x53, 0xa5, 0xf6, 0x8c, 0x76, 0x87,
- 0xe4, 0x4f, 0x13, 0xd1, 0xe3, 0x59, 0xd9, 0x33, 0xa3, 0xa3, 0x7b, 0xc7,
- 0x79, 0x89, 0x15, 0xba, 0xac, 0x67, 0x09, 0xc9, 0xcd, 0x27, 0x8d, 0x0a,
- 0x70, 0xf6, 0x2b, 0x77, 0x9b, 0x63, 0x5e, 0x0c, 0x23, 0x11, 0x14, 0xad,
- 0xda, 0xdb, 0xdb, 0xff, 0x6c, 0xb8, 0x6b, 0xfe, 0x9f, 0x59, 0x14, 0xd1,
- 0x8f, 0x98, 0x02, 0x80, 0x33, 0xb7, 0xf9, 0x53, 0xfc, 0x74, 0x92, 0x76,
- 0xf7, 0x90, 0xbd, 0xe0, 0xca, 0xea, 0xba, 0x17, 0x8f, 0x8f, 0xcb, 0xa0,
- 0x5b, 0xb7, 0x0a, 0xad, 0xa5, 0xbd, 0x51, 0xd2, 0xa9, 0xfc, 0x44, 0x8f,
- 0x79, 0xb5, 0x9c, 0x45, 0x70, 0x1e, 0x9e, 0xc7, 0x95, 0x14, 0xb4, 0xd9,
- 0xad, 0xf8, 0x5b, 0xbf, 0x21, 0xf1, 0xc4, 0xa9, 0x08, 0xc3, 0x56, 0x94,
- 0xfc, 0x45, 0x2b, 0x4a, 0x7e, 0x24, 0x56, 0x1b, 0x84, 0xf3, 0xc0, 0x9c,
- 0x87, 0x97, 0xe5, 0xd5, 0x55, 0x9d, 0x35, 0xdd, 0x3b, 0xe8, 0x48, 0x1e,
- 0xd9, 0xb9, 0x00, 0x93, 0x0c, 0x84, 0x95, 0xa2, 0x85, 0x93, 0x76, 0xb2,
- 0x75, 0x22, 0xb0, 0x04, 0x96, 0x5c, 0xdc, 0xdc, 0x30, 0x82, 0x8b, 0xf4,
- 0x7f, 0xaf, 0x91, 0x43, 0xce, 0x75, 0xd2, 0x14, 0x5e, 0xb8, 0x67, 0x39,
- 0x3b, 0x57, 0x2e, 0xbb, 0x2e, 0xfd, 0x85, 0x9e, 0x8a, 0x8f, 0xf9, 0x62,
- 0x41, 0x16, 0x0e, 0xf3, 0x56, 0x60, 0xe7, 0x5a, 0x27, 0xfb, 0x38, 0x33,
- 0x5b, 0x15, 0xbb, 0x59, 0xe1, 0x23, 0x46, 0x4f, 0x9e, 0xc8, 0xb5, 0x3f,
- 0xce, 0xcc, 0xb1, 0xcd, 0x42, 0xad, 0x9d, 0xfa, 0xe3, 0x25, 0x2b, 0x4b,
- 0x8e, 0xe5, 0x94, 0x12, 0x93, 0x8b, 0x54, 0xa5, 0xcc, 0x95, 0x97, 0xc6,
- 0x27, 0xf9, 0x0b, 0x31, 0x0c, 0x93, 0x43, 0x97, 0x5b, 0x97, 0xdb, 0xe8,
- 0xe4, 0x7f, 0x1e, 0xbb, 0xd4, 0x72, 0x9b, 0xbb, 0xcd, 0x08, 0xdd, 0x18,
- 0xf2, 0xd9, 0xec, 0xa9, 0xc1, 0x91, 0x59, 0xaf, 0x1e, 0xba, 0xe2, 0x42,
- 0x90, 0x65, 0x07, 0x41, 0x0a, 0xd3, 0x87, 0x94, 0x09, 0x28, 0x44, 0x3b,
- 0x94, 0xcd, 0x15, 0xdc, 0x0e, 0x4c, 0x06, 0xc4, 0xae, 0x44, 0x19, 0x23,
- 0x0e, 0x48, 0x23, 0xc0, 0x7f, 0x1f, 0x26, 0x2b, 0xfa, 0xe2, 0x4e, 0x5e,
- 0x90, 0xd6, 0xc8, 0x3a, 0x4c, 0x80, 0x22, 0xd5, 0x54, 0x1e, 0xce, 0x61,
- 0x5d, 0x36, 0xff, 0xc4, 0x30, 0x43, 0x45, 0xfb, 0x17, 0xe4, 0x24, 0xde,
- 0xa6, 0x9e, 0xf0, 0xa6, 0x26, 0x52, 0xa4, 0xc1, 0x5f, 0x8d, 0xa1, 0xfd,
- 0x52, 0x3d, 0x15, 0xab, 0x92, 0xbd, 0xd4, 0xaf, 0x41, 0xa8, 0x4f, 0xd8,
- 0x61, 0xd8, 0x1b, 0x36, 0xeb, 0x58, 0xa7, 0x9a, 0x5d, 0x2a, 0x29, 0xd4,
- 0x19, 0x30, 0x2e, 0x75, 0x65, 0xfd, 0x15, 0x52, 0x99, 0x6d, 0x6a, 0xab,
- 0x97, 0xfe, 0x31, 0x24, 0x40, 0xed, 0x8c, 0x5b, 0xa8, 0x19, 0x69, 0x23,
- 0x6d, 0xa8, 0xdd, 0x90, 0x07, 0xd7, 0x6e, 0x5e, 0x0c, 0xe6, 0xd9, 0x1c,
- 0x20, 0x40, 0x7e, 0xd6, 0x48, 0xc4, 0x92, 0xd4, 0x70, 0xdd, 0x8e, 0xbc,
- 0x44, 0x6c, 0x89, 0x37, 0x12, 0x34, 0x86, 0x66, 0x8b, 0xcf, 0x86, 0x60,
- 0xa0, 0xb2, 0x60, 0xb7, 0x23, 0x7c, 0x85, 0xfc, 0x71, 0x72, 0x91, 0x7d,
- 0x34, 0xea, 0x73, 0xd1, 0xa7, 0x9f, 0x22, 0x97, 0xc6, 0x4b, 0xac, 0xa0,
- 0xee, 0x36, 0x59, 0xc1, 0x58, 0xf5, 0x88, 0x3a, 0xeb, 0x3d, 0x2b, 0x8f,
- 0x7a, 0x9e, 0x94, 0x77, 0x59, 0x23, 0x21, 0x45, 0xee, 0xbc, 0xc2, 0xc9,
- 0x01, 0x49, 0x3f, 0xb9, 0xea, 0x34, 0x07, 0x12, 0x90, 0xac, 0x71, 0x3e,
- 0x21, 0x08, 0x58, 0xa6, 0x21, 0x63, 0xe6, 0x03, 0x72, 0x7b, 0xf6, 0xcd,
- 0x31, 0xe8, 0xa9, 0x0b, 0x96, 0x47, 0x20, 0x1b, 0x25, 0xe2, 0x98, 0xa1,
- 0xee, 0x90, 0xa7, 0xa8, 0x99, 0xc6, 0xf6, 0x24, 0xab, 0xbf, 0x7a, 0x20,
- 0x85, 0x10, 0x46, 0x36, 0x28, 0x43, 0xb3, 0x8d, 0x36, 0x81, 0x08, 0x9f,
- 0xfb, 0x9a, 0x20, 0x34, 0xb0, 0xd1, 0xbb, 0xe9, 0x44, 0x2e, 0x31, 0x86,
- 0x42, 0xab, 0xd5, 0x54, 0x9d, 0x23, 0xda, 0x51, 0x23, 0x85, 0xc5, 0x34,
- 0xba, 0x4b, 0xb1, 0xd3, 0x6c, 0xfb, 0x79, 0x44, 0x0b, 0xf1, 0x70, 0x31,
- 0x83, 0xb1, 0xdb, 0xce, 0x2e, 0x29, 0x3a, 0xea, 0x9a, 0x95, 0x87, 0x68,
- 0xcf, 0x9b, 0x8b, 0x65, 0x13, 0x92, 0x45, 0x92, 0x63, 0x90, 0x67, 0x6c,
- 0x27, 0x85, 0xa7, 0xf0, 0xee, 0xa6, 0x9c, 0xb1, 0x65, 0x1c, 0x44, 0x58,
- 0x6c, 0xd6, 0x12, 0x52, 0x76, 0x09, 0xe7, 0x05, 0xc7, 0xf2, 0x2d, 0x20,
- 0x64, 0xad, 0x28, 0x89, 0x51, 0xf1, 0xb2, 0x94, 0x10, 0xd2, 0x02, 0xa2,
- 0x4c, 0x06, 0xb7, 0x61, 0x8e, 0x87, 0x39, 0xe7, 0xe3, 0xb2, 0xb6, 0xfb,
- 0x85, 0x72, 0x83, 0xe8, 0x06, 0xb9, 0x4b, 0x2b, 0x08, 0x66, 0xe1, 0x3e,
- 0x50, 0xa6, 0x26, 0x1f, 0x4b, 0x42, 0xda, 0x60, 0x17, 0x00, 0x9b, 0x53,
- 0x3e, 0x9d, 0xd9, 0x26, 0x46, 0x07, 0x20, 0x37, 0x2d, 0xf6, 0x0e, 0x35,
- 0x29, 0xac, 0x06, 0x37, 0xe0, 0x1c, 0x93, 0xa4, 0x3b, 0x73, 0x0e, 0x6f,
- 0xe8, 0x5a, 0xcf, 0x9b, 0x65, 0xda, 0x3c, 0x0e, 0xc1, 0xb7, 0x4a, 0x36,
- 0xb1, 0x70, 0xf2, 0x71, 0x4a, 0x91, 0x50, 0x02, 0xb6, 0xed, 0x8a, 0x80,
- 0x9b, 0xbf, 0x90, 0x2f, 0xe9, 0xac, 0xad, 0x90, 0x47, 0xe7, 0xa0, 0x67,
- 0xb9, 0x69, 0xe7, 0xf7, 0x23, 0x95, 0x48, 0xae, 0x11, 0xc5, 0xe8, 0x73,
- 0x53, 0x7a, 0xcb, 0x9f, 0x34, 0x21, 0x26, 0x0d, 0xf1, 0x2f, 0xd3, 0x8b,
- 0xd9, 0xbd, 0x6b, 0xd0, 0xcb, 0xf2, 0x51, 0xa4, 0x9f, 0xc7, 0x7d, 0x62,
- 0xbf, 0x90, 0xa4, 0x5d, 0xad, 0x66, 0x64, 0x94, 0x6f, 0xfe, 0xe6, 0x41,
- 0x4f, 0xbc, 0xc6, 0x43, 0x9b, 0x1b, 0x2f, 0xc2, 0x43, 0xc0, 0xe5, 0x16,
- 0x07, 0x2c, 0x3e, 0x7b, 0x3a, 0xf5, 0xdd, 0xe6, 0x88, 0xec, 0x70, 0xef,
- 0xd5, 0x77, 0x87, 0xa7, 0xef, 0x8f, 0xf7, 0xfe, 0x9c, 0xd0, 0xbf, 0xf6,
- 0xf9, 0x5f, 0xfb, 0xbd, 0xd8, 0x2a, 0x19, 0xf9, 0xb4, 0xf9, 0x6a, 0x33,
- 0xa9, 0xef, 0xe7, 0xe3, 0x72, 0x66, 0xd7, 0x49, 0xa6, 0x42, 0x43, 0x65,
- 0x7d, 0xb9, 0xbc, 0x6d, 0xd2, 0x99, 0x78, 0xc8, 0xbb, 0x92, 0xba, 0x16,
- 0x0c, 0x8a, 0x4a, 0x19, 0xc4, 0xe8, 0xfc, 0xf4, 0xa7, 0x06, 0x19, 0x62,
- 0x2a, 0xba, 0x24, 0x5a, 0xb7, 0x0a, 0x17, 0x84, 0xbb, 0x48, 0xcf, 0x73,
- 0x1d, 0x11, 0x18, 0x92, 0x6c, 0xc9, 0xbb, 0x1f, 0x3e, 0x71, 0x71, 0x5a,
- 0xb2, 0xac, 0x08, 0x04, 0xbf, 0x11, 0x4b, 0x38, 0x4b, 0x96, 0xd9, 0x4f,
- 0x5b, 0x20, 0x55, 0x9e, 0xe6, 0x96, 0xd8, 0x66, 0xee, 0x25, 0x7d, 0x72,
- 0xb3, 0xca, 0xac, 0xd8, 0xc5, 0xd0, 0x83, 0xd8, 0xc3, 0x7c, 0x2c, 0x5a,
- 0x8b, 0x47, 0xb5, 0x70, 0x4a, 0x9b, 0x71, 0x56, 0x8a, 0x69, 0xa2, 0x79,
- 0x2d, 0x15, 0xf2, 0x40, 0x9d, 0x27, 0x23, 0xf1, 0xc8, 0xf5, 0x2c, 0x27,
- 0x90, 0x90, 0xea, 0xb4, 0x62, 0x7e, 0xec, 0x64, 0x8e, 0x26, 0xc0, 0x78,
- 0x82, 0x5f, 0x55, 0x30, 0xcd, 0x91, 0xe2, 0xd0, 0xa8, 0x48, 0x72, 0x8e,
- 0x02, 0xf0, 0xfe, 0x21, 0x94, 0xcd, 0x2c, 0x0d, 0x86, 0x82, 0x43, 0x20,
- 0x09, 0xb6, 0xc9, 0x96, 0xdb, 0x8f, 0x66, 0xbd, 0xee, 0x67, 0xd9, 0xb6,
- 0xd5, 0xd4, 0xf5, 0xee, 0xd9, 0x79, 0x5b, 0xfe, 0xdd, 0xcc, 0x79, 0xaa,
- 0x33, 0x19, 0xbb, 0xc3, 0xe4, 0x4a, 0x8a, 0xf5, 0x5c, 0x2e, 0x39, 0x77,
- 0xe2, 0x39, 0xeb, 0xcc, 0x3f, 0xc7, 0x2d, 0x83, 0x15, 0x1c, 0x7a, 0x46,
- 0x51, 0xa2, 0x94, 0xab, 0x60, 0x11, 0x5a, 0xd7, 0x95, 0x7f, 0x41, 0xe9,
- 0x84, 0x98, 0x1d, 0x56, 0xf2, 0xc6, 0xf3, 0xd6, 0x5d, 0xcd, 0xaf, 0xae,
- 0x48, 0xed, 0xea, 0x38, 0x2b, 0x2e, 0x86, 0xe3, 0x4f, 0x59, 0x35, 0xa1,
- 0xec, 0x55, 0x73, 0x21, 0x2c, 0xd9, 0x08, 0xb5, 0xac, 0x31, 0x08, 0x8f,
- 0x59, 0xf4, 0xbc, 0xe7, 0x59, 0x29, 0x9c, 0x2b, 0x6b, 0xe5, 0xda, 0xd3,
- 0x46, 0x2c, 0x27, 0x66, 0x13, 0x0f, 0x2d, 0xd1, 0x88, 0x5e, 0x58, 0xed,
- 0x73, 0xad, 0x39, 0x00, 0xf0, 0xf0, 0x07, 0x28, 0x1b, 0x99, 0x61, 0x67,
- 0x64, 0x7a, 0x6b, 0x2a, 0x5b, 0x86, 0xba, 0xc3, 0xcc, 0x11, 0x2e, 0xe6,
- 0xc3, 0xb9, 0xf7, 0xab, 0x21, 0x45, 0x76, 0x6d, 0x90, 0x12, 0x8c, 0x00,
- 0x46, 0x71, 0xaf, 0x19, 0xfb, 0x5b, 0xb8, 0xc6, 0x58, 0x59, 0x53, 0x66,
- 0x17, 0x68, 0x42, 0x61, 0x3e, 0xd3, 0xac, 0xbc, 0xa3, 0xb0, 0x48, 0x87,
- 0x68, 0x69, 0x5e, 0x4e, 0x79, 0x3b, 0x8c, 0xef, 0x2d, 0x4b, 0xea, 0x80,
- 0x94, 0x17, 0xfe, 0xee, 0x30, 0x8e, 0xdf, 0x6c, 0x4b, 0x84, 0x0e, 0x52,
- 0x3c, 0x75, 0x38, 0xf1, 0x86, 0xdd, 0xbb, 0x7c, 0xdd, 0x0b, 0x81, 0x49,
- 0x9d, 0xce, 0xa3, 0x17, 0x0d, 0x46, 0x3c, 0x2e, 0x89, 0x3d, 0x4b, 0xf6,
- 0x15, 0x06, 0x4c, 0x8b, 0x68, 0xac, 0xd5, 0x06, 0x4a, 0xb9, 0x9a, 0x65,
- 0x8d, 0x40, 0xc2, 0xc4, 0x7f, 0x13, 0x84, 0x00, 0x3f, 0x12, 0xc5, 0x06,
- 0x8d, 0xd0, 0xd2, 0x84, 0x11, 0xbd, 0x5b, 0x01, 0x44, 0x1f, 0xed, 0x4c,
- 0x63, 0x90, 0x32, 0x7b, 0x8c, 0xf9, 0x28, 0x2d, 0x57, 0x5e, 0xd7, 0xcb,
- 0x8c, 0x53, 0xec, 0xc2, 0xbb, 0x42, 0xa6, 0x1a, 0x57, 0x80, 0xb7, 0xa4,
- 0xc9, 0x16, 0xa7, 0xd5, 0xa3, 0x23, 0xe8, 0x32, 0x67, 0xdb, 0x12, 0xac,
- 0x7d, 0x2c, 0x2f, 0xd5, 0x74, 0x8c, 0x23, 0xf8, 0xa9, 0x96, 0x4e, 0xb9,
- 0xe2, 0xd0, 0xfe, 0xc3, 0x86, 0x46, 0x60, 0x78, 0x55, 0x35, 0x53, 0x95,
- 0x81, 0xec, 0xcd, 0x82, 0x18, 0x31, 0xe5, 0xa1, 0xf0, 0x4a, 0x5d, 0x58,
- 0x0c, 0x9a, 0x7e, 0x77, 0x14, 0x8b, 0x29, 0x13, 0x9c, 0x5a, 0xd5, 0x1f,
- 0xea, 0x8b, 0x47, 0x3a, 0x54, 0x97, 0x72, 0x20, 0xf1, 0x81, 0x96, 0xa0,
- 0x89, 0xe4, 0xde, 0x77, 0x65, 0x80, 0x1f, 0xf7, 0x68, 0x31, 0x62, 0xb0,
- 0x6b, 0x65, 0xee, 0xcb, 0x07, 0xf3, 0x22, 0x6e, 0xc6, 0x81, 0xd9, 0xff,
- 0x75, 0x2c, 0x7e, 0xa8, 0xb7, 0xeb, 0xa4, 0x2c, 0xfe, 0xba, 0x2c, 0x26,
- 0x9d, 0xdb, 0xa3, 0xec, 0x7b, 0xcc, 0x47, 0x12, 0x2c, 0xb5, 0x40, 0x9a,
- 0xee, 0xc6, 0xc7, 0x87, 0xac, 0x03, 0x8f, 0xd2, 0x76, 0x08, 0x6b, 0x4b,
- 0x77, 0xcf, 0xcc, 0x4b, 0xf0, 0xb9, 0xc9, 0xcd, 0x1a, 0x55, 0x93, 0x1b,
- 0xa4, 0x24, 0x92, 0x7f, 0x27, 0x9b, 0xf2, 0x9d, 0x1b, 0x87, 0xff, 0x70,
- 0xab, 0xa2, 0x27, 0xe5, 0x24, 0x91, 0x28, 0xf7, 0xb8, 0x2c, 0x54, 0x4a,
- 0x07, 0xdd, 0xd4, 0x7e, 0x86, 0x60, 0xc8, 0x1b, 0x88, 0xc0, 0x6c, 0x56,
- 0x67, 0x5e, 0x18, 0xdf, 0xbe, 0xe7, 0xac, 0x11, 0xd8, 0xc6, 0x05, 0xbc,
- 0xa5, 0x10, 0x67, 0x57, 0xf1, 0x84, 0x25, 0x84, 0x43, 0xa5, 0x37, 0x64,
- 0xeb, 0xd1, 0x3e, 0xb9, 0xd7, 0xd4, 0x75, 0x79, 0x5d, 0x77, 0x9d, 0xa6,
- 0xae, 0x07, 0xb7, 0x4f, 0xa9, 0xd3, 0x26, 0xd9, 0xe0, 0x3a, 0x4f, 0xb9,
- 0x12, 0x5b, 0xf2, 0x3e, 0x21, 0xdf, 0x82, 0xe9, 0x0a, 0x73, 0x20, 0x53,
- 0x54, 0xca, 0xf4, 0xfb, 0xaa, 0x59, 0x0c, 0xa2, 0x4b, 0x80, 0xb5, 0x6e,
- 0x6f, 0x81, 0xd9, 0x15, 0xa7, 0xfe, 0x83, 0x27, 0x99, 0x69, 0x4f, 0x6e,
- 0x09, 0x70, 0x9d, 0x9c, 0xbe, 0x61, 0xef, 0xda, 0xd1, 0x05, 0xfd, 0x2d,
- 0xb7, 0xcc, 0x07, 0x43, 0x9c, 0x0a, 0xa2, 0x35, 0x86, 0x58, 0x7d, 0xfb,
- 0x5d, 0x37, 0x57, 0x66, 0xeb, 0x6c, 0xb4, 0xf3, 0xe4, 0xc5, 0x6e, 0x98,
- 0xbf, 0xbd, 0x45, 0x9f, 0x70, 0x8c, 0x30, 0x9f, 0x0d, 0x9f, 0xee, 0x0e,
- 0x77, 0xb7, 0x3b, 0xbd, 0xa1, 0xb9, 0x16, 0x80, 0x55, 0x0c, 0xf8, 0xa7,
- 0x3c, 0x96, 0x72, 0xd0, 0x78, 0x0e, 0x5c, 0xaa, 0xb3, 0xe2, 0x1d, 0xfd,
- 0x8c, 0x9f, 0x8b, 0xec, 0xd6, 0x6c, 0xb4, 0x98, 0x31, 0x9c, 0x9c, 0xe6,
- 0xb5, 0x18, 0x1b, 0x74, 0x9b, 0xe9, 0xed, 0x42, 0x29, 0x75, 0xed, 0x34,
- 0x37, 0x3c, 0x42, 0xb7, 0x25, 0x43, 0x10, 0x22, 0x41, 0x90, 0xda, 0x74,
- 0xaa, 0x02, 0x38, 0x0e, 0xa1, 0xf6, 0xdf, 0xdd, 0x01, 0xe2, 0x39, 0xf4,
- 0xf6, 0x5e, 0x0c, 0x3f, 0xf3, 0xd7, 0x94, 0xd4, 0xf0, 0x41, 0x5a, 0x4f,
- 0xf2, 0x7c, 0xad, 0x8d, 0xa1, 0xb4, 0x22, 0x7f, 0x5d, 0x82, 0xdb, 0xc4,
- 0x6c, 0xd3, 0x3c, 0xe5, 0x08, 0xaa, 0xa3, 0x84, 0x0a, 0x9a, 0x25, 0x35,
- 0xd2, 0xec, 0xb1, 0x07, 0xdb, 0x25, 0x9e, 0x6a, 0xe1, 0xb0, 0x83, 0x47,
- 0x6f, 0x86, 0x33, 0xdd, 0x51, 0xa3, 0x8a, 0x32, 0x11, 0x12, 0x14, 0xf2,
- 0x8b, 0x07, 0x3b, 0xd6, 0x48, 0x09, 0x70, 0x62, 0x9a, 0xb9, 0xaf, 0x4b,
- 0x9a, 0xa7, 0x28, 0xb8, 0x1f, 0x8a, 0x0c, 0x33, 0x81, 0x39, 0x03, 0xc7,
- 0x9e, 0x7f, 0x81, 0xe9, 0x7c, 0xe9, 0x61, 0x6a, 0x9c, 0x7e, 0x99, 0x46,
- 0x94, 0x41, 0xa6, 0x31, 0x45, 0xd0, 0x3a, 0x91, 0x71, 0x28, 0xb9, 0xae,
- 0x83, 0x6d, 0x08, 0xb7, 0x2e, 0xf0, 0x76, 0x34, 0x59, 0x32, 0x3b, 0x11,
- 0xce, 0x8a, 0x3e, 0x8d, 0x10, 0x2c, 0x49, 0xe2, 0xbf, 0x2c, 0xb2, 0x3b,
- 0x12, 0xc8, 0xb5, 0x28, 0x14, 0x55, 0x95, 0x93, 0x3b, 0x47, 0xa3, 0xfe,
- 0x29, 0x40, 0x7a, 0x19, 0x2e, 0xe8, 0x69, 0x24, 0x01, 0x6f, 0x82, 0xc3,
- 0x59, 0x5b, 0xd6, 0xa9, 0x02, 0x34, 0x3f, 0x44, 0x5b, 0xf3, 0x2b, 0x37,
- 0x9c, 0xb0, 0xa3, 0x15, 0x4c, 0x3e, 0xab, 0xb8, 0x8b, 0x88, 0x54, 0x63,
- 0xe4, 0x04, 0xbb, 0x45, 0x98, 0xf6, 0x03, 0x13, 0x9d, 0xd6, 0x42, 0x99,
- 0x3d, 0xe6, 0x59, 0x5a, 0xb3, 0x75, 0xaa, 0xf4, 0x6e, 0xed, 0xbe, 0x11,
- 0x7f, 0x8c, 0xb7, 0x73, 0x64, 0xbe, 0x67, 0x70, 0x96, 0x78, 0x3c, 0x65,
- 0xe4, 0x21, 0xf0, 0x00, 0x7b, 0xdd, 0x93, 0xc8, 0xec, 0xb8, 0x4c, 0x4d,
- 0x6b, 0x26, 0xb3, 0x11, 0xfb, 0x86, 0x15, 0xa9, 0x2f, 0xd7, 0xe0, 0xdb,
- 0x9d, 0x53, 0xd1, 0x8d, 0xa2, 0xe5, 0x39, 0xef, 0x50, 0x1d, 0x61, 0x58,
- 0xe6, 0xca, 0x63, 0x80, 0xf8, 0x2f, 0x39, 0x14, 0x7d, 0xbb, 0x97, 0x44,
- 0xfb, 0x67, 0xbf, 0x90, 0x37, 0x46, 0xe5, 0xc4, 0x8a, 0x21, 0x01, 0xd9,
- 0x4f, 0x4e, 0xbb, 0x0a, 0x89, 0xea, 0x96, 0xeb, 0x64, 0x91, 0x55, 0x24,
- 0x05, 0x01, 0x38, 0x1e, 0x28, 0xd8, 0x35, 0x76, 0xb1, 0xc0, 0x36, 0x3f,
- 0xfa, 0xfa, 0x04, 0xf8, 0x5f, 0x73, 0xec, 0xc9, 0x6a, 0x66, 0xb2, 0x28,
- 0x0c, 0x81, 0xe9, 0xc9, 0xed, 0x39, 0xb9, 0xce, 0x1d, 0x8c, 0x3c, 0xd4,
- 0x42, 0x55, 0x47, 0x56, 0x55, 0x58, 0xe0, 0x8d, 0xa2, 0xd3, 0x52, 0x60,
- 0x81, 0xf4, 0x51, 0x0d, 0x10, 0xa6, 0x0e, 0x8c, 0x1d, 0x9f, 0x2f, 0x7c,
- 0x5a, 0xb3, 0x97, 0xd3, 0x5a, 0x82, 0x80, 0x50, 0x2c, 0x02, 0xb8, 0xb1,
- 0xdb, 0xb0, 0xcc, 0xf5, 0x9e, 0x85, 0xd0, 0x29, 0xf9, 0x7e, 0xbc, 0x18,
- 0x03, 0x6f, 0x38, 0x47, 0x63, 0x8f, 0xaf, 0xd8, 0xb9, 0x53, 0xb7, 0x1f,
- 0x0f, 0x00, 0x80, 0x7f, 0xf6, 0xca, 0xa4, 0x2b, 0x9a, 0xa3, 0x81, 0xfd,
- 0x87, 0xc0, 0x62, 0xcd, 0xc9, 0xc6, 0x15, 0xa9, 0x59, 0x18, 0x7e, 0x53,
- 0x8e, 0xcc, 0x46, 0x80, 0x93, 0xf1, 0xe6, 0xc8, 0x5e, 0x49, 0x5e, 0x71,
- 0xe2, 0xd8, 0x97, 0x89, 0x78, 0x3d, 0xcc, 0x91, 0x55, 0xaa, 0x48, 0x47,
- 0x5f, 0x8c, 0xce, 0x73, 0xa6, 0x03, 0x4d, 0x43, 0xbc, 0x39, 0x0e, 0x92,
- 0x79, 0xb3, 0xc7, 0x5b, 0x8e, 0xc8, 0x28, 0x6b, 0xe6, 0xfb, 0xff, 0x97,
- 0xee, 0xe4, 0xbd, 0x7a, 0x78, 0xf6, 0x7e, 0xe1, 0xe4, 0x3d, 0x30, 0x7b,
- 0x4c, 0xea, 0xaa, 0x60, 0xcb, 0x57, 0x9e, 0xa7, 0x07, 0x78, 0x01, 0x36,
- 0x14, 0xac, 0xc7, 0xa7, 0x2d, 0x65, 0x3c, 0xa3, 0xe8, 0xd5, 0x6f, 0xb6,
- 0xea, 0xd8, 0x8d, 0xda, 0xfb, 0x78, 0x73, 0x1c, 0xf2, 0x28, 0x86, 0x2d,
- 0xe2, 0x21, 0x51, 0x17, 0xf1, 0x3a, 0xd9, 0x79, 0x9f, 0xcc, 0xf6, 0x6f,
- 0x78, 0x2b, 0xe3, 0xec, 0xd1, 0xe7, 0xe2, 0xcd, 0x69, 0xb2, 0x89, 0x28,
- 0x8d, 0xc1, 0xf8, 0xbe, 0xd4, 0x4b, 0xea, 0xc1, 0xc1, 0xb5, 0xbc, 0x4c,
- 0x40, 0xa7, 0x88, 0x83, 0xce, 0xa2, 0x94, 0x12, 0x2f, 0x7e, 0x10, 0x6f,
- 0xce, 0xa3, 0x42, 0xa2, 0xed, 0xa8, 0x97, 0xd7, 0x76, 0xbf, 0x3d, 0x61,
- 0x44, 0xef, 0x82, 0xa6, 0xe1, 0x48, 0x5f, 0x3d, 0x57, 0x39, 0x0c, 0x53,
- 0x59, 0x3e, 0xe2, 0x6b, 0x8d, 0x2e, 0xdf, 0xff, 0xd7, 0x87, 0x08, 0xbe,
- 0x66, 0xeb, 0xf9, 0xc4, 0x30, 0xc5, 0x99, 0xe4, 0x36, 0xc5, 0x35, 0x8c,
- 0xfc, 0x82, 0x81, 0xda, 0x2d, 0x66, 0xf5, 0x00, 0x3c, 0x00, 0x03, 0xbc,
- 0x8f, 0x98, 0xdd, 0x0c, 0x81, 0xcd, 0x9c, 0xf9, 0x1f, 0x5f, 0xd9, 0x9b,
- 0x67, 0x3a, 0xa0, 0xe1, 0x0d, 0x64, 0xd3, 0xf2, 0x4e, 0x5c, 0xb3, 0x59,
- 0xed, 0xf6, 0xec, 0xec, 0xcc, 0x71, 0xe6, 0x0d, 0xd9, 0xdb, 0x81, 0xab,
- 0x6f, 0x47, 0x65, 0x19, 0x93, 0xeb, 0xbd, 0x75, 0x59, 0xee, 0x7d, 0xde,
- 0xba, 0x2c, 0xdd, 0x3b, 0x6b, 0x75, 0x80, 0x11, 0xa7, 0x6e, 0x28, 0x59,
- 0xb3, 0x68, 0x8b, 0x78, 0x0f, 0x3a, 0x18, 0x48, 0x7e, 0x35, 0xae, 0xef,
- 0xf9, 0xc5, 0xbb, 0x3a, 0x80, 0x20, 0x54, 0x7c, 0x7b, 0x18, 0x41, 0x17,
- 0xe8, 0xf1, 0xc9, 0xb8, 0x2a, 0xef, 0xc0, 0x40, 0x02, 0x88, 0x88, 0xf0,
- 0xba, 0xa5, 0x4a, 0x4b, 0x72, 0x13, 0x44, 0xf3, 0xcd, 0xf4, 0xce, 0x98,
- 0x7a, 0x8f, 0xd6, 0xec, 0x9b, 0xcb, 0xb7, 0xa7, 0x4c, 0xf9, 0xca, 0x59,
- 0x60, 0x94, 0xb4, 0xc2, 0x56, 0x68, 0xbd, 0x1c, 0xcf, 0xcd, 0x06, 0x30,
- 0xfa, 0x49, 0xc3, 0xe2, 0x4c, 0x24, 0x64, 0x90, 0xa9, 0x86, 0xa8, 0x90,
- 0xc4, 0x14, 0x17, 0x31, 0x5f, 0xbf, 0xf8, 0x82, 0x5c, 0x2c, 0x4d, 0x16,
- 0x17, 0x69, 0x53, 0xab, 0x01, 0x26, 0x3b, 0x9f, 0x06, 0x77, 0x77, 0x77,
- 0x03, 0xea, 0x9c, 0x53, 0x4c, 0xc8, 0x62, 0x3b, 0x62, 0x5c, 0x05, 0x14,
- 0xa9, 0x37, 0xb4, 0x14, 0xf4, 0x48, 0x70, 0xfa, 0x3c, 0x4d, 0x0d, 0x85,
- 0x09, 0x40, 0xac, 0x68, 0x27, 0x90, 0xd4, 0x2e, 0xcb, 0x4a, 0x0c, 0x1e,
- 0x8e, 0xb4, 0xad, 0x6c, 0x75, 0x45, 0xda, 0x5a, 0xe5, 0x8b, 0xf4, 0x10,
- 0x52, 0x88, 0xe4, 0x58, 0x2d, 0x96, 0x15, 0x08, 0x5e, 0xd9, 0xc0, 0x88,
- 0x22, 0xb7, 0x35, 0xb0, 0xa0, 0x9e, 0x7d, 0x1b, 0x1e, 0x6b, 0x99, 0x26,
- 0xca, 0xa4, 0x4a, 0xed, 0xb7, 0xa5, 0x7a, 0x37, 0x88, 0x04, 0xd6, 0x0b,
- 0xe0, 0xf1, 0xb1, 0x98, 0x66, 0xa7, 0x99, 0xd6, 0x51, 0x27, 0x20, 0x85,
- 0x37, 0x37, 0xd0, 0xf0, 0x62, 0x3a, 0xb6, 0x23, 0x19, 0xae, 0x1d, 0xaf,
- 0xac, 0x2a, 0xdb, 0xe0, 0xfe, 0x00, 0xdb, 0x07, 0x88, 0x65, 0x7d, 0x6f,
- 0x39, 0xb9, 0x63, 0x06, 0x41, 0x04, 0x51, 0xe3, 0x90, 0xaa, 0x98, 0xcb,
- 0xdc, 0xe4, 0xe4, 0x32, 0x69, 0x59, 0x4f, 0x6c, 0x19, 0xce, 0xb3, 0xea,
- 0xda, 0xa3, 0x44, 0x8b, 0xe9, 0x8a, 0xa9, 0xc7, 0xfb, 0x92, 0x24, 0xff,
- 0x3a, 0xe0, 0x2b, 0x15, 0x02, 0x69, 0xc9, 0xde, 0x65, 0xfc, 0x62, 0x73,
- 0x30, 0x95, 0xbb, 0x73, 0x9a, 0x16, 0x66, 0x22, 0xe8, 0xc4, 0x86, 0x10,
- 0x8b, 0xd9, 0xec, 0xd5, 0xac, 0x5c, 0xd6, 0xf7, 0x9b, 0x89, 0x90, 0x7c,
- 0x0b, 0x2f, 0x6e, 0x23, 0x70, 0x10, 0xe0, 0x62, 0x26, 0x37, 0xcb, 0xe2,
- 0xa3, 0x9a, 0x3b, 0x84, 0x77, 0xaf, 0xd9, 0xb7, 0xd8, 0x69, 0x6e, 0xd3,
- 0xfb, 0xda, 0xbf, 0xfa, 0x6d, 0xc7, 0x66, 0x19, 0xb1, 0x61, 0xd8, 0x78,
- 0x8f, 0x32, 0xf1, 0x5a, 0x31, 0xa8, 0x34, 0x1a, 0xb6, 0xb6, 0x69, 0x0b,
- 0xf0, 0xe1, 0xd9, 0x56, 0xe9, 0xe2, 0x60, 0x22, 0x3a, 0x65, 0xa6, 0x6c,
- 0xc5, 0xff, 0x57, 0xa4, 0x30, 0xb8, 0xc2, 0x59, 0x9c, 0xc2, 0xe0, 0xd8,
- 0x78, 0x38, 0x3b, 0xda, 0x92, 0x62, 0xfb, 0x09, 0x53, 0xc3, 0xe4, 0xdc,
- 0xcc, 0xd7, 0x20, 0x88, 0xfc, 0x5c, 0xb7, 0x2f, 0xb1, 0xd4, 0xef, 0xf1,
- 0x34, 0x69, 0xb9, 0x19, 0x81, 0x50, 0x06, 0xea, 0xdc, 0x9a, 0x92, 0x01,
- 0xd2, 0x43, 0x0c, 0x4b, 0x4a, 0x63, 0x50, 0xd3, 0xd3, 0x7a, 0x8a, 0x89,
- 0x6d, 0x94, 0x72, 0x86, 0x29, 0x3a, 0xae, 0xd3, 0xcc, 0x8e, 0x76, 0x76,
- 0x73, 0x06, 0x67, 0xe6, 0x4b, 0x2f, 0xb5, 0x89, 0xbd, 0x43, 0x90, 0x03,
- 0x96, 0x7d, 0x34, 0x34, 0xbb, 0xbc, 0x73, 0x64, 0xc4, 0x4a, 0x30, 0x58,
- 0x46, 0x26, 0xae, 0x81, 0x34, 0xf9, 0x47, 0xdb, 0xbb, 0x6d, 0x9c, 0xd5,
- 0xd5, 0xbd, 0x82, 0x56, 0xfb, 0x0b, 0x1d, 0x65, 0x9b, 0x13, 0x81, 0xfc,
- 0xfa, 0x89, 0x42, 0xa5, 0xa4, 0x35, 0x71, 0x74, 0xf9, 0xa6, 0x5e, 0x36,
- 0xcb, 0xae, 0x79, 0x44, 0x2f, 0x4f, 0x8f, 0xbf, 0x3b, 0x3e, 0x0d, 0x2e,
- 0xb0, 0xaf, 0x47, 0xa3, 0x9d, 0x8f, 0x59, 0x35, 0x46, 0x29, 0x23, 0xb8,
- 0xbc, 0x93, 0x04, 0x4f, 0x5a, 0xbc, 0x8e, 0x27, 0xd7, 0xb5, 0xd2, 0x05,
- 0xa4, 0x2c, 0xcc, 0xa7, 0x30, 0xfa, 0x2f, 0x9f, 0x14, 0xda, 0x51, 0xa4,
- 0x90, 0x08, 0x30, 0x0c, 0xd7, 0xd4, 0xa4, 0xca, 0xa6, 0x5c, 0xea, 0x27,
- 0x84, 0x84, 0x15, 0xa4, 0xe6, 0x27, 0xc9, 0x6b, 0x2c, 0x25, 0x23, 0x83,
- 0x11, 0xfd, 0xb0, 0x83, 0x08, 0xde, 0x58, 0x94, 0xe6, 0x0a, 0xb9, 0x4f,
- 0x5e, 0xcb, 0x37, 0x6b, 0xda, 0xfd, 0x34, 0x17, 0x4c, 0xda, 0xc2, 0xd2,
- 0xfb, 0xec, 0xdb, 0xc1, 0xe1, 0x68, 0xf0, 0xfa, 0xf8, 0xf4, 0xf8, 0xeb,
- 0xc3, 0xcb, 0x63, 0x66, 0xd6, 0x54, 0x8a, 0xbd, 0x15, 0xca, 0x90, 0x2a,
- 0x41, 0xdf, 0xca, 0xc4, 0xf0, 0xcd, 0x4c, 0xf4, 0xac, 0x54, 0xe4, 0x0c,
- 0xac, 0xc9, 0x8e, 0xe8, 0x2b, 0x25, 0x1b, 0xa5, 0x69, 0xd5, 0x1a, 0xeb,
- 0x6e, 0x66, 0x73, 0x25, 0x49, 0x57, 0x83, 0x11, 0xa4, 0xb3, 0x3b, 0xaa,
- 0x9d, 0xf0, 0xbe, 0x20, 0x68, 0x74, 0x6e, 0x53, 0x00, 0x79, 0xf4, 0xde,
- 0xd4, 0x7b, 0x33, 0xdb, 0x5a, 0x60, 0x70, 0x50, 0xc6, 0xb5, 0x92, 0xe3,
- 0x82, 0x6b, 0x1f, 0x20, 0xf6, 0xf8, 0x1a, 0x0f, 0x76, 0xa8, 0x2e, 0x87,
- 0xd6, 0x9b, 0x46, 0x19, 0x88, 0xfa, 0xbb, 0x48, 0x86, 0x3a, 0xe2, 0x6f,
- 0xf5, 0xe4, 0x26, 0x9b, 0x5b, 0xbe, 0x0d, 0x8a, 0x39, 0x23, 0xc5, 0x93,
- 0x53, 0xe6, 0x84, 0x17, 0x00, 0xc7, 0x7c, 0x9c, 0xc1, 0xb8, 0x45, 0x40,
- 0xe7, 0x36, 0x90, 0xef, 0x00, 0x70, 0x10, 0x01, 0x2e, 0xf9, 0xe8, 0x09,
- 0x82, 0x81, 0xbc, 0xd0, 0x21, 0xc0, 0x62, 0x12, 0x07, 0x8e, 0x47, 0x7e,
- 0xa5, 0xc0, 0x47, 0xf7, 0xf2, 0xb7, 0x54, 0x9a, 0x1e, 0x05, 0x1e, 0x85,
- 0x76, 0xf0, 0x23, 0xc8, 0x4b, 0xb5, 0x84, 0xa8, 0x87, 0x51, 0x67, 0x5c,
- 0x8b, 0x3b, 0xc4, 0xe3, 0x2c, 0xee, 0x78, 0x9d, 0xb0, 0xab, 0x38, 0xe8,
- 0x59, 0x89, 0xb3, 0x33, 0x8a, 0xc2, 0x5d, 0x23, 0x18, 0x96, 0xf0, 0xba,
- 0xb1, 0xc2, 0x86, 0x6b, 0x53, 0x59, 0x3e, 0x79, 0x21, 0xed, 0x0f, 0x85,
- 0x1b, 0x57, 0xc0, 0xcf, 0x0f, 0x0a, 0x86, 0x16, 0x7b, 0x2e, 0xb1, 0x95,
- 0xea, 0x5f, 0x43, 0x8e, 0x63, 0x9b, 0x3c, 0x35, 0xc8, 0x16, 0x01, 0x65,
- 0xe4, 0xd6, 0x1b, 0xe5, 0x83, 0xb5, 0x77, 0x87, 0x5f, 0x10, 0xc1, 0x63,
- 0x2f, 0x3f, 0x3e, 0xbf, 0xe0, 0xaa, 0x84, 0xa7, 0xf4, 0x17, 0x09, 0xda,
- 0xd4, 0x31, 0x9a, 0x1b, 0xe1, 0xa3, 0x26, 0x90, 0x41, 0x06, 0xb7, 0xbf,
- 0x8d, 0xc5, 0x2a, 0xb6, 0x8c, 0xe1, 0x84, 0x42, 0xf5, 0x29, 0x07, 0x22,
- 0x96, 0x8b, 0xe8, 0x95, 0x4d, 0x42, 0x57, 0xa8, 0x0f, 0x42, 0xed, 0x87,
- 0x5e, 0x30, 0x26, 0x52, 0x9d, 0xeb, 0x67, 0xf4, 0x4b, 0xf5, 0xb9, 0xad,
- 0x4e, 0xc7, 0x76, 0x29, 0x32, 0xd4, 0x24, 0xbd, 0x95, 0x54, 0x28, 0xb8,
- 0x94, 0x9a, 0x7e, 0x0c, 0xdd, 0x38, 0xf9, 0x13, 0x1c, 0x7b, 0x06, 0xad,
- 0x56, 0xe8, 0x4a, 0x47, 0xda, 0xb1, 0x05, 0xc0, 0x2b, 0xd4, 0x98, 0x71,
- 0x94, 0x16, 0x42, 0xdd, 0x17, 0x26, 0x0a, 0x09, 0x59, 0x12, 0x06, 0xbc,
- 0x2c, 0x7c, 0xa6, 0xff, 0x96, 0x2d, 0x50, 0x2b, 0xb0, 0x28, 0xbb, 0x97,
- 0xb0, 0x2b, 0x6b, 0x67, 0x57, 0x12, 0xd9, 0x4a, 0xc1, 0xa4, 0x08, 0x1b,
- 0x63, 0xcc, 0x0a, 0x85, 0xd8, 0x0b, 0x45, 0xe4, 0xd4, 0x99, 0x89, 0xb7,
- 0x85, 0x0b, 0x30, 0x50, 0x59, 0xb6, 0x88, 0x42, 0x4d, 0x7b, 0xa3, 0x85,
- 0xf1, 0x25, 0x48, 0xfb, 0x27, 0x52, 0xd8, 0x73, 0x72, 0x8a, 0x4b, 0x57,
- 0x78, 0x72, 0x88, 0x37, 0x43, 0xf7, 0x5b, 0x19, 0xdb, 0x55, 0x2c, 0x5f,
- 0x3c, 0x47, 0x7d, 0x6b, 0x0b, 0xae, 0xc2, 0x84, 0x29, 0xa0, 0xa7, 0x46,
- 0xc6, 0x84, 0xc7, 0x98, 0x47, 0x65, 0xc0, 0xda, 0x29, 0x15, 0x6c, 0x55,
- 0xf3, 0x9d, 0x5e, 0x74, 0x01, 0x0c, 0x19, 0xc3, 0xe8, 0xcd, 0xb7, 0xd1,
- 0x5d, 0xf2, 0xca, 0xd8, 0x50, 0x1e, 0xed, 0x9d, 0xe0, 0xfb, 0xaf, 0xd1,
- 0x39, 0x68, 0x34, 0x78, 0x03, 0xc7, 0xde, 0xe8, 0x0f, 0x5c, 0x48, 0x8e,
- 0x30, 0x3b, 0xbc, 0x97, 0xc7, 0x99, 0xf9, 0x62, 0x4e, 0x95, 0x2a, 0xfc,
- 0x4a, 0x2f, 0x01, 0x6a, 0xb5, 0x36, 0xfb, 0x6f, 0x72, 0xa3, 0x26, 0x13,
- 0xbd, 0x38, 0x27, 0x05, 0xc0, 0xab, 0xf0, 0x82, 0x9d, 0xc0, 0x50, 0x82,
- 0xc1, 0x79, 0x5f, 0x23, 0x61, 0x00, 0xab, 0x85, 0x11, 0x65, 0x33, 0x81,
- 0x13, 0x4b, 0xaf, 0xa1, 0x8f, 0xa6, 0xf5, 0x6d, 0xfc, 0x84, 0xd7, 0xb7,
- 0xd1, 0x13, 0xae, 0x7f, 0xe0, 0xa4, 0x7b, 0x75, 0x77, 0x56, 0x9d, 0xf5,
- 0xd1, 0x77, 0x2b, 0xd2, 0xfd, 0xbd, 0x13, 0xae, 0xa3, 0xc3, 0x6e, 0xf7,
- 0xce, 0x38, 0x1f, 0x72, 0x59, 0x23, 0x7b, 0xcc, 0xe5, 0x9c, 0x47, 0xdd,
- 0xf5, 0x7e, 0xb9, 0x2c, 0x3e, 0xe7, 0xe6, 0xfb, 0x72, 0xb8, 0xcf, 0x0f,
- 0x47, 0xdf, 0x75, 0x8e, 0xb5, 0x77, 0x90, 0x63, 0xd9, 0xc6, 0x28, 0x62,
- 0x53, 0x29, 0xaf, 0x1e, 0xb5, 0x15, 0xdd, 0xef, 0xf5, 0xed, 0x63, 0xf6,
- 0xbb, 0xe9, 0x48, 0xb0, 0xdf, 0x83, 0x39, 0x5e, 0xb7, 0xdf, 0xfd, 0x85,
- 0x6a, 0xdd, 0x40, 0x59, 0xe2, 0xef, 0xf8, 0x82, 0x8b, 0xdd, 0xdd, 0xa0,
- 0x6e, 0x6a, 0xb0, 0xd5, 0xb1, 0xd3, 0x8b, 0x52, 0xb6, 0x76, 0x08, 0x11,
- 0x43, 0x3f, 0x7f, 0xc9, 0x46, 0xc7, 0x0b, 0xc1, 0x3e, 0xd7, 0x15, 0xfd,
- 0xc5, 0x1b, 0x5d, 0x0e, 0x48, 0xb0, 0xcf, 0xa1, 0x55, 0x9f, 0xf7, 0xbd,
- 0x0d, 0xee, 0xed, 0x5a, 0x3f, 0xb1, 0x37, 0x32, 0x43, 0x96, 0x2a, 0xc2,
- 0x5d, 0xc0, 0x2e, 0x51, 0x3f, 0x42, 0x0c, 0xd1, 0xb7, 0xd9, 0x93, 0xd5,
- 0x24, 0xf4, 0xae, 0xdb, 0x5c, 0x5e, 0x1f, 0xcb, 0x5e, 0xa9, 0x2a, 0x8d,
- 0x4b, 0x1c, 0xb7, 0x36, 0x0c, 0x75, 0x3f, 0x43, 0xdc, 0xaf, 0x36, 0xe3,
- 0xd2, 0x24, 0x1d, 0x6f, 0x4a, 0x16, 0xcd, 0x37, 0xae, 0x33, 0x02, 0x08,
- 0x80, 0xb2, 0xa7, 0x75, 0x4e, 0x8b, 0x7a, 0xe0, 0x4a, 0x11, 0xbe, 0xb4,
- 0x7f, 0x0d, 0xb4, 0xf4, 0xd7, 0xef, 0x46, 0xe1, 0x69, 0xad, 0x33, 0x86,
- 0xcc, 0x5f, 0xe3, 0xf8, 0x99, 0x47, 0x6c, 0x1a, 0x94, 0xad, 0xfd, 0xf1,
- 0x32, 0xea, 0xe0, 0xc0, 0x27, 0x82, 0xf4, 0xa5, 0x54, 0x6b, 0x67, 0xc2,
- 0xd3, 0x47, 0x1e, 0x17, 0xaf, 0x6f, 0x9a, 0xe7, 0x0b, 0x4f, 0x4a, 0x84,
- 0x95, 0x49, 0x93, 0x95, 0xa8, 0x1b, 0xdb, 0x5a, 0x87, 0x4c, 0x28, 0x4b,
- 0x85, 0x1b, 0xc9, 0xd6, 0x2d, 0x28, 0x3a, 0xe5, 0x17, 0xbb, 0x83, 0xa5,
- 0xf6, 0xe8, 0xfc, 0x30, 0x6c, 0x67, 0x7b, 0xad, 0x99, 0x45, 0x13, 0xb8,
- 0xb8, 0x7d, 0x3a, 0xa0, 0x87, 0xad, 0xf2, 0x24, 0x3f, 0x7d, 0x8e, 0x9f,
- 0x0e, 0x83, 0x89, 0x0e, 0x6c, 0x4d, 0x29, 0x15, 0x64, 0x89, 0xe4, 0x40,
- 0xec, 0x32, 0x25, 0xf6, 0x64, 0x5c, 0x02, 0x5a, 0xfa, 0xf7, 0x2e, 0x55,
- 0xaa, 0x28, 0x57, 0x92, 0x23, 0x09, 0x58, 0x2a, 0x52, 0xd4, 0xff, 0xf5,
- 0x3c, 0x8a, 0x4f, 0xba, 0xe1, 0xb7, 0x56, 0x9f, 0x5f, 0xca, 0x30, 0xe3,
- 0x4b, 0xde, 0xd2, 0xc4, 0xc6, 0x39, 0x57, 0x2d, 0x78, 0x99, 0x2f, 0x06,
- 0xfa, 0x96, 0x7a, 0x01, 0xe7, 0x29, 0xc8, 0xae, 0x49, 0x6a, 0x3c, 0xc5,
- 0x22, 0x44, 0x06, 0xc9, 0x95, 0xc5, 0x5a, 0xb1, 0x9d, 0xd6, 0xa6, 0x11,
- 0x85, 0xa5, 0xb1, 0xfc, 0x66, 0xb4, 0x29, 0xf8, 0x3b, 0xb1, 0x34, 0x18,
- 0x45, 0xae, 0xfa, 0x91, 0x69, 0x85, 0xbc, 0xa3, 0x1b, 0xf6, 0xdd, 0x07,
- 0xd6, 0xcf, 0x6d, 0xb2, 0xf5, 0xeb, 0xa7, 0x73, 0xf6, 0xdf, 0x63, 0xfd,
- 0x9e, 0xff, 0x5e, 0xeb, 0xf7, 0xfc, 0xbf, 0xc7, 0xfa, 0x3d, 0xff, 0x87,
- 0xd7, 0xef, 0x69, 0xb0, 0x7e, 0xcf, 0xff, 0xbb, 0xac, 0x9f, 0xd6, 0xcc,
- 0xd0, 0xd5, 0xcb, 0x82, 0xf5, 0x1b, 0x49, 0x4a, 0x87, 0xd2, 0x7a, 0xd1,
- 0x4c, 0xeb, 0x5b, 0x1c, 0x74, 0x88, 0x94, 0xb5, 0xf1, 0xe8, 0xc3, 0xe3,
- 0x14, 0x87, 0x12, 0x51, 0xd1, 0x46, 0x4f, 0xce, 0x13, 0xdb, 0x01, 0x6f,
- 0x19, 0x1c, 0xcd, 0x10, 0x74, 0x9c, 0xa8, 0xcb, 0xb5, 0x26, 0x3f, 0x9c,
- 0x19, 0x3f, 0x67, 0x9c, 0xd5, 0x2e, 0x55, 0x32, 0xc6, 0x23, 0x64, 0x26,
- 0xee, 0xe0, 0x25, 0x4d, 0xd7, 0x80, 0x1f, 0xff, 0x22, 0x9a, 0xff, 0x83,
- 0xd2, 0x64, 0xae, 0x4b, 0x31, 0x37, 0xbb, 0x37, 0x75, 0x6e, 0xdd, 0xec,
- 0x6e, 0xf4, 0x16, 0x2d, 0xb6, 0x66, 0x11, 0x4a, 0x6b, 0x5e, 0xc1, 0x87,
- 0x96, 0xec, 0x35, 0x34, 0x83, 0xe5, 0x7c, 0x21, 0x79, 0x81, 0x0f, 0xe4,
- 0x45, 0x25, 0x5c, 0x0d, 0x06, 0x39, 0x4f, 0xec, 0x5b, 0x95, 0x5c, 0x01,
- 0x5b, 0x56, 0x57, 0x81, 0xd8, 0x12, 0xb5, 0x58, 0x49, 0x60, 0x14, 0xe5,
- 0x92, 0xb9, 0xec, 0x3a, 0x0b, 0x18, 0xd2, 0x6e, 0x4b, 0xd5, 0x66, 0x85,
- 0xaf, 0x23, 0x09, 0x2e, 0x1a, 0x49, 0xbc, 0xfc, 0xd5, 0x18, 0xe3, 0x22,
- 0xc2, 0x33, 0x94, 0x26, 0x41, 0x7d, 0x66, 0x1e, 0x30, 0xf3, 0xaa, 0x69,
- 0x66, 0x28, 0xb9, 0x12, 0x5e, 0x91, 0x57, 0xdb, 0x7b, 0x26, 0x67, 0x89,
- 0x41, 0x89, 0xe1, 0x40, 0x86, 0x36, 0xc3, 0xf9, 0x10, 0x89, 0xa4, 0xde,
- 0x5b, 0x6e, 0x95, 0xe2, 0x56, 0xf1, 0xf3, 0x2d, 0xc2, 0xe9, 0xc1, 0x38,
- 0xcc, 0x80, 0x69, 0xe5, 0xef, 0xfc, 0x0b, 0xb6, 0xef, 0x0a, 0x0c, 0x37,
- 0x2b, 0x11, 0x9e, 0x19, 0x1a, 0x59, 0x73, 0x1f, 0x24, 0x3e, 0x8c, 0xd3,
- 0xbf, 0xe8, 0xb9, 0x4a, 0x18, 0x1a, 0x78, 0x93, 0xf9, 0x79, 0x88, 0x96,
- 0xc4, 0x4d, 0xd0, 0x48, 0x68, 0xad, 0x10, 0x14, 0x5b, 0xc0, 0xe8, 0x8e,
- 0x44, 0x63, 0x99, 0xae, 0x9e, 0x10, 0xa3, 0x2c, 0xf9, 0x2d, 0x22, 0x71,
- 0x9b, 0x32, 0x79, 0xc7, 0x3f, 0x31, 0xeb, 0xcf, 0x83, 0x75, 0xfa, 0x22,
- 0x29, 0xbb, 0xe6, 0x58, 0xe8, 0x3a, 0x04, 0xe1, 0xc8, 0x91, 0xc7, 0x32,
- 0xf5, 0xa3, 0x0d, 0x05, 0xf0, 0xae, 0x38, 0x2e, 0x9a, 0xaa, 0x5c, 0x98,
- 0x49, 0xff, 0x3a, 0xa5, 0x51, 0x41, 0x72, 0xbe, 0x4e, 0xb3, 0x79, 0x90,
- 0xf3, 0xc1, 0x05, 0xd8, 0x34, 0xb6, 0xab, 0xe5, 0xd8, 0xac, 0xd3, 0x0b,
- 0x8a, 0x25, 0x4f, 0x0d, 0x15, 0x4f, 0x9f, 0x9a, 0x5d, 0x27, 0xc8, 0x6f,
- 0x32, 0x65, 0x46, 0xa3, 0xd3, 0x50, 0x99, 0x56, 0xe6, 0xf8, 0xb5, 0x39,
- 0xbe, 0x68, 0x6a, 0xd0, 0x3e, 0x51, 0x66, 0xe4, 0xdc, 0xf4, 0xcb, 0xe8,
- 0x61, 0xe6, 0x71, 0x67, 0x33, 0xcd, 0x82, 0x17, 0xca, 0xed, 0x64, 0x52,
- 0xdd, 0x2f, 0xc8, 0x3e, 0x93, 0x9c, 0x36, 0x3e, 0x78, 0xd4, 0x3b, 0xa6,
- 0x1f, 0x4c, 0xd6, 0xa6, 0x11, 0xbe, 0x87, 0x67, 0x5f, 0xde, 0x85, 0x20,
- 0x26, 0xcb, 0xdc, 0xcc, 0x17, 0x45, 0x58, 0x55, 0x30, 0x93, 0xc8, 0x9a,
- 0x82, 0x20, 0xc1, 0x15, 0xb3, 0x08, 0x58, 0xc0, 0x50, 0x9d, 0xc2, 0x07,
- 0x50, 0x40, 0x71, 0x35, 0xfb, 0x80, 0x48, 0x6e, 0xe1, 0xcc, 0xde, 0xf6,
- 0xae, 0x05, 0x79, 0xde, 0x66, 0xc2, 0x74, 0x45, 0xb0, 0x25, 0xa9, 0x4d,
- 0x29, 0x63, 0xba, 0x08, 0xd8, 0x19, 0x38, 0xe4, 0xbd, 0xb7, 0xbb, 0xfb,
- 0x20, 0xed, 0x86, 0xb8, 0x7f, 0xd7, 0xb2, 0x6f, 0x90, 0x84, 0x62, 0x1f,
- 0xb3, 0xcd, 0x11, 0x4d, 0x73, 0x49, 0x38, 0xe8, 0x12, 0x15, 0x99, 0x4f,
- 0x5a, 0x16, 0x0c, 0x7b, 0xfe, 0xee, 0x6c, 0x41, 0x8d, 0x0c, 0x0c, 0x1c,
- 0xe4, 0x40, 0x3e, 0x46, 0x17, 0xeb, 0x83, 0xf6, 0x3b, 0xd1, 0x2a, 0x73,
- 0x2c, 0x98, 0xe8, 0x45, 0xd5, 0x5f, 0xcc, 0x86, 0xfc, 0xea, 0xde, 0x19,
- 0x4f, 0xd6, 0x31, 0x88, 0x7e, 0xd1, 0x11, 0x93, 0x1a, 0xc7, 0x6b, 0x72,
- 0xd2, 0xe3, 0xcc, 0x1a, 0xff, 0xc2, 0x72, 0x05, 0x2d, 0x1a, 0xf9, 0xb3,
- 0xa8, 0xd1, 0x24, 0xf3, 0x05, 0xc4, 0x3d, 0x06, 0x76, 0xb4, 0x69, 0x1d,
- 0xb0, 0xd8, 0x7b, 0x84, 0xf4, 0x7c, 0xab, 0xac, 0xa5, 0x12, 0x6d, 0x13,
- 0xa5, 0xb4, 0x51, 0x79, 0x9f, 0xb5, 0xd5, 0x12, 0x4a, 0x55, 0x1c, 0x20,
- 0x21, 0xb1, 0x9b, 0x85, 0x4d, 0x39, 0x8c, 0x28, 0x2e, 0xfd, 0x89, 0x81,
- 0x28, 0xce, 0x00, 0x26, 0x82, 0x1e, 0x86, 0x41, 0x68, 0xae, 0x44, 0x87,
- 0xff, 0x31, 0xe4, 0xd5, 0x52, 0x61, 0xc6, 0x55, 0x96, 0x1d, 0x1f, 0x4c,
- 0x37, 0x37, 0xaa, 0x65, 0x4a, 0x87, 0x69, 0xe6, 0xdd, 0xaa, 0xe6, 0x9c,
- 0x78, 0x89, 0x58, 0x31, 0xd4, 0x08, 0xd6, 0x3b, 0xde, 0x5f, 0x9c, 0xf6,
- 0x01, 0xd3, 0x44, 0x61, 0x03, 0xfa, 0x0b, 0x56, 0x39, 0xae, 0x1b, 0xf5,
- 0x5d, 0xc3, 0xcc, 0x4d, 0xc7, 0x83, 0xa9, 0x1d, 0xc9, 0x12, 0xc9, 0x6d,
- 0x78, 0x3f, 0x4d, 0xbb, 0xb5, 0xaa, 0x36, 0x45, 0x2c, 0xb2, 0x09, 0xb9,
- 0x6c, 0x9e, 0x22, 0xca, 0x87, 0x7a, 0x09, 0xf7, 0xa1, 0x7a, 0xa0, 0x2c,
- 0xa9, 0x91, 0x9e, 0x4b, 0xe4, 0x82, 0x26, 0x08, 0xca, 0xc5, 0x52, 0x4a,
- 0x25, 0x14, 0x49, 0xd4, 0x2e, 0x28, 0xdf, 0x4a, 0xb8, 0x4e, 0x5a, 0xab,
- 0x65, 0xe5, 0x85, 0x24, 0x7b, 0x37, 0xb9, 0x59, 0xd9, 0xa2, 0x07, 0xbe,
- 0xb5, 0xe5, 0x98, 0xa9, 0xfc, 0x1a, 0xfa, 0x74, 0x0c, 0x1e, 0x4c, 0x08,
- 0x3b, 0xe7, 0x20, 0x8b, 0x57, 0x1f, 0x6c, 0x39, 0xb6, 0xdc, 0x69, 0xb0,
- 0xea, 0x26, 0x77, 0x8b, 0xd9, 0x42, 0x65, 0x08, 0x65, 0xb1, 0x1a, 0x01,
- 0xeb, 0x76, 0x88, 0x68, 0xd9, 0xa8, 0x80, 0xc0, 0xc5, 0xcf, 0x95, 0x86,
- 0xdc, 0xd2, 0xa1, 0x72, 0xe1, 0x73, 0xf3, 0x2f, 0x9a, 0xe7, 0xa8, 0xba,
- 0x52, 0x59, 0x16, 0x84, 0x08, 0x23, 0xa7, 0x00, 0x48, 0xd2, 0x7b, 0x24,
- 0x0d, 0xb8, 0x0f, 0x63, 0x87, 0x07, 0xbc, 0x4a, 0xc4, 0x31, 0x56, 0x42,
- 0x75, 0x94, 0xbd, 0x4c, 0x53, 0x38, 0xa9, 0xf2, 0x45, 0xc3, 0xe1, 0xdf,
- 0xa0, 0x36, 0x75, 0xe4, 0xe0, 0x9b, 0xbf, 0x5d, 0xcf, 0xca, 0x71, 0x3a,
- 0x93, 0x9c, 0x2b, 0x01, 0x7b, 0xa8, 0xdb, 0xa9, 0xc5, 0xf7, 0x89, 0x7a,
- 0xbb, 0x66, 0x8b, 0x46, 0x12, 0x75, 0xcc, 0x88, 0x07, 0x07, 0x28, 0x1a,
- 0x49, 0x01, 0xa9, 0x75, 0x1f, 0xb4, 0x9f, 0x60, 0x56, 0xad, 0xc1, 0x55,
- 0x5f, 0x4e, 0xb0, 0x16, 0x00, 0x02, 0x56, 0xa6, 0xf6, 0x8e, 0x55, 0xa0,
- 0x0a, 0x21, 0x35, 0x39, 0x99, 0x2e, 0xf9, 0x0e, 0x77, 0x0e, 0xef, 0x4d,
- 0x09, 0xd8, 0x49, 0xe5, 0x10, 0x00, 0x38, 0x6c, 0x89, 0x6a, 0x8e, 0x8b,
- 0xc5, 0x60, 0x21, 0xc4, 0xaf, 0x69, 0x4b, 0x38, 0x6b, 0x21, 0xd5, 0x82,
- 0xae, 0x26, 0xd7, 0x39, 0x45, 0x24, 0x7a, 0x73, 0xc5, 0xc9, 0xca, 0x55,
- 0x50, 0x0b, 0xf4, 0x8a, 0xf5, 0x34, 0xe0, 0x3c, 0x79, 0x4d, 0xd6, 0xcc,
- 0x8c, 0x5f, 0x56, 0x75, 0xbf, 0x25, 0xd5, 0xec, 0xa7, 0x57, 0xe0, 0xa6,
- 0x20, 0xdb, 0x12, 0xae, 0x9b, 0x6d, 0xe6, 0x71, 0x8b, 0x8a, 0xf1, 0x72,
- 0xf2, 0x4a, 0x8a, 0xab, 0x14, 0xa4, 0x73, 0xa2, 0xfa, 0xb1, 0x34, 0x88,
- 0x46, 0xca, 0xa9, 0xbe, 0x23, 0xd7, 0x06, 0x46, 0x29, 0x54, 0x2c, 0x39,
- 0xb4, 0x50, 0xf1, 0xdb, 0xea, 0x7e, 0xca, 0x9a, 0x89, 0xf7, 0xcb, 0x69,
- 0x96, 0xce, 0xa2, 0x45, 0xa8, 0xa8, 0xc3, 0x70, 0x36, 0xb2, 0x7c, 0x43,
- 0xd9, 0x8b, 0x42, 0x7d, 0xd7, 0x02, 0x3d, 0xc5, 0xfd, 0x67, 0xd5, 0x76,
- 0xee, 0x21, 0xce, 0x54, 0xb8, 0xd2, 0xc4, 0x95, 0x7e, 0x0b, 0x7e, 0x05,
- 0x65, 0x08, 0x66, 0x62, 0x3b, 0x05, 0x39, 0xe0, 0x0c, 0x03, 0x9d, 0x65,
- 0x1f, 0x40, 0x6a, 0x00, 0x63, 0x5f, 0x02, 0x8a, 0x76, 0xf5, 0xc4, 0x71,
- 0x62, 0x97, 0x54, 0x2d, 0x17, 0x30, 0x3b, 0xf5, 0x8b, 0x01, 0x07, 0x24,
- 0x27, 0xb7, 0xe5, 0x28, 0x22, 0xe4, 0x0d, 0xf1, 0xb1, 0x08, 0x57, 0xfa,
- 0x36, 0x53, 0xa0, 0x08, 0x2c, 0x0c, 0x9e, 0xfe, 0xc6, 0xe6, 0xba, 0x71,
- 0x7d, 0x7b, 0xc8, 0x1a, 0x16, 0x33, 0xfb, 0xfb, 0xf1, 0x93, 0x21, 0x55,
- 0x13, 0x65, 0x8b, 0xe1, 0xac, 0xd7, 0xe9, 0x95, 0x2d, 0x68, 0x2a, 0xe2,
- 0xbb, 0x9c, 0x98, 0xe9, 0xe3, 0x62, 0xcb, 0xf8, 0x19, 0xa9, 0x49, 0x41,
- 0x20, 0x8d, 0x05, 0x36, 0x52, 0x75, 0xec, 0xbd, 0x8b, 0x83, 0x60, 0x85,
- 0x78, 0x3d, 0xcb, 0x17, 0xea, 0xe4, 0xec, 0x27, 0x99, 0x80, 0x38, 0x88,
- 0x3c, 0x34, 0x24, 0x0b, 0xec, 0x54, 0x77, 0x14, 0x5e, 0xc9, 0x19, 0xa9,
- 0xff, 0x5b, 0xb6, 0x79, 0x6e, 0xfd, 0xe9, 0xee, 0x1e, 0xfa, 0xfb, 0x74,
- 0xf7, 0xb3, 0xed, 0xf6, 0xdd, 0x3c, 0xab, 0xb3, 0x01, 0x90, 0x3c, 0x8f,
- 0xac, 0x0b, 0x82, 0x37, 0x04, 0xfb, 0x33, 0x5d, 0x56, 0xae, 0xd0, 0x13,
- 0x95, 0x8a, 0x81, 0xc5, 0x58, 0xdf, 0x10, 0x9d, 0x59, 0x70, 0xd7, 0xd3,
- 0x6b, 0x9a, 0x17, 0x92, 0x73, 0xa5, 0x4a, 0xb8, 0xd1, 0x65, 0xbe, 0x52,
- 0x34, 0x20, 0x35, 0x29, 0x98, 0xd8, 0x0f, 0xcf, 0x92, 0xcd, 0x18, 0x52,
- 0xcb, 0xfa, 0x1c, 0x4e, 0x9c, 0x82, 0xc0, 0x41, 0x94, 0x76, 0xd5, 0x31,
- 0x2b, 0x77, 0xde, 0xe4, 0x45, 0x5e, 0xdf, 0xa0, 0x5a, 0x59, 0x5d, 0xa7,
- 0xd7, 0x59, 0x98, 0xa6, 0x6a, 0x04, 0x92, 0x31, 0x9c, 0xa4, 0xbe, 0x30,
- 0xa8, 0x9d, 0x09, 0x8b, 0xc3, 0x87, 0x41, 0x60, 0xfc, 0x52, 0xd1, 0x64,
- 0x89, 0x30, 0x85, 0x1d, 0xe6, 0xaa, 0x4a, 0x3b, 0xae, 0xd0, 0xce, 0xaa,
- 0x3a, 0x3b, 0x54, 0xfc, 0x01, 0xcc, 0x33, 0x1e, 0x2d, 0x7f, 0x80, 0xd8,
- 0x23, 0x3f, 0xc2, 0x16, 0x2d, 0xee, 0xd9, 0xc8, 0x08, 0xa1, 0x5d, 0x42,
- 0x42, 0xcd, 0x52, 0x70, 0xd2, 0x9a, 0xbf, 0x99, 0x9f, 0xfd, 0x60, 0x34,
- 0xd2, 0xe1, 0x0b, 0xfb, 0xe3, 0xed, 0xc7, 0xd5, 0xe5, 0xd9, 0xef, 0x68,
- 0x68, 0x04, 0x4f, 0x14, 0x67, 0x36, 0x0c, 0x96, 0x57, 0xfc, 0x8f, 0x15,
- 0xfa, 0xf7, 0xc8, 0xa5, 0x4a, 0x78, 0xc0, 0x1d, 0x49, 0xab, 0xb1, 0x3e,
- 0x13, 0xc1, 0xf3, 0xa9, 0x93, 0x3c, 0x12, 0x5e, 0x50, 0xdc, 0xeb, 0xb4,
- 0x4d, 0x60, 0x0c, 0x2d, 0x6e, 0x46, 0x25, 0x18, 0x68, 0xe3, 0x0f, 0x93,
- 0x53, 0xa9, 0x7e, 0xbd, 0xf9, 0xe5, 0x26, 0xe6, 0x6b, 0xf3, 0x25, 0x73,
- 0xf3, 0x06, 0xfe, 0x31, 0xf0, 0x3b, 0xf7, 0x2d, 0xfb, 0xf8, 0xe6, 0x9f,
- 0x09, 0x9b, 0x49, 0xfc, 0x04, 0xdc, 0x03, 0x65, 0xa4, 0x95, 0x7e, 0x69,
- 0x50, 0xd5, 0x22, 0xa5, 0x82, 0xb2, 0xcc, 0x20, 0xdc, 0x1a, 0x0a, 0xd9,
- 0x0f, 0x23, 0x29, 0xf2, 0x22, 0x91, 0xda, 0x77, 0x44, 0x68, 0xdc, 0x99,
- 0x01, 0x55, 0xe7, 0x36, 0xeb, 0x48, 0x29, 0x46, 0xa6, 0xbf, 0xe0, 0xfa,
- 0x80, 0xae, 0x4e, 0x14, 0xf7, 0x8c, 0x7b, 0x04, 0x47, 0xd7, 0x64, 0x92,
- 0x93, 0xc6, 0xc2, 0x91, 0x44, 0xf3, 0xdb, 0xeb, 0x6b, 0xd6, 0x6c, 0x02,
- 0xb4, 0x9e, 0x99, 0x0c, 0xb3, 0xe8, 0x34, 0x17, 0x57, 0x59, 0xda, 0x40,
- 0xdb, 0xa0, 0x5b, 0x7e, 0x35, 0x96, 0xd4, 0x69, 0xef, 0x91, 0x67, 0xbc,
- 0x51, 0xbc, 0xf4, 0x11, 0xfb, 0xeb, 0x53, 0x83, 0x66, 0x04, 0x9a, 0x16,
- 0x53, 0x69, 0x39, 0x43, 0x19, 0x06, 0x81, 0xe6, 0x0e, 0xcc, 0x44, 0xf1,
- 0x9c, 0x14, 0xa2, 0x37, 0xa4, 0x80, 0xad, 0x74, 0x4d, 0x26, 0xaa, 0xbc,
- 0x21, 0x24, 0xf3, 0xab, 0xf0, 0xba, 0xa2, 0x70, 0xb8, 0xe8, 0x10, 0x63,
- 0x8e, 0x93, 0x48, 0x82, 0x97, 0x5f, 0x77, 0xee, 0x48, 0xf0, 0xb9, 0x97,
- 0x54, 0xef, 0x40, 0xcc, 0x01, 0x23, 0x4f, 0x76, 0xb0, 0xd7, 0x05, 0x39,
- 0x3e, 0x21, 0xa6, 0x07, 0x7e, 0xa5, 0x4c, 0x2e, 0xde, 0x1c, 0x75, 0x29,
- 0x51, 0x9f, 0x7c, 0xfe, 0xb9, 0x74, 0x22, 0x13, 0xc4, 0x91, 0xad, 0x35,
- 0x0d, 0x5b, 0x9a, 0x51, 0x70, 0x0c, 0x29, 0x34, 0x37, 0x30, 0x20, 0xb4,
- 0x12, 0xc6, 0x8e, 0x2d, 0x99, 0xcc, 0xe9, 0xa6, 0x24, 0xd5, 0xb8, 0x1a,
- 0x98, 0xca, 0x8e, 0xcc, 0xf5, 0x23, 0x3a, 0x84, 0x3b, 0x8c, 0x1a, 0x2d,
- 0x92, 0x2f, 0x03, 0x54, 0xc6, 0x75, 0x81, 0x2f, 0x22, 0x5f, 0xf0, 0x3a,
- 0x6b, 0xc2, 0x44, 0x09, 0x0f, 0x9a, 0xd8, 0x6a, 0x7c, 0x25, 0x4b, 0x8a,
- 0x2b, 0x80, 0xac, 0xa9, 0x1e, 0x2f, 0x85, 0x3c, 0x58, 0x6a, 0x0a, 0x4f,
- 0x32, 0x4b, 0x54, 0xfe, 0x25, 0x0e, 0xda, 0x4b, 0x51, 0xb4, 0xa2, 0x35,
- 0x89, 0xbf, 0x14, 0x0e, 0x1e, 0x41, 0x47, 0x82, 0x10, 0xa6, 0x69, 0x8c,
- 0x8a, 0xea, 0x84, 0x20, 0x20, 0xaa, 0xe0, 0xfe, 0x50, 0xde, 0x01, 0xae,
- 0x6d, 0x1d, 0x44, 0xe3, 0xf3, 0x99, 0xda, 0x35, 0x2f, 0x95, 0xda, 0xc7,
- 0xbc, 0x24, 0xc4, 0xfb, 0x04, 0x14, 0xa6, 0xde, 0xc4, 0xa6, 0xa2, 0x8e,
- 0x4a, 0x1e, 0x3a, 0x80, 0xee, 0x5d, 0x6f, 0xa2, 0x22, 0x7c, 0x0d, 0x20,
- 0x8e, 0x3b, 0xb0, 0x81, 0x49, 0x0a, 0xf3, 0xcd, 0x85, 0xf3, 0x29, 0xb5,
- 0xc8, 0x76, 0xb9, 0xf5, 0x37, 0x17, 0x55, 0x49, 0xcd, 0x6c, 0xda, 0xfa,
- 0xd0, 0xb1, 0x79, 0xb6, 0xf9, 0x52, 0x15, 0x39, 0x8e, 0xa8, 0x07, 0x96,
- 0xe7, 0x8a, 0x24, 0x7e, 0x65, 0xcc, 0xf8, 0xe1, 0x5f, 0x17, 0xd7, 0x8e,
- 0x54, 0x1c, 0x2c, 0xf8, 0x46, 0x7d, 0x09, 0xcb, 0x56, 0xe0, 0x58, 0x0c,
- 0xde, 0x24, 0xf2, 0xdd, 0x57, 0x5f, 0xb6, 0x1a, 0x50, 0x8a, 0x6a, 0x9f,
- 0x81, 0x55, 0xc0, 0x94, 0x93, 0xeb, 0x3c, 0x92, 0x89, 0x26, 0x19, 0xf4,
- 0xbc, 0x89, 0x1c, 0x82, 0xd6, 0x9a, 0x67, 0x0c, 0xcf, 0xc6, 0x86, 0x42,
- 0xcc, 0xdb, 0xc5, 0xad, 0x67, 0x59, 0xac, 0x46, 0x8e, 0x9c, 0x9f, 0x6b,
- 0x32, 0x2b, 0xc8, 0x40, 0x41, 0x16, 0xbd, 0x6e, 0x1d, 0x78, 0x38, 0x9b,
- 0x6a, 0x39, 0x81, 0x26, 0xfa, 0xbe, 0x30, 0x0f, 0x34, 0x4b, 0x8a, 0xf3,
- 0xcc, 0xee, 0x23, 0x1e, 0x0c, 0xce, 0x0d, 0x40, 0x8d, 0x36, 0x71, 0xb0,
- 0x57, 0x72, 0x33, 0xb4, 0x59, 0xcb, 0x53, 0xbd, 0x54, 0xf2, 0x05, 0x08,
- 0xfa, 0xc5, 0xce, 0xea, 0x87, 0x68, 0x02, 0x57, 0xb1, 0x87, 0x1a, 0x58,
- 0x82, 0x4c, 0xf8, 0xef, 0xca, 0x40, 0xd7, 0x62, 0x63, 0x63, 0x65, 0x24,
- 0xbc, 0x54, 0xd5, 0x7c, 0x81, 0x60, 0x65, 0x54, 0xa9, 0x08, 0x2a, 0x20,
- 0x4a, 0x3b, 0x52, 0x88, 0x0e, 0x3c, 0xc0, 0x30, 0xe4, 0x33, 0x88, 0x95,
- 0x9b, 0xdc, 0xe4, 0x1b, 0xab, 0xcf, 0xb8, 0x27, 0xc9, 0x6a, 0x75, 0x99,
- 0x89, 0xab, 0x57, 0xbf, 0x77, 0x97, 0x8d, 0x5f, 0x7d, 0x49, 0x26, 0xef,
- 0x27, 0x30, 0xf6, 0xf2, 0xd5, 0x47, 0x3b, 0x7c, 0x07, 0x04, 0xbe, 0x89,
- 0xb7, 0x01, 0xba, 0x8d, 0x98, 0xd3, 0xb1, 0xb2, 0x59, 0x0f, 0x13, 0xee,
- 0x35, 0x79, 0x55, 0x96, 0x6b, 0x5b, 0xa4, 0x59, 0xe1, 0xda, 0x0f, 0x98,
- 0x17, 0x0f, 0x6e, 0xc2, 0x20, 0x0c, 0x97, 0xf1, 0xc2, 0x9b, 0xdf, 0x6e,
- 0x2a, 0x39, 0xfd, 0xb1, 0x14, 0x44, 0x14, 0x4c, 0x65, 0xf5, 0x5d, 0x63,
- 0x24, 0xaf, 0xfa, 0x0a, 0xb8, 0x8e, 0x70, 0xb4, 0xbb, 0x31, 0xf0, 0xb1,
- 0x00, 0xb7, 0x01, 0xfd, 0xf5, 0xcf, 0xf6, 0x75, 0xfa, 0x8f, 0x39, 0x55,
- 0xe0, 0xc0, 0x5c, 0x33, 0x9a, 0x93, 0x2b, 0xfb, 0xc5, 0x1d, 0xae, 0x45,
- 0xaa, 0x65, 0x9f, 0x36, 0xfb, 0x7c, 0x09, 0xff, 0x79, 0x13, 0x76, 0x8f,
- 0xe2, 0x00, 0x50, 0x1d, 0x01, 0xa6, 0x25, 0x15, 0x4c, 0xe8, 0x9e, 0x0a,
- 0x42, 0xcb, 0x70, 0xfd, 0x04, 0xf4, 0x7e, 0x45, 0xc7, 0xe9, 0x4a, 0x4e,
- 0xb4, 0xef, 0x3f, 0xf5, 0x6c, 0xef, 0x7f, 0xea, 0xb9, 0xfe, 0xff, 0xd4,
- 0x73, 0x23, 0xf8, 0xa9, 0xd7, 0x4b, 0x30, 0x88, 0x40, 0x83, 0xfc, 0xc5,
- 0x8b, 0xbe, 0xc9, 0x1f, 0x75, 0xdf, 0xf4, 0x3e, 0xe9, 0x7d, 0xb1, 0xb7,
- 0xb9, 0x6e, 0xd2, 0x9c, 0xef, 0x38, 0xbf, 0xf2, 0x88, 0x9d, 0x78, 0x02,
- 0x49, 0x32, 0xca, 0x24, 0xe9, 0x2c, 0xb9, 0x59, 0x41, 0x31, 0x9a, 0xc0,
- 0x93, 0xe6, 0x3d, 0x41, 0x53, 0xee, 0x6a, 0x41, 0x78, 0x34, 0xc7, 0x96,
- 0x3d, 0x4a, 0x17, 0x42, 0x4b, 0x70, 0x05, 0x75, 0xd9, 0xec, 0xeb, 0x51,
- 0x2d, 0xe9, 0x6a, 0x59, 0x71, 0xf1, 0x3f, 0x1e, 0x1e, 0x7b, 0x6b, 0x14,
- 0x0b, 0x23, 0xdf, 0x7a, 0x7b, 0xf8, 0xee, 0xfd, 0xe1, 0xe9, 0xe3, 0x89,
- 0x44, 0x5b, 0xf4, 0xd4, 0x6b, 0x5f, 0xf3, 0xc0, 0xaf, 0x9d, 0xbc, 0xae,
- 0x87, 0x51, 0xf1, 0x04, 0x3e, 0x22, 0xad, 0x86, 0xbc, 0x5c, 0xf1, 0xb4,
- 0x2e, 0x8e, 0x20, 0x8a, 0x89, 0xef, 0x85, 0x9f, 0xd2, 0x5a, 0xd8, 0xda,
- 0x7b, 0xfa, 0x3e, 0xbd, 0xde, 0x93, 0x00, 0xaa, 0x45, 0x1c, 0x47, 0x52,
- 0xe0, 0x1d, 0x44, 0xda, 0x7a, 0x90, 0xb5, 0xac, 0x8d, 0x00, 0xbc, 0xa6,
- 0x92, 0xbb, 0xcf, 0xb8, 0xe9, 0xab, 0x2b, 0x17, 0x97, 0xeb, 0x9a, 0x28,
- 0x47, 0x47, 0xab, 0xa1, 0x9b, 0xbf, 0x27, 0x61, 0x43, 0x27, 0x90, 0x8e,
- 0x69, 0x9c, 0x99, 0x81, 0x13, 0x50, 0xfb, 0x36, 0x1b, 0x34, 0x25, 0x03,
- 0x9b, 0x5f, 0x4a, 0xdf, 0xe2, 0xb3, 0x4a, 0xc9, 0x47, 0x9e, 0x45, 0x4e,
- 0x4c, 0x09, 0x0a, 0xf0, 0x26, 0x6e, 0x7e, 0x4c, 0xd6, 0xf9, 0x21, 0x55,
- 0xfc, 0x53, 0x50, 0xb1, 0x3a, 0x2b, 0x03, 0x80, 0x2c, 0x4d, 0x6b, 0xe3,
- 0xb3, 0x21, 0x0e, 0x9d, 0xaf, 0x5b, 0xa2, 0x52, 0xa2, 0xb5, 0x26, 0x97,
- 0xcb, 0xb9, 0x39, 0x19, 0x46, 0x23, 0x9b, 0x1a, 0xb3, 0x63, 0x7d, 0xd1,
- 0x4b, 0x5d, 0x6b, 0xda, 0x61, 0x5c, 0x88, 0x53, 0x14, 0xe6, 0x34, 0x5a,
- 0xdf, 0xb3, 0x1f, 0xbf, 0xa3, 0x7a, 0xa3, 0x93, 0xcb, 0x63, 0x33, 0x7d,
- 0xef, 0x2f, 0xbf, 0xe9, 0x89, 0xd7, 0xa2, 0x9b, 0x4d, 0x81, 0xc4, 0x1c,
- 0x2a, 0xfe, 0x70, 0x6b, 0x11, 0x97, 0x15, 0x8b, 0x7b, 0x73, 0x3f, 0x47,
- 0x8c, 0x40, 0xef, 0xa3, 0xc3, 0x35, 0xab, 0xf4, 0x6c, 0xf8, 0xac, 0xbb,
- 0x4a, 0xab, 0x19, 0x73, 0xc0, 0xa1, 0x32, 0x0a, 0xb6, 0xbb, 0x30, 0xb3,
- 0x90, 0x03, 0x78, 0xc7, 0x71, 0x2a, 0xb2, 0x85, 0x41, 0x19, 0x53, 0x29,
- 0xeb, 0xbf, 0x69, 0x4c, 0xf9, 0xe0, 0x14, 0x71, 0x6b, 0xd7, 0x83, 0x3e,
- 0xc6, 0xe6, 0x90, 0x89, 0x1a, 0x28, 0xa5, 0x91, 0x8b, 0x29, 0x95, 0x85,
- 0x57, 0x78, 0x61, 0x98, 0x40, 0xa1, 0x11, 0x0b, 0x62, 0x6a, 0x35, 0x5b,
- 0x60, 0xf8, 0x38, 0xdf, 0xb8, 0x0b, 0x4b, 0xc4, 0xf9, 0x7c, 0xe6, 0x39,
- 0x33, 0x74, 0x78, 0xcc, 0x34, 0x6b, 0x83, 0x38, 0x71, 0x0a, 0x1a, 0x9a,
- 0x57, 0xf1, 0x79, 0xbd, 0xe4, 0x3f, 0xe3, 0xfb, 0x1d, 0xca, 0x4d, 0x55,
- 0x4a, 0x99, 0x5e, 0x79, 0x83, 0x83, 0x51, 0x0c, 0xf8, 0x40, 0x3e, 0x20,
- 0x54, 0x4a, 0xd8, 0x7f, 0xb8, 0xe0, 0x41, 0x66, 0x16, 0xb2, 0xf1, 0x6e,
- 0x8d, 0xb6, 0x65, 0x0a, 0xd9, 0xde, 0x90, 0xd6, 0x22, 0x48, 0x1e, 0x2f,
- 0x61, 0x5e, 0xf8, 0x06, 0x62, 0x19, 0x5b, 0xde, 0xe9, 0x0d, 0x55, 0x03,
- 0x08, 0xe3, 0xc9, 0xdd, 0x34, 0x9e, 0xd4, 0xc2, 0xd7, 0x2f, 0x2b, 0x9b,
- 0xe0, 0x18, 0x01, 0x6e, 0xe8, 0xe8, 0xfb, 0xd7, 0x1e, 0x07, 0xa7, 0xba,
- 0xda, 0x79, 0xbf, 0x70, 0x56, 0x79, 0xb1, 0x2a, 0xc3, 0x37, 0x73, 0x31,
- 0xa3, 0x21, 0x68, 0xe5, 0xa7, 0x59, 0xb6, 0xb0, 0xdc, 0x4a, 0x39, 0x70,
- 0x26, 0x70, 0x33, 0x9a, 0x63, 0xca, 0xcc, 0x56, 0x60, 0x99, 0x5e, 0xd1,
- 0x3b, 0x11, 0x1d, 0x43, 0xbf, 0xa8, 0x33, 0x71, 0x0a, 0x1b, 0xf3, 0x35,
- 0xd9, 0xfb, 0xec, 0xc9, 0xe7, 0x49, 0x4d, 0x49, 0x06, 0xb9, 0x3f, 0x65,
- 0x4c, 0x47, 0xb2, 0x3a, 0x77, 0x5b, 0x78, 0x3d, 0x35, 0x42, 0x29, 0xb0,
- 0xfc, 0xa4, 0xa6, 0x3c, 0x28, 0x5c, 0xa4, 0x02, 0x92, 0x0d, 0xb3, 0x9a,
- 0xcc, 0x24, 0xca, 0x84, 0x49, 0xdc, 0x00, 0xf3, 0xc4, 0x1e, 0xee, 0xa1,
- 0xb7, 0x81, 0x89, 0xc0, 0x90, 0x08, 0x96, 0x8d, 0x48, 0xb9, 0x38, 0xbe,
- 0xbc, 0x30, 0x7f, 0x8c, 0x2e, 0xcf, 0x2e, 0x56, 0x24, 0xdc, 0x37, 0x9c,
- 0xee, 0x41, 0x93, 0xa6, 0xfe, 0x36, 0xa9, 0x08, 0xe9, 0xcb, 0x18, 0x04,
- 0x74, 0x59, 0xec, 0xc0, 0xcb, 0x39, 0x1f, 0xac, 0xa2, 0x59, 0xc0, 0x6c,
- 0xf9, 0x03, 0xbd, 0x32, 0xf7, 0xc3, 0xda, 0x81, 0xf1, 0x9a, 0xaf, 0xdf,
- 0x21, 0x18, 0x30, 0x6d, 0x46, 0x1a, 0xb1, 0x15, 0xf4, 0xe8, 0xad, 0x31,
- 0x15, 0xc8, 0x06, 0x75, 0x3c, 0x5a, 0x5a, 0xb8, 0x66, 0x05, 0xd1, 0x02,
- 0x47, 0x18, 0x6b, 0x1b, 0xe7, 0x52, 0x53, 0xb8, 0xa7, 0x98, 0xf2, 0x1e,
- 0x55, 0x83, 0xfd, 0x68, 0xab, 0xa8, 0x3c, 0xb0, 0x7f, 0xd3, 0xda, 0xfa,
- 0xc7, 0xe9, 0xd2, 0x2d, 0xe7, 0x19, 0xdb, 0x22, 0x5c, 0xf8, 0x5e, 0x85,
- 0x13, 0xdf, 0x2d, 0x4c, 0x36, 0x92, 0xc4, 0xf2, 0x2a, 0x6c, 0x5a, 0x28,
- 0xad, 0xf2, 0x66, 0x97, 0xe3, 0x45, 0xd6, 0xc5, 0xe8, 0x5b, 0xb3, 0x06,
- 0x09, 0xb7, 0x9b, 0xda, 0x2b, 0x2f, 0x5f, 0xb4, 0x2d, 0xbc, 0xf7, 0xba,
- 0x42, 0x86, 0xc0, 0xfd, 0x71, 0xc9, 0x02, 0x8f, 0x5b, 0x2b, 0xa9, 0x40,
- 0x2b, 0xe2, 0x40, 0x97, 0xf0, 0x2b, 0x0b, 0x9c, 0xcb, 0x53, 0xbc, 0xb6,
- 0x81, 0x28, 0x80, 0x18, 0x98, 0xb9, 0xbd, 0x2d, 0x4b, 0xce, 0x40, 0xfb,
- 0x65, 0x57, 0xe8, 0xb6, 0x74, 0xb6, 0x50, 0xcc, 0xaa, 0x6a, 0x96, 0x38,
- 0xc6, 0xd6, 0x0e, 0xea, 0x7b, 0x0d, 0x1b, 0xf0, 0x6f, 0x9e, 0x8b, 0x65,
- 0x0c, 0x66, 0xc9, 0x40, 0x2a, 0x92, 0xac, 0x80, 0xdb, 0x69, 0x6a, 0x27,
- 0x8d, 0x52, 0xf3, 0xc8, 0xed, 0xcc, 0x97, 0xd6, 0xb4, 0xe4, 0x2a, 0xc1,
- 0x34, 0xe8, 0x48, 0x22, 0x37, 0xf4, 0x65, 0xe0, 0xab, 0xf4, 0xa6, 0x91,
- 0xf6, 0xc4, 0x8f, 0x52, 0xa1, 0x14, 0x45, 0x67, 0xa4, 0xc8, 0x16, 0x08,
- 0x06, 0x7a, 0xee, 0x2f, 0x1a, 0x8b, 0x34, 0x58, 0x01, 0x4e, 0x16, 0x34,
- 0x0c, 0xda, 0x6f, 0xe5, 0x5e, 0xc8, 0x58, 0xa3, 0x21, 0xef, 0x42, 0x32,
- 0x23, 0xb4, 0x4c, 0x56, 0x2b, 0xe5, 0x40, 0xd5, 0xc0, 0xe1, 0x1a, 0x24,
- 0xa7, 0x9f, 0xa1, 0xd0, 0xda, 0x92, 0xed, 0xea, 0xf4, 0xed, 0xd1, 0xad,
- 0x44, 0xbf, 0xbe, 0xe1, 0x32, 0x9c, 0x84, 0x14, 0xcc, 0xda, 0x72, 0x93,
- 0xcb, 0x14, 0x9a, 0x03, 0xbf, 0x43, 0x60, 0x9b, 0x0c, 0x84, 0x54, 0xe6,
- 0x7a, 0x74, 0x84, 0x06, 0x2b, 0x4a, 0xb5, 0x40, 0x05, 0x63, 0xc7, 0x9b,
- 0x69, 0xbc, 0x8d, 0x5e, 0xf7, 0x38, 0xac, 0x51, 0xa5, 0xd9, 0xa5, 0x1f,
- 0x0c, 0x63, 0x21, 0x7d, 0xa6, 0xdb, 0x44, 0xcc, 0xa6, 0xad, 0x8e, 0x69,
- 0xc5, 0x02, 0x65, 0x37, 0x74, 0xf5, 0xbf, 0x01, 0x24, 0x58, 0x81, 0x12,
- 0x54, 0x7e, 0x49, 0xa4, 0x19, 0xa2, 0x6a, 0x3a, 0xfb, 0xe1, 0x5a, 0x27,
- 0x13, 0x96, 0x43, 0xfb, 0x6b, 0xc6, 0x50, 0x5f, 0x2e, 0xc2, 0x7b, 0xde,
- 0x21, 0x30, 0x6d, 0x8b, 0x5c, 0x66, 0xac, 0xf1, 0xbb, 0xd8, 0x94, 0xe6,
- 0x6e, 0x7b, 0xe9, 0x60, 0xc4, 0x2e, 0x75, 0xbc, 0x7b, 0x1a, 0xa1, 0x09,
- 0x04, 0xb7, 0xfb, 0x2a, 0x34, 0xbc, 0xfe, 0x7a, 0x48, 0x92, 0xd5, 0xa8,
- 0x17, 0xbb, 0xbd, 0x76, 0xd5, 0x39, 0x49, 0x7b, 0xd5, 0xb7, 0xcd, 0xbc,
- 0x78, 0xfd, 0x0d, 0xcf, 0x8c, 0x3a, 0x26, 0xbd, 0x1a, 0xda, 0x5b, 0x54,
- 0xa5, 0x8a, 0x8b, 0x30, 0x6f, 0xac, 0x1c, 0xfa, 0xea, 0x5e, 0xf5, 0xf6,
- 0x5e, 0xec, 0x0f, 0xf7, 0x9e, 0x7f, 0x3e, 0xdc, 0x43, 0x89, 0x8b, 0x76,
- 0x59, 0x75, 0xa9, 0xc3, 0xe0, 0xb5, 0x13, 0x29, 0xf4, 0x91, 0xac, 0x26,
- 0x69, 0xc1, 0x07, 0xe6, 0xf7, 0x43, 0x7a, 0x6c, 0xc8, 0xac, 0x9e, 0xc1,
- 0x27, 0xe6, 0x46, 0xa3, 0xa1, 0xc2, 0x86, 0x5d, 0xa4, 0xa4, 0x5e, 0xa4,
- 0xca, 0xcd, 0xb3, 0xc8, 0x69, 0x13, 0x29, 0x71, 0x82, 0x37, 0x4b, 0xca,
- 0x12, 0x6e, 0x19, 0x16, 0x71, 0x36, 0xe3, 0x1d, 0x52, 0x81, 0x3e, 0x11,
- 0x25, 0xd2, 0xc9, 0x74, 0xfb, 0xfd, 0x40, 0x68, 0xfe, 0x62, 0x9b, 0x8f,
- 0x12, 0x81, 0xec, 0x91, 0xeb, 0x26, 0x80, 0x21, 0x51, 0xb0, 0x9b, 0x6b,
- 0x26, 0xa9, 0x43, 0xfc, 0xa0, 0x9f, 0x96, 0x19, 0xd0, 0xfe, 0x22, 0x83,
- 0xce, 0xb1, 0xd5, 0xfb, 0x70, 0x69, 0xb4, 0x6c, 0xf1, 0xa7, 0x9d, 0xa4,
- 0x40, 0x9b, 0xac, 0xc7, 0x22, 0x5a, 0x9b, 0xa3, 0x77, 0xfe, 0xf4, 0x27,
- 0x27, 0x8f, 0xb8, 0xdc, 0x12, 0xc8, 0x04, 0x9f, 0xf5, 0x81, 0x6a, 0x83,
- 0x9f, 0x91, 0xa9, 0xde, 0x92, 0xde, 0xc1, 0x8f, 0xf0, 0x48, 0xfe, 0x3c,
- 0xf8, 0xd1, 0xfc, 0xfb, 0xe7, 0x9e, 0x07, 0x97, 0xe4, 0x1c, 0x4f, 0x85,
- 0xe7, 0x6d, 0xb4, 0x8f, 0x72, 0x3f, 0x69, 0x57, 0xab, 0x80, 0x66, 0x70,
- 0x79, 0x74, 0xce, 0x87, 0xb1, 0x62, 0xe7, 0x1c, 0x76, 0x33, 0xc9, 0x21,
- 0xa8, 0xf5, 0x24, 0xc2, 0x41, 0xf7, 0x60, 0x76, 0x8a, 0x9d, 0x4b, 0xe6,
- 0xfc, 0x75, 0x2f, 0xf5, 0xd5, 0xf5, 0x4a, 0x3a, 0x23, 0xd7, 0xbd, 0x36,
- 0x5b, 0xd2, 0xf4, 0x84, 0x84, 0x20, 0x43, 0xb3, 0x87, 0x54, 0x71, 0x46,
- 0xd5, 0x69, 0xf9, 0x99, 0x36, 0x47, 0xc9, 0xa2, 0x35, 0x5c, 0xb2, 0x77,
- 0xa6, 0x6b, 0x7d, 0x61, 0x36, 0x61, 0x94, 0x87, 0x16, 0x4d, 0x37, 0xf3,
- 0x51, 0x65, 0xa9, 0x0a, 0xdd, 0x2a, 0xaf, 0x3f, 0xd2, 0x18, 0x05, 0xb0,
- 0x44, 0xed, 0xba, 0x13, 0xcf, 0x81, 0x85, 0xaa, 0xb1, 0xc9, 0xa8, 0x94,
- 0x01, 0xa0, 0x30, 0x44, 0x6f, 0x8a, 0xdd, 0x25, 0xa1, 0xeb, 0xaf, 0xec,
- 0x05, 0xd1, 0x2c, 0x4e, 0x79, 0xac, 0xca, 0x1e, 0x91, 0x5c, 0xcc, 0x91,
- 0x82, 0xe4, 0xdc, 0xa8, 0xbb, 0x76, 0x8f, 0x78, 0x89, 0x7e, 0xe6, 0x1d,
- 0xec, 0x1a, 0xba, 0x04, 0xb7, 0xbb, 0x97, 0x17, 0x71, 0x65, 0x82, 0xaa,
- 0x17, 0x09, 0x87, 0x36, 0x5d, 0x36, 0xa1, 0x43, 0x4b, 0x48, 0x90, 0xca,
- 0x74, 0x03, 0x04, 0x44, 0x80, 0xa9, 0xf3, 0x11, 0x21, 0xb4, 0x81, 0xaa,
- 0x76, 0x1b, 0x51, 0x93, 0x01, 0x27, 0xce, 0xe9, 0xa4, 0x74, 0x47, 0x99,
- 0xb5, 0xa8, 0x75, 0xd2, 0xe9, 0x4f, 0x23, 0xb4, 0xd9, 0xa5, 0x33, 0x2d,
- 0xef, 0x0a, 0x14, 0x4f, 0x49, 0x42, 0xbb, 0x06, 0xdd, 0x9f, 0xc7, 0xd8,
- 0x57, 0xbc, 0xbb, 0x75, 0x7f, 0x37, 0xf4, 0xa8, 0x50, 0x49, 0x18, 0x4c,
- 0xf2, 0x20, 0x5f, 0x3c, 0x3c, 0x81, 0xb4, 0x6c, 0x4a, 0x28, 0xd3, 0x12,
- 0x31, 0xf6, 0xa2, 0xa9, 0x97, 0xd7, 0xd7, 0x48, 0x0f, 0x09, 0xba, 0x48,
- 0xe8, 0x4b, 0x0b, 0x80, 0x10, 0xb6, 0x3a, 0x23, 0xcf, 0xd1, 0x73, 0x9d,
- 0x0d, 0x07, 0xf3, 0x14, 0xc9, 0x53, 0x3b, 0x86, 0x97, 0x95, 0x40, 0x60,
- 0xe0, 0x65, 0xe4, 0x9c, 0x4f, 0xbc, 0xe4, 0xcf, 0x2a, 0x1b, 0x58, 0xbe,
- 0xec, 0xae, 0x50, 0x0c, 0xe2, 0x18, 0x2a, 0x1c, 0xe1, 0x74, 0x58, 0x2d,
- 0x06, 0xd7, 0x3a, 0x09, 0xc9, 0xd5, 0x66, 0xd3, 0x24, 0xc9, 0xc5, 0xca,
- 0x49, 0xe1, 0x9c, 0xd5, 0x5b, 0xd9, 0x34, 0xc9, 0x56, 0x26, 0x47, 0x58,
- 0x68, 0x9d, 0x26, 0x64, 0x9d, 0x83, 0xc0, 0x49, 0x45, 0x5f, 0x6d, 0x7a,
- 0x3a, 0xdc, 0x0f, 0x96, 0x96, 0x2a, 0xa4, 0x4f, 0x26, 0x03, 0x28, 0x04,
- 0x2f, 0x59, 0x4b, 0xd9, 0x11, 0x2d, 0x61, 0x85, 0xf3, 0x60, 0x94, 0xc9,
- 0x8c, 0x1f, 0x1d, 0x1d, 0x89, 0x42, 0x73, 0x79, 0xd3, 0x51, 0x2d, 0x6c,
- 0x0a, 0xa3, 0xa8, 0x56, 0x31, 0x78, 0x58, 0x7d, 0xb3, 0x6c, 0xa6, 0xa8,
- 0x96, 0x42, 0x42, 0x43, 0xa5, 0xb0, 0xc5, 0xfc, 0x76, 0x88, 0x26, 0xa8,
- 0x6e, 0x15, 0x23, 0x04, 0xb4, 0xed, 0x00, 0x14, 0xb9, 0x60, 0x7a, 0x4b,
- 0xbc, 0x28, 0x6d, 0x77, 0x6b, 0x31, 0x70, 0x57, 0xfd, 0x5c, 0x50, 0xed,
- 0x60, 0x1d, 0xf1, 0x6e, 0xd9, 0x56, 0xf0, 0xd9, 0x34, 0xe7, 0x88, 0x24,
- 0xe1, 0x4c, 0xf0, 0xad, 0x6e, 0xdb, 0x0f, 0xac, 0x87, 0x4c, 0x75, 0x7b,
- 0x49, 0x9e, 0xaf, 0x5c, 0x92, 0xe8, 0xe4, 0x93, 0x79, 0x45, 0xd3, 0xbe,
- 0x75, 0x04, 0x96, 0x8a, 0x23, 0x39, 0x12, 0x47, 0x37, 0x14, 0x70, 0x9a,
- 0xd1, 0xe2, 0x98, 0x2e, 0xd7, 0x2c, 0x06, 0x94, 0x04, 0x7e, 0x74, 0xba,
- 0x73, 0x79, 0xda, 0x4d, 0xde, 0xa2, 0x0a, 0x21, 0x95, 0x16, 0xd9, 0x69,
- 0xf9, 0x3e, 0x79, 0x8a, 0xfc, 0x9a, 0xc9, 0x76, 0x87, 0xf3, 0x57, 0xa2,
- 0xc9, 0x3f, 0xcb, 0x42, 0x41, 0x3d, 0xf6, 0x1a, 0x2f, 0xb2, 0x02, 0xa8,
- 0x78, 0xa5, 0x9e, 0x66, 0x70, 0x77, 0x9d, 0xbc, 0x3b, 0xbc, 0x24, 0xa0,
- 0x4e, 0x23, 0xd9, 0x2e, 0xe4, 0x0b, 0xea, 0x36, 0xa7, 0x44, 0x23, 0x96,
- 0x9a, 0x21, 0x9d, 0x38, 0xb6, 0x4b, 0xd5, 0xda, 0x79, 0xf9, 0x6a, 0xdd,
- 0x78, 0xeb, 0xa6, 0xdf, 0x4c, 0xa9, 0xdc, 0x0f, 0xdd, 0x3d, 0xdf, 0x5d,
- 0x8d, 0xbd, 0xe8, 0x6a, 0xf0, 0x04, 0xc4, 0x8f, 0xc3, 0x85, 0x08, 0x73,
- 0x9d, 0x68, 0x56, 0x90, 0x6c, 0xf7, 0x67, 0xe5, 0x75, 0x4e, 0x2e, 0x41,
- 0xac, 0x17, 0xf6, 0xb5, 0x96, 0x89, 0xea, 0xca, 0x60, 0x9e, 0x9d, 0x9a,
- 0x31, 0x45, 0x6d, 0x84, 0x18, 0x1f, 0x11, 0xba, 0x29, 0xec, 0x9c, 0x2a,
- 0xb5, 0x91, 0x85, 0x73, 0x46, 0x0a, 0x0d, 0x93, 0x94, 0xc9, 0x27, 0xc6,
- 0x56, 0x98, 0xdc, 0x0f, 0x05, 0xb5, 0x5d, 0xb7, 0x83, 0xa3, 0x79, 0x8b,
- 0xd7, 0x40, 0x5d, 0xa5, 0xf5, 0x72, 0x11, 0x85, 0x33, 0xc9, 0x08, 0xd7,
- 0x3a, 0xe4, 0x9f, 0xb7, 0xae, 0x8f, 0xaf, 0xc9, 0x34, 0xbb, 0x0e, 0xae,
- 0x5d, 0x4b, 0x8a, 0x1e, 0x49, 0x24, 0x87, 0xb6, 0x8a, 0xa2, 0x4e, 0x52,
- 0x04, 0xc5, 0x95, 0x88, 0x61, 0x53, 0x6b, 0x30, 0xed, 0x47, 0xc9, 0xd6,
- 0xfa, 0x5d, 0x6a, 0x65, 0x4e, 0x73, 0x6f, 0x73, 0x1c, 0x79, 0x79, 0x72,
- 0xb9, 0x05, 0x4b, 0x76, 0x9a, 0xfb, 0xfa, 0xd8, 0x11, 0xe3, 0x79, 0xd1,
- 0x73, 0x65, 0x5a, 0x74, 0xa4, 0x79, 0xe0, 0xab, 0xa4, 0x80, 0xd3, 0x1d,
- 0x55, 0x85, 0xb8, 0x5b, 0x61, 0xed, 0xb0, 0x3e, 0x7b, 0xe9, 0xd8, 0xb6,
- 0xf8, 0x7c, 0x28, 0x1f, 0xa1, 0x8a, 0x2c, 0x2a, 0xf2, 0x2a, 0x3c, 0x63,
- 0x9b, 0xff, 0xbe, 0xe9, 0xe8, 0x5f, 0x87, 0x2b, 0x13, 0xcf, 0xf3, 0xa2,
- 0x5d, 0x8f, 0x44, 0xe7, 0xe7, 0x04, 0x33, 0x41, 0xe1, 0xa6, 0xbe, 0xeb,
- 0xb4, 0xfd, 0x76, 0x9c, 0x38, 0xea, 0x81, 0x1e, 0x7d, 0x73, 0x7c, 0xf8,
- 0xda, 0x66, 0x45, 0xfc, 0x4a, 0x7e, 0x64, 0xae, 0x8e, 0xea, 0xaa, 0xba,
- 0x0b, 0x0a, 0x7f, 0x85, 0x8b, 0xc4, 0xba, 0xc1, 0xc6, 0x19, 0x93, 0xfc,
- 0x2d, 0xd5, 0x67, 0x82, 0xf5, 0xd1, 0xad, 0x8a, 0xdd, 0x62, 0x54, 0x36,
- 0xaa, 0xad, 0x4a, 0x67, 0x64, 0x25, 0xd7, 0xdd, 0x4a, 0x27, 0x89, 0xe7,
- 0x70, 0x56, 0xe7, 0x35, 0x29, 0xcd, 0x8c, 0x15, 0xf3, 0xb6, 0xf2, 0x35,
- 0xb6, 0xf2, 0xac, 0x1c, 0x97, 0x57, 0x57, 0x6b, 0xee, 0x77, 0x66, 0x1c,
- 0x00, 0xa6, 0x8b, 0xb7, 0x4c, 0x8f, 0xa6, 0x91, 0xde, 0x1b, 0x33, 0x23,
- 0x45, 0x65, 0x0e, 0x5b, 0x6f, 0xc8, 0x47, 0x40, 0x0a, 0x75, 0x45, 0x2a,
- 0x97, 0x3b, 0x2a, 0x18, 0x35, 0x20, 0xd4, 0xde, 0x43, 0xa2, 0x01, 0x7b,
- 0x66, 0x38, 0x9a, 0xed, 0x51, 0xb7, 0xd5, 0xc9, 0x7f, 0xfe, 0xd7, 0x8f,
- 0x3f, 0x47, 0xc8, 0xeb, 0xc8, 0xf7, 0x77, 0xc3, 0x28, 0x49, 0xf3, 0xb4,
- 0xd2, 0x21, 0x59, 0x82, 0x31, 0x57, 0x2f, 0x8f, 0x34, 0xb0, 0x6c, 0x76,
- 0x25, 0x29, 0x44, 0xb1, 0x78, 0x8a, 0x54, 0xac, 0xd0, 0x0f, 0x82, 0x3b,
- 0x9b, 0x80, 0xed, 0x8c, 0x44, 0x26, 0x3a, 0x28, 0x70, 0xc0, 0x3a, 0x10,
- 0x8f, 0x25, 0x8b, 0xe1, 0x95, 0x08, 0x32, 0xe2, 0x1c, 0x51, 0xab, 0x45,
- 0x75, 0xd9, 0x0d, 0x78, 0x62, 0xbd, 0x9e, 0xde, 0x4a, 0xd8, 0x68, 0xea,
- 0xaa, 0x4c, 0xcb, 0x84, 0x4a, 0x67, 0x6f, 0x27, 0x6f, 0x50, 0x44, 0xd9,
- 0x4b, 0x73, 0xc4, 0x16, 0xfc, 0x17, 0x1c, 0x79, 0x9b, 0x33, 0x2a, 0x18,
- 0xbc, 0x68, 0x8d, 0x11, 0x31, 0x10, 0xb1, 0xf9, 0xd9, 0xc9, 0x80, 0xa5,
- 0x61, 0x18, 0x7d, 0x09, 0xb8, 0x92, 0x56, 0x3c, 0x50, 0xd7, 0xbb, 0xa4,
- 0x12, 0x11, 0x2e, 0x22, 0x88, 0x43, 0x31, 0x8e, 0x7a, 0xe8, 0x95, 0x84,
- 0x28, 0xfd, 0xe8, 0x16, 0x75, 0x5a, 0x00, 0x3a, 0x1a, 0xca, 0xe0, 0x52,
- 0x5e, 0x75, 0x3c, 0x87, 0x82, 0x40, 0xe4, 0x04, 0x7a, 0x41, 0x92, 0x03,
- 0x19, 0xd1, 0x5c, 0x4a, 0x45, 0xae, 0x61, 0xa4, 0x58, 0xd1, 0x78, 0xbd,
- 0x89, 0xf3, 0xea, 0x58, 0x26, 0x2f, 0xf9, 0xcf, 0x9d, 0x2f, 0xa3, 0xe9,
- 0x7d, 0x02, 0x16, 0x3c, 0x06, 0xa5, 0xbc, 0xbc, 0x61, 0x46, 0xac, 0x05,
- 0x46, 0x64, 0xd3, 0xa9, 0x20, 0x84, 0x46, 0x2e, 0x70, 0xdf, 0x98, 0x40,
- 0xf5, 0xe0, 0x56, 0x9c, 0x37, 0xe0, 0x97, 0x08, 0x00, 0x55, 0x2c, 0xd7,
- 0xa8, 0x44, 0x1d, 0x69, 0x90, 0xd8, 0xcb, 0x82, 0x0d, 0x93, 0x18, 0x03,
- 0xab, 0x82, 0x13, 0x70, 0x7a, 0xf8, 0x74, 0x53, 0x81, 0xcf, 0xd4, 0xcc,
- 0x5a, 0xdd, 0x18, 0x95, 0x4c, 0xfb, 0x4b, 0x8f, 0xdd, 0x08, 0xca, 0x09,
- 0xba, 0x3d, 0x33, 0x6f, 0xd5, 0x51, 0x6f, 0x94, 0x20, 0xb5, 0xc4, 0xeb,
- 0x0c, 0x1a, 0x77, 0xb6, 0xb3, 0x59, 0xaa, 0x2f, 0x49, 0xc0, 0x70, 0x55,
- 0x78, 0x50, 0x2d, 0x55, 0x9c, 0xce, 0x1c, 0x39, 0xbd, 0xf2, 0x75, 0xdf,
- 0x9b, 0xd1, 0xbd, 0x45, 0xfc, 0xcf, 0xb4, 0x75, 0xa3, 0x50, 0x7c, 0x99,
- 0xb9, 0x83, 0x8c, 0x43, 0x9d, 0x9d, 0xa6, 0xca, 0x27, 0x1f, 0x73, 0x80,
- 0x9a, 0x96, 0x10, 0x2f, 0x69, 0xa1, 0xd6, 0x0c, 0x77, 0xd3, 0x71, 0xd9,
- 0x4c, 0xc9, 0x19, 0xf7, 0x97, 0x95, 0xcc, 0x9f, 0x20, 0xc8, 0x20, 0x35,
- 0x96, 0x92, 0xe4, 0xb5, 0x3f, 0x33, 0x20, 0x75, 0xec, 0x69, 0x51, 0xc1,
- 0x41, 0x35, 0x0d, 0x21, 0xbb, 0x22, 0xb4, 0x1d, 0x19, 0x0a, 0x12, 0xc0,
- 0x0c, 0xd5, 0x52, 0x37, 0x54, 0x42, 0x0b, 0xa2, 0x7a, 0x68, 0x74, 0xa3,
- 0x79, 0x79, 0xeb, 0xe8, 0x35, 0x68, 0xc8, 0x32, 0x3d, 0x46, 0xdc, 0x5c,
- 0xe7, 0xb7, 0x51, 0xca, 0xc6, 0xd4, 0x76, 0x8c, 0xd3, 0x0e, 0xb4, 0x1b,
- 0x8e, 0xf5, 0x5b, 0xa3, 0x2d, 0xec, 0x30, 0xa1, 0x4c, 0x5b, 0x99, 0xd9,
- 0xe0, 0x04, 0xcf, 0x48, 0x82, 0xa2, 0x92, 0xd4, 0x81, 0xd9, 0xfe, 0x49,
- 0xef, 0x9b, 0xb2, 0x6e, 0x0e, 0x7a, 0x96, 0x34, 0x06, 0xb6, 0x3e, 0x73,
- 0xb2, 0xf8, 0x3b, 0x47, 0x4a, 0x2a, 0x0c, 0xa2, 0x34, 0xa7, 0x72, 0x93,
- 0x18, 0xc1, 0x26, 0x4f, 0x2b, 0x66, 0x85, 0x73, 0xb8, 0x5c, 0x8e, 0x3c,
- 0x6d, 0xf9, 0x79, 0x2e, 0x7d, 0xa0, 0xe2, 0xb6, 0x21, 0x8c, 0x8d, 0xba,
- 0xf4, 0xc3, 0xe0, 0x08, 0x1f, 0x1f, 0x7c, 0x83, 0xe6, 0xfe, 0xdc, 0xb3,
- 0x4e, 0x88, 0xee, 0xaf, 0x0e, 0xc2, 0x52, 0x6e, 0xce, 0x39, 0xcf, 0x17,
- 0xa1, 0xad, 0x1c, 0x8a, 0x18, 0xa7, 0xe6, 0x35, 0x72, 0x85, 0xaa, 0xe9,
- 0x74, 0x47, 0x17, 0x5c, 0xb8, 0x06, 0x8b, 0x66, 0x15, 0x27, 0xfe, 0xa2,
- 0xa2, 0xd8, 0x16, 0x95, 0xc0, 0x1c, 0x94, 0x57, 0x03, 0xd4, 0xbd, 0x99,
- 0xa7, 0xd5, 0x47, 0x8a, 0x93, 0x7b, 0xa7, 0x0e, 0xe0, 0x7b, 0x64, 0x98,
- 0x4e, 0xa7, 0xb1, 0xab, 0x02, 0xe8, 0x50, 0xc4, 0x58, 0x65, 0xe3, 0x4b,
- 0x87, 0x64, 0x21, 0x0f, 0xc4, 0x53, 0x84, 0xd7, 0x2d, 0xa5, 0x26, 0xe5,
- 0xcc, 0xae, 0x65, 0xe0, 0xec, 0xf3, 0x6d, 0x82, 0x51, 0x43, 0xa7, 0x98,
- 0xb3, 0x7b, 0x01, 0x3e, 0x91, 0xe5, 0x02, 0x9a, 0x2f, 0xa5, 0xa9, 0x07,
- 0xf6, 0x00, 0xb9, 0xdd, 0xb0, 0xc3, 0x48, 0x71, 0xfa, 0x6c, 0xf8, 0xec,
- 0x59, 0xb7, 0x0c, 0x3a, 0x5d, 0xb3, 0x0d, 0xd4, 0xcf, 0xc2, 0x05, 0xb0,
- 0xcd, 0xc3, 0x5f, 0xae, 0xc2, 0x48, 0x72, 0xa9, 0xb4, 0xbe, 0xbd, 0x1c,
- 0x32, 0x50, 0xc4, 0xd0, 0xa8, 0x65, 0xa4, 0x36, 0xdc, 0xcc, 0xa5, 0x83,
- 0x04, 0xc7, 0x0e, 0x40, 0x68, 0x2c, 0xaf, 0x5f, 0xc0, 0x04, 0x5f, 0x0e,
- 0xba, 0xa4, 0xea, 0x96, 0x5a, 0x55, 0xdb, 0xb5, 0x98, 0x49, 0xa6, 0x49,
- 0x5d, 0x69, 0xfb, 0x20, 0x85, 0xfe, 0x50, 0xe9, 0x08, 0x07, 0x66, 0x52,
- 0x85, 0x44, 0x7e, 0x90, 0xa1, 0xda, 0x2b, 0x00, 0xf1, 0x9a, 0x2d, 0x5f,
- 0xaf, 0x9e, 0x33, 0xe6, 0x40, 0xf8, 0x8c, 0x66, 0xcc, 0xb2, 0x27, 0x29,
- 0x4f, 0xa0, 0xbb, 0x1f, 0xb0, 0x6d, 0xbd, 0xb3, 0xd4, 0x9d, 0x33, 0x92,
- 0x2a, 0x5a, 0x08, 0x4b, 0x4c, 0x69, 0x34, 0xb1, 0x12, 0xba, 0xbb, 0x02,
- 0xea, 0x86, 0x63, 0xf3, 0x86, 0x94, 0xc8, 0xc1, 0x3b, 0xb3, 0x0c, 0x07,
- 0xc9, 0x7f, 0x94, 0x59, 0x0f, 0x90, 0xd9, 0x0e, 0x62, 0x36, 0xc8, 0x3a,
- 0x3d, 0xbc, 0x78, 0x77, 0xf2, 0xee, 0xeb, 0x03, 0x2b, 0xe3, 0x50, 0x70,
- 0x4b, 0xb1, 0xd3, 0x7e, 0x94, 0xcf, 0x15, 0x6e, 0xc5, 0x23, 0xe0, 0x2c,
- 0x98, 0xcd, 0x56, 0x50, 0xa0, 0xc0, 0xd5, 0x0e, 0x09, 0x2d, 0x26, 0x75,
- 0xbb, 0x16, 0x9a, 0xad, 0xec, 0x20, 0xb0, 0x47, 0xdc, 0x97, 0x4d, 0x19,
- 0xe8, 0x42, 0xec, 0xd2, 0x6e, 0x15, 0x13, 0xb4, 0x50, 0xfa, 0xc2, 0xa8,
- 0x56, 0xa9, 0x55, 0xcd, 0x55, 0x8a, 0x66, 0x9c, 0x8f, 0x05, 0xa9, 0x18,
- 0x06, 0x3d, 0x81, 0x85, 0x43, 0x7c, 0xa1, 0xe6, 0xbb, 0x02, 0xc5, 0x0a,
- 0x94, 0x03, 0x90, 0x89, 0xbc, 0x6a, 0xac, 0x5a, 0x9d, 0x43, 0xff, 0xb5,
- 0xb3, 0xb2, 0x42, 0x53, 0x73, 0x25, 0x9a, 0xb5, 0x02, 0x9e, 0x64, 0xff,
- 0xc9, 0x4f, 0x5d, 0x19, 0x09, 0x3b, 0xfe, 0x47, 0x03, 0xed, 0xbc, 0x3a,
- 0x89, 0x5c, 0xb7, 0x1b, 0xce, 0x01, 0x4f, 0x6a, 0xed, 0x54, 0xb8, 0x4d,
- 0x62, 0x90, 0x10, 0x7a, 0x4b, 0x55, 0x06, 0xa7, 0xee, 0xdc, 0xb0, 0xba,
- 0x33, 0x5b, 0x04, 0xd9, 0xac, 0x84, 0x01, 0x4f, 0xe8, 0x37, 0x6a, 0x67,
- 0x90, 0x4f, 0x95, 0x4b, 0x09, 0x0b, 0x4a, 0xa8, 0x5d, 0xf3, 0x4b, 0xd9,
- 0xa8, 0x59, 0xae, 0x87, 0x57, 0x2a, 0x65, 0x54, 0x65, 0x9c, 0xd1, 0x07,
- 0xff, 0x9f, 0xb5, 0x4b, 0x69, 0x8e, 0x17, 0xcb, 0xf1, 0x7c, 0xfa, 0x2c,
- 0x79, 0x69, 0xfe, 0x13, 0xe8, 0x59, 0x40, 0x34, 0x8d, 0x8e, 0xb4, 0x4e,
- 0xa9, 0xd6, 0x69, 0x57, 0xd5, 0x9e, 0xfe, 0xfa, 0x64, 0xdf, 0xf4, 0xf4,
- 0x53, 0xaa, 0x09, 0xe4, 0x46, 0x29, 0xbc, 0xce, 0x9b, 0x3a, 0x5a, 0x46,
- 0x58, 0x13, 0x76, 0x3c, 0xce, 0x66, 0x5a, 0xf1, 0xbd, 0xfd, 0xcf, 0x93,
- 0x71, 0xde, 0x24, 0x6f, 0x5f, 0x3f, 0x4b, 0x8c, 0x69, 0x32, 0xf9, 0x58,
- 0x2f, 0xe7, 0x2a, 0x91, 0xa5, 0x22, 0x16, 0xf5, 0x73, 0xb3, 0xab, 0x18,
- 0x99, 0x8e, 0xcf, 0xf2, 0x49, 0xf2, 0x31, 0xbb, 0xf7, 0x21, 0x4d, 0x54,
- 0x8d, 0xa3, 0xb6, 0xb5, 0x1d, 0xc4, 0xe5, 0xe9, 0x6e, 0x0e, 0x44, 0xb3,
- 0x38, 0xe2, 0x1b, 0xf1, 0xa8, 0x99, 0x39, 0x30, 0x1f, 0xaf, 0xb9, 0x84,
- 0xc6, 0x5a, 0x3f, 0xc2, 0x67, 0x2d, 0x57, 0xcc, 0x2e, 0x96, 0xd2, 0x9c,
- 0xef, 0xbd, 0xe1, 0xee, 0xaa, 0xc4, 0x16, 0x04, 0x4f, 0x5b, 0x19, 0x6f,
- 0xb0, 0x07, 0xa4, 0xca, 0x4f, 0x62, 0xde, 0xf4, 0xf5, 0x30, 0x8e, 0xf0,
- 0xc4, 0x0a, 0x45, 0x5b, 0x5d, 0x88, 0x4d, 0x40, 0x2a, 0x45, 0xe5, 0x37,
- 0xf4, 0x58, 0x08, 0xa8, 0x74, 0x77, 0x4f, 0x1c, 0x4f, 0xf4, 0xaf, 0x96,
- 0xab, 0x4f, 0x7e, 0xbd, 0xa2, 0xc8, 0x4d, 0x90, 0xbd, 0xd7, 0x19, 0xcb,
- 0xde, 0xda, 0x6e, 0x78, 0xfd, 0xc0, 0xdc, 0xb9, 0xc9, 0xb3, 0x84, 0x48,
- 0xdc, 0x1f, 0x9d, 0xf3, 0xd0, 0x13, 0x1f, 0x92, 0x14, 0xe1, 0x0d, 0x23,
- 0xf2, 0xf3, 0xb2, 0x1a, 0x90, 0x4a, 0x38, 0xcb, 0xa6, 0xc1, 0x15, 0x1d,
- 0x5b, 0x0c, 0x9c, 0x63, 0x14, 0x38, 0x14, 0x76, 0x05, 0xf2, 0x63, 0x91,
- 0xa3, 0x0c, 0x43, 0xb2, 0x22, 0x34, 0x86, 0x58, 0xa4, 0x27, 0x76, 0xf6,
- 0xad, 0x06, 0x88, 0x7f, 0xd2, 0x94, 0xbe, 0x5f, 0x5c, 0x57, 0xe9, 0x14,
- 0x15, 0xe6, 0x1a, 0x9f, 0xad, 0x09, 0x9d, 0x4b, 0x92, 0x55, 0xbd, 0xf3,
- 0xc8, 0x9c, 0xc4, 0xe3, 0xa5, 0x09, 0x09, 0xb5, 0x7e, 0xaa, 0xa6, 0x0c,
- 0x0c, 0x47, 0xb5, 0x4a, 0x3f, 0x75, 0x74, 0x56, 0x31, 0x62, 0x86, 0xba,
- 0x11, 0x98, 0x94, 0x34, 0xd0, 0x82, 0x11, 0x12, 0xe3, 0x0c, 0x5f, 0x2e,
- 0x96, 0xf5, 0x76, 0xea, 0x68, 0x57, 0x83, 0xac, 0x57, 0x5e, 0x5c, 0xd1,
- 0x12, 0x68, 0x86, 0x56, 0x67, 0x2b, 0xae, 0x58, 0x8e, 0x47, 0x33, 0x20,
- 0x75, 0x65, 0x7b, 0x97, 0xc3, 0x8a, 0x47, 0x33, 0x7c, 0xdc, 0xe6, 0xde,
- 0xed, 0x47, 0x7b, 0x47, 0xdb, 0xcd, 0xdf, 0xfc, 0xad, 0x44, 0xc6, 0x17,
- 0x91, 0xcd, 0xf5, 0xab, 0xce, 0xc2, 0xfe, 0x3a, 0xc7, 0xaf, 0x51, 0xe2,
- 0xd3, 0xd9, 0xc2, 0xdc, 0xa2, 0xf2, 0x85, 0x47, 0xcd, 0x4f, 0x77, 0x99,
- 0x63, 0x1c, 0x5f, 0xbf, 0x60, 0x7e, 0xba, 0x73, 0xe3, 0xcb, 0x32, 0x7f,
- 0x7e, 0xba, 0x6b, 0xb9, 0x96, 0x31, 0x8c, 0xe9, 0x28, 0xb4, 0x50, 0xc9,
- 0x60, 0x96, 0x15, 0xd7, 0x41, 0xce, 0x38, 0x17, 0x23, 0xd4, 0xb4, 0x76,
- 0x73, 0x30, 0xe8, 0xaf, 0xfd, 0xe4, 0x84, 0x99, 0x2c, 0xb8, 0xe8, 0x35,
- 0xbf, 0x7e, 0x8a, 0xd7, 0x6d, 0xf1, 0x6b, 0x71, 0xbd, 0x45, 0x92, 0x39,
- 0xf2, 0xc9, 0x92, 0xcb, 0x88, 0x2d, 0xb9, 0x6e, 0x21, 0xe9, 0x70, 0xea,
- 0x49, 0xa9, 0x96, 0x05, 0x2e, 0xac, 0xc3, 0x05, 0xe5, 0x89, 0x19, 0x19,
- 0xf5, 0xc9, 0x95, 0x5a, 0x8e, 0x38, 0x1e, 0xa5, 0xf4, 0x39, 0x0a, 0x34,
- 0x33, 0x4c, 0xa9, 0xdb, 0x1d, 0xb4, 0xce, 0x39, 0x7a, 0x33, 0x02, 0xe6,
- 0x55, 0xac, 0xc4, 0xec, 0x1b, 0xcb, 0xf1, 0x3a, 0xa0, 0xd2, 0x19, 0xdf,
- 0x37, 0x11, 0xcc, 0x2c, 0x8d, 0x9a, 0x66, 0x61, 0xab, 0x96, 0xa0, 0xfc,
- 0xd3, 0xe7, 0xc3, 0xdd, 0xed, 0x3e, 0x55, 0x60, 0x58, 0x60, 0x06, 0x08,
- 0xd4, 0x68, 0xef, 0x7a, 0xc2, 0xf4, 0xe6, 0xd7, 0x64, 0x43, 0xc1, 0xde,
- 0x8c, 0x84, 0xac, 0xbc, 0x24, 0x23, 0x8d, 0xb4, 0x4a, 0x72, 0x71, 0x9b,
- 0x44, 0x28, 0xef, 0x83, 0xaa, 0x12, 0xde, 0x92, 0xae, 0xb7, 0x54, 0x7c,
- 0x28, 0x2c, 0x87, 0xb0, 0x95, 0xbd, 0x94, 0x72, 0x4b, 0xa4, 0x65, 0x09,
- 0xdf, 0x85, 0x9a, 0x09, 0x0e, 0xe4, 0x88, 0x6f, 0xc5, 0xb1, 0xc0, 0xc8,
- 0x9b, 0x13, 0x58, 0xdb, 0xfc, 0x0d, 0x31, 0x8a, 0xa0, 0x74, 0xaa, 0xc4,
- 0x23, 0xbb, 0xa5, 0xef, 0xaa, 0x61, 0x77, 0xbd, 0x54, 0x60, 0x4c, 0x61,
- 0xdd, 0xc0, 0x51, 0x03, 0xb4, 0x0e, 0x9c, 0xa6, 0xf2, 0x0f, 0x87, 0xb1,
- 0x82, 0x68, 0xb7, 0x79, 0x76, 0xd7, 0x72, 0x0e, 0x49, 0xbf, 0xfa, 0x96,
- 0x14, 0x8b, 0x6d, 0x92, 0xdb, 0xbe, 0x57, 0xca, 0x7e, 0x05, 0xf6, 0xce,
- 0x1d, 0x64, 0xff, 0x69, 0x6f, 0x9a, 0x3f, 0xf2, 0x34, 0xd7, 0x31, 0xf0,
- 0x3c, 0xa7, 0xc1, 0x3b, 0xfe, 0x9e, 0x3e, 0x29, 0xe8, 0xd5, 0x7d, 0x02,
- 0xb6, 0x26, 0xa7, 0xb8, 0x40, 0xae, 0x30, 0x58, 0x2b, 0xaf, 0x39, 0x0b,
- 0x3d, 0x87, 0x0b, 0x3c, 0xd4, 0x7e, 0xf9, 0x33, 0xed, 0x33, 0x2f, 0x7e,
- 0x1b, 0x5b, 0x81, 0xa6, 0x2a, 0x27, 0x99, 0x94, 0x21, 0xb6, 0x04, 0x34,
- 0xb0, 0x0c, 0x22, 0xe1, 0x19, 0x59, 0x11, 0x8f, 0xad, 0xca, 0x8b, 0x26,
- 0x38, 0x0a, 0xb1, 0x44, 0x07, 0x18, 0x2f, 0xab, 0xad, 0xeb, 0xea, 0x8d,
- 0xa9, 0x35, 0x92, 0xf1, 0xbd, 0x32, 0x39, 0x8a, 0x77, 0xc0, 0x65, 0xd7,
- 0x07, 0x3c, 0x30, 0xae, 0xd2, 0xa7, 0xcd, 0x94, 0x72, 0x7e, 0x16, 0xce,
- 0x33, 0xc5, 0xc8, 0xa4, 0xf1, 0xda, 0x27, 0x46, 0x08, 0x48, 0x82, 0xbc,
- 0x8a, 0x3b, 0x54, 0x05, 0x15, 0x3c, 0x6b, 0xd1, 0x25, 0x66, 0x13, 0xbc,
- 0x80, 0xa6, 0x6d, 0xb6, 0x73, 0xb9, 0x24, 0xd7, 0x3c, 0xce, 0xbe, 0xa4,
- 0xf3, 0x48, 0x06, 0xcf, 0x41, 0xd7, 0x18, 0xd4, 0x1c, 0x49, 0x9a, 0xfd,
- 0xe1, 0x4d, 0xfa, 0xe9, 0xd3, 0xb0, 0xce, 0x76, 0xcc, 0xae, 0xad, 0x77,
- 0xea, 0x7a, 0x46, 0x1f, 0xad, 0x91, 0x52, 0xb7, 0xfa, 0x7a, 0x60, 0xfb,
- 0x55, 0xe7, 0x57, 0x84, 0xf1, 0x24, 0xa5, 0x57, 0x5b, 0xc2, 0xd6, 0xf1,
- 0xe1, 0x32, 0x29, 0x58, 0x17, 0x58, 0xc1, 0x34, 0x03, 0x60, 0xcd, 0xf0,
- 0x53, 0x13, 0x58, 0x34, 0xb8, 0x00, 0x96, 0x6d, 0xc7, 0xb1, 0xa7, 0x10,
- 0xaf, 0x40, 0xb5, 0x0a, 0x07, 0x27, 0x67, 0xd5, 0x83, 0x24, 0x98, 0x49,
- 0xb1, 0x70, 0x31, 0x73, 0x3f, 0x14, 0x9a, 0xe9, 0x24, 0xc4, 0x7b, 0x5c,
- 0x25, 0x26, 0x52, 0x8d, 0x7a, 0x95, 0x21, 0xed, 0x0d, 0x8d, 0x80, 0x75,
- 0x07, 0x7b, 0x76, 0x4e, 0xef, 0xee, 0xee, 0x86, 0xeb, 0x2c, 0xe9, 0xdf,
- 0x8f, 0x90, 0xae, 0xcd, 0xe0, 0xe9, 0xad, 0xc3, 0x53, 0x9c, 0xf6, 0xc5,
- 0xed, 0xd3, 0x75, 0xec, 0x87, 0x4d, 0x4b, 0x5b, 0xa0, 0xed, 0x34, 0xbb,
- 0xe5, 0x89, 0x84, 0xcf, 0xde, 0x67, 0x81, 0xcd, 0x38, 0x20, 0xd0, 0x8f,
- 0xa4, 0x46, 0x81, 0x2f, 0xa4, 0xb4, 0x89, 0x64, 0x80, 0xbe, 0x12, 0x01,
- 0xe9, 0xea, 0x6e, 0x7b, 0x77, 0x7e, 0x57, 0xc5, 0x6e, 0xb3, 0x33, 0xfa,
- 0xaa, 0xf9, 0xf3, 0x50, 0x71, 0x22, 0x4a, 0x52, 0x6f, 0xcc, 0xcf, 0x65,
- 0xcc, 0xcf, 0xff, 0xb1, 0x31, 0x3f, 0xff, 0xf5, 0x63, 0x7e, 0xfa, 0x4f,
- 0x1f, 0xf3, 0x5f, 0x69, 0xcc, 0x7f, 0x5d, 0x16, 0x1f, 0x07, 0x35, 0x15,
- 0xae, 0x35, 0xd6, 0x82, 0x5c, 0x56, 0x71, 0xfd, 0xd0, 0x51, 0xa9, 0x21,
- 0x2d, 0x87, 0x53, 0xb2, 0x63, 0xf5, 0xc4, 0x5d, 0xfd, 0xba, 0xfe, 0xea,
- 0xda, 0x0b, 0x9e, 0xe7, 0x2d, 0xa7, 0x4c, 0x80, 0x7a, 0x42, 0x8a, 0x3c,
- 0xe2, 0xd1, 0x3d, 0xe9, 0x8e, 0xbd, 0x3c, 0x7b, 0x43, 0xbf, 0x86, 0x5e,
- 0x90, 0xa9, 0x58, 0x1b, 0x51, 0x0a, 0x5f, 0x3c, 0x13, 0x56, 0xd8, 0x30,
- 0x84, 0x63, 0xff, 0x47, 0x86, 0x65, 0x61, 0x2e, 0x4c, 0x6d, 0x99, 0x60,
- 0xff, 0xe4, 0x72, 0x0b, 0x71, 0xd1, 0x97, 0xf7, 0x0b, 0x6a, 0x4e, 0x0b,
- 0xae, 0xd5, 0x5a, 0x94, 0x42, 0x7b, 0x98, 0x74, 0x3b, 0xa7, 0xd8, 0x65,
- 0x72, 0x96, 0x6e, 0x06, 0xb7, 0xe3, 0x64, 0x56, 0xd2, 0x71, 0x25, 0x25,
- 0x66, 0xcd, 0x51, 0xec, 0xd4, 0x4c, 0x0f, 0x58, 0x36, 0x7d, 0x21, 0xf9,
- 0x31, 0xcb, 0x16, 0xe9, 0x0c, 0x49, 0x77, 0x14, 0x7a, 0x5a, 0xc5, 0x04,
- 0xd8, 0xde, 0x18, 0x35, 0x61, 0x89, 0x58, 0xcf, 0xc1, 0x5b, 0x89, 0x9f,
- 0x22, 0xa0, 0x29, 0xde, 0xb4, 0x9a, 0x84, 0xa0, 0x4b, 0xf2, 0x69, 0x40,
- 0x7e, 0x20, 0xca, 0x98, 0x06, 0x9f, 0x6c, 0x27, 0xe8, 0x26, 0x1e, 0x4b,
- 0x02, 0x28, 0x10, 0x0f, 0xd4, 0xba, 0x12, 0x20, 0x10, 0xc3, 0x58, 0x7e,
- 0x9b, 0x4f, 0x97, 0x01, 0x75, 0x48, 0xf7, 0xfd, 0x21, 0x19, 0x98, 0x2d,
- 0x4e, 0x18, 0x5e, 0x3c, 0x7a, 0xa2, 0xb4, 0xc2, 0x1e, 0x65, 0x53, 0x89,
- 0x61, 0x37, 0xd8, 0x52, 0xc4, 0xbd, 0xe0, 0x11, 0xed, 0x1c, 0x9d, 0x7f,
- 0xf8, 0xf6, 0xf8, 0xf8, 0xfc, 0xe4, 0xf5, 0xe9, 0xb1, 0x9c, 0x18, 0xfb,
- 0xa3, 0x77, 0x97, 0xdf, 0x9d, 0x3a, 0xea, 0xcb, 0x78, 0xc9, 0xda, 0x2d,
- 0x61, 0x36, 0x49, 0x92, 0xd3, 0xbc, 0x58, 0x7e, 0xea, 0x83, 0xf0, 0xaf,
- 0x68, 0x92, 0xc3, 0x93, 0x1f, 0x8c, 0x8e, 0x76, 0x3e, 0x78, 0xff, 0x43,
- 0xc0, 0xb3, 0xd4, 0x42, 0x9d, 0xc5, 0xab, 0x50, 0x98, 0x4d, 0x08, 0x43,
- 0xc9, 0x8d, 0xdd, 0x42, 0xf3, 0x7f, 0x6b, 0x99, 0x1f, 0x34, 0xb7, 0x2c,
- 0xec, 0xed, 0xc8, 0x2f, 0x2a, 0x99, 0x19, 0xeb, 0x6c, 0x58, 0xfc, 0xe7,
- 0xbb, 0xca, 0x13, 0xb9, 0xd6, 0x61, 0xd4, 0x2e, 0x92, 0x68, 0x46, 0x73,
- 0x8f, 0x0a, 0x7f, 0xc9, 0x4b, 0xfa, 0x6f, 0x9c, 0xc7, 0x33, 0x39, 0xaf,
- 0xf2, 0x5b, 0xd2, 0x76, 0xcc, 0xc3, 0xec, 0x52, 0xa7, 0x67, 0x87, 0x96,
- 0xd7, 0x54, 0xdc, 0xfa, 0xd4, 0x0a, 0x22, 0x7f, 0x68, 0x35, 0x56, 0x60,
- 0x1b, 0x39, 0xb3, 0xe4, 0x7d, 0xb0, 0xad, 0xe5, 0x66, 0xeb, 0xbc, 0x3e,
- 0xbe, 0xe8, 0x53, 0x41, 0x75, 0x86, 0xad, 0x1d, 0xbf, 0xfb, 0x9a, 0x2b,
- 0xb5, 0x58, 0xf6, 0xce, 0x21, 0x83, 0x39, 0x42, 0x28, 0x9b, 0x37, 0x27,
- 0x54, 0x8f, 0x9d, 0xc2, 0x83, 0x75, 0x6d, 0x54, 0xf1, 0xdf, 0x31, 0xb5,
- 0x96, 0x87, 0xf6, 0xd2, 0xfc, 0x27, 0x36, 0x55, 0x46, 0x69, 0xfe, 0x66,
- 0x3b, 0x9c, 0x2d, 0xd1, 0x42, 0x6c, 0xe8, 0x52, 0x34, 0x60, 0x54, 0x95,
- 0xc7, 0x84, 0x99, 0x19, 0x09, 0x83, 0x68, 0x3a, 0x43, 0x05, 0x77, 0x5d,
- 0x99, 0xa5, 0x25, 0x02, 0xf2, 0x06, 0x8c, 0xae, 0xdf, 0xf4, 0x69, 0x5b,
- 0x82, 0x31, 0xc2, 0xcd, 0x45, 0x34, 0x6f, 0xa2, 0xca, 0x05, 0x57, 0xec,
- 0x7c, 0xcf, 0x46, 0xaf, 0x9a, 0xe6, 0x53, 0xae, 0xbd, 0x65, 0xce, 0x68,
- 0x45, 0xa1, 0xb3, 0xdf, 0x73, 0xe2, 0xaa, 0x71, 0xf2, 0x72, 0x66, 0x5e,
- 0x9c, 0xad, 0x00, 0x4c, 0x72, 0xd1, 0x2b, 0x57, 0xb9, 0xab, 0xc3, 0xfe,
- 0x25, 0xd5, 0x1d, 0xd8, 0xc2, 0x43, 0x3b, 0x1a, 0x52, 0x0c, 0xe8, 0x5d,
- 0x1b, 0xd8, 0x03, 0xa0, 0x20, 0xec, 0xa6, 0x55, 0x6e, 0x02, 0x61, 0xb6,
- 0xd9, 0x4f, 0x36, 0x89, 0xe2, 0x8c, 0xfe, 0x44, 0xb1, 0x07, 0x29, 0x6c,
- 0xb6, 0xd9, 0x0f, 0xab, 0xb6, 0x6c, 0xca, 0x7e, 0xdd, 0x24, 0x1e, 0x49,
- 0xf1, 0x18, 0x23, 0x52, 0x08, 0x40, 0x6c, 0x9a, 0x48, 0x5f, 0x34, 0x35,
- 0x80, 0x16, 0xc3, 0x85, 0xca, 0xeb, 0x80, 0x89, 0xcb, 0x36, 0xd7, 0xce,
- 0x7c, 0x5d, 0xa5, 0xef, 0xfd, 0xc6, 0xb2, 0x84, 0x97, 0xe1, 0x17, 0xf3,
- 0x7f, 0xdb, 0xd3, 0xd8, 0x69, 0x4e, 0xd7, 0xca, 0x5f, 0x67, 0x7d, 0x3f,
- 0x4a, 0x88, 0x7c, 0x28, 0xf0, 0xfe, 0x76, 0x10, 0x89, 0x80, 0x0f, 0x54,
- 0xd5, 0x92, 0x50, 0x2d, 0x84, 0x48, 0x13, 0xd4, 0xb2, 0x5f, 0x11, 0x84,
- 0xfe, 0x16, 0x46, 0xfd, 0x31, 0x54, 0xb0, 0xee, 0x68, 0xb7, 0x07, 0x6c,
- 0x4e, 0x1c, 0x25, 0x62, 0x1f, 0x01, 0xcd, 0x76, 0x57, 0xe5, 0x4d, 0x83,
- 0x58, 0x92, 0x63, 0x52, 0x59, 0x95, 0x03, 0xcd, 0xb9, 0x28, 0x66, 0x7e,
- 0x6e, 0xd3, 0x99, 0x30, 0x6b, 0x6a, 0xc4, 0xbe, 0xd2, 0x3e, 0x0d, 0x24,
- 0xda, 0xa1, 0x26, 0x0c, 0xbd, 0xf7, 0x2f, 0x0f, 0x66, 0xc4, 0x3d, 0xb4,
- 0x76, 0x4e, 0xef, 0x8a, 0xa5, 0xb9, 0x3c, 0x3a, 0xd5, 0xbf, 0x03, 0xce,
- 0x9c, 0xe5, 0xf3, 0xbc, 0x19, 0x40, 0x72, 0xbc, 0x34, 0x42, 0x22, 0x0b,
- 0x72, 0x9d, 0x47, 0xad, 0x04, 0x19, 0x21, 0x1e, 0x56, 0xe0, 0x23, 0xde,
- 0x6b, 0x17, 0xa5, 0x74, 0xb9, 0x22, 0x83, 0x18, 0xe7, 0x19, 0xf8, 0x6f,
- 0x1c, 0xbc, 0x1e, 0xa7, 0x16, 0x34, 0x0e, 0x9a, 0xa3, 0xaa, 0x48, 0x22,
- 0x9e, 0x0e, 0xf2, 0x8e, 0x09, 0x46, 0x85, 0x0b, 0xbc, 0x06, 0x56, 0x99,
- 0xe9, 0xbe, 0x72, 0xdd, 0xc8, 0x26, 0xd8, 0x9c, 0xb2, 0xab, 0x06, 0x4b,
- 0x62, 0xbb, 0x8a, 0x62, 0x41, 0xec, 0xf8, 0xc4, 0x2f, 0xe8, 0x44, 0x07,
- 0xfa, 0xdc, 0xd8, 0x34, 0x71, 0x97, 0x4f, 0xa9, 0x3c, 0xdb, 0x65, 0x69,
- 0xd5, 0xd7, 0x5a, 0x92, 0x3a, 0xc8, 0x6d, 0x96, 0x87, 0x58, 0xc5, 0xf1,
- 0x0a, 0x97, 0x02, 0x2f, 0x18, 0x26, 0x35, 0xe1, 0xfc, 0x66, 0x72, 0x1d,
- 0x60, 0x1d, 0xe0, 0x66, 0xdb, 0xe1, 0xfb, 0xd8, 0x66, 0xf6, 0x19, 0x1b,
- 0x77, 0x79, 0x45, 0x14, 0x55, 0x81, 0x4e, 0xad, 0x90, 0xc2, 0xa1, 0x9e,
- 0x10, 0xd0, 0xc1, 0x7d, 0x64, 0xf2, 0x95, 0x6f, 0x37, 0x95, 0xdb, 0x78,
- 0x59, 0x48, 0x2d, 0x65, 0xc6, 0x01, 0x91, 0x6a, 0x9c, 0x7c, 0xcc, 0x67,
- 0x65, 0xd4, 0xc9, 0x67, 0x2e, 0x82, 0xcd, 0xf9, 0x26, 0xaa, 0xb9, 0xbf,
- 0xdd, 0x54, 0xd7, 0x0d, 0xe5, 0xbb, 0x5c, 0xa7, 0xf2, 0x7b, 0xce, 0x75,
- 0xdb, 0xbc, 0xe6, 0xcf, 0x7c, 0xed, 0x1e, 0xea, 0x34, 0x47, 0x7e, 0x44,
- 0xf6, 0x1b, 0x6a, 0xc0, 0xb9, 0x3e, 0x48, 0xf6, 0x77, 0x77, 0xbf, 0xed,
- 0x27, 0x4f, 0xb8, 0x5c, 0xdd, 0xde, 0xd7, 0xab, 0x6a, 0xa8, 0x42, 0x41,
- 0xb6, 0x75, 0x73, 0xff, 0x42, 0x7a, 0x31, 0x26, 0x8c, 0xf7, 0xa5, 0x45,
- 0xef, 0x71, 0xc8, 0xc1, 0x0f, 0x2a, 0x77, 0x2f, 0x30, 0x5a, 0x2a, 0xae,
- 0xd4, 0x0e, 0x92, 0x2e, 0x28, 0x70, 0xf0, 0xb7, 0x50, 0x38, 0x71, 0x21,
- 0xf9, 0x4c, 0xb4, 0x5d, 0xb9, 0x65, 0x28, 0x9b, 0x33, 0x7a, 0xc0, 0x58,
- 0x71, 0xa1, 0x9b, 0x8a, 0x82, 0x9a, 0xd0, 0x62, 0x2d, 0x93, 0xa2, 0xd7,
- 0x29, 0xc2, 0x22, 0x4f, 0x90, 0xb2, 0x43, 0xe8, 0x9c, 0xdf, 0xef, 0x4a,
- 0x9c, 0x21, 0x82, 0x9d, 0xd7, 0xcd, 0x80, 0x6c, 0xcd, 0x98, 0x57, 0xfa,
- 0xfc, 0xec, 0xfc, 0xc9, 0xb6, 0xcf, 0x69, 0x22, 0x49, 0x2d, 0x4c, 0x3c,
- 0x0a, 0xbf, 0xb5, 0x4d, 0x78, 0xe9, 0xab, 0xb8, 0x61, 0x68, 0x65, 0xac,
- 0xf6, 0x18, 0x27, 0xfc, 0x93, 0x70, 0xc1, 0x17, 0xe1, 0x84, 0x74, 0x89,
- 0xd4, 0x1e, 0x17, 0xa7, 0x3b, 0x98, 0xca, 0x6e, 0xb1, 0x11, 0x66, 0x05,
- 0xd6, 0x0c, 0xba, 0x42, 0x4a, 0xdd, 0x00, 0x80, 0xcd, 0x36, 0x2b, 0x19,
- 0x81, 0xfb, 0x82, 0x5e, 0x26, 0xed, 0x44, 0x26, 0x9f, 0x28, 0x91, 0x91,
- 0x91, 0xee, 0x49, 0xb8, 0x48, 0x15, 0xc0, 0x8a, 0xe4, 0x50, 0x17, 0x31,
- 0x22, 0xff, 0x0d, 0xed, 0x5a, 0xf2, 0x27, 0xa5, 0xcd, 0x70, 0x15, 0x6e,
- 0xda, 0xd1, 0x27, 0xb5, 0xd4, 0x66, 0x61, 0xdc, 0x4b, 0x93, 0x77, 0xa7,
- 0xa3, 0x4b, 0xdf, 0xad, 0x0d, 0xef, 0x65, 0x00, 0xf7, 0x69, 0xe7, 0xe5,
- 0x7b, 0xc1, 0xd1, 0xd3, 0x93, 0x48, 0x41, 0x79, 0x42, 0xe2, 0x1d, 0x10,
- 0xe5, 0x34, 0xd9, 0x69, 0x7e, 0x82, 0x53, 0xc2, 0x1c, 0xf5, 0x0c, 0xc6,
- 0x61, 0x7f, 0x3d, 0xc7, 0xb0, 0xf2, 0xca, 0x4f, 0xe6, 0xe9, 0x36, 0x67,
- 0xba, 0xf8, 0x67, 0x86, 0xf2, 0x08, 0x0c, 0x48, 0xbd, 0xd6, 0xf5, 0x72,
- 0x3c, 0xf0, 0x88, 0x30, 0x58, 0xdf, 0x01, 0xa9, 0x9d, 0xd9, 0xbd, 0xe6,
- 0x86, 0xfa, 0x18, 0x1a, 0x02, 0x5b, 0xbc, 0xa1, 0x30, 0x3f, 0x42, 0x60,
- 0xd2, 0x72, 0xbe, 0x4d, 0x12, 0xb2, 0x20, 0x85, 0x4f, 0x96, 0x9e, 0x7d,
- 0xf4, 0xa6, 0xa2, 0xa9, 0xe8, 0xcc, 0xa4, 0xb0, 0x8a, 0xb6, 0x71, 0x7d,
- 0x14, 0x48, 0xf8, 0x25, 0x91, 0x13, 0x6f, 0x0b, 0xba, 0x4d, 0x57, 0x1b,
- 0xcb, 0x1b, 0x3e, 0x01, 0xdb, 0x6d, 0x02, 0x37, 0x05, 0x64, 0xb4, 0x04,
- 0x5f, 0xc8, 0xa7, 0x4c, 0x63, 0x52, 0xb7, 0x79, 0x4c, 0x38, 0x55, 0x85,
- 0x84, 0x0e, 0x62, 0x15, 0x28, 0x8c, 0xbb, 0x6a, 0x25, 0xd9, 0x71, 0xd2,
- 0x02, 0x70, 0x0c, 0x7e, 0x60, 0x54, 0x10, 0x5c, 0xf7, 0xfd, 0x55, 0x09,
- 0xf6, 0xe1, 0x36, 0x52, 0x7a, 0xbd, 0xf7, 0xc6, 0xb4, 0xb5, 0xb3, 0x25,
- 0xb3, 0xd3, 0x4f, 0x04, 0x87, 0x84, 0xb1, 0x6a, 0x45, 0x70, 0x68, 0x23,
- 0xb4, 0x26, 0x81, 0x1b, 0x7a, 0x59, 0xe4, 0x7f, 0x43, 0xac, 0x18, 0xba,
- 0xeb, 0x55, 0x0e, 0x38, 0x4d, 0xca, 0x58, 0x16, 0xdc, 0x64, 0x66, 0x54,
- 0x94, 0xfb, 0x2c, 0x8c, 0xb0, 0xf4, 0xa0, 0x83, 0x49, 0x86, 0x31, 0x9b,
- 0x55, 0xa8, 0x75, 0x3f, 0xe7, 0x6d, 0xaf, 0xcd, 0x4f, 0x03, 0xfe, 0x2c,
- 0xc9, 0x26, 0x37, 0x57, 0xd2, 0x0e, 0x12, 0x25, 0x63, 0xd5, 0x78, 0x52,
- 0x0f, 0x23, 0x20, 0xf9, 0x91, 0x0a, 0x65, 0xad, 0x24, 0x27, 0x73, 0xeb,
- 0xcd, 0xc5, 0xd9, 0xdb, 0xc1, 0xe5, 0xd9, 0x36, 0xf2, 0x3a, 0xd1, 0x32,
- 0x67, 0x53, 0x74, 0xe1, 0x64, 0x52, 0x34, 0xc7, 0x2b, 0x1d, 0xd1, 0x86,
- 0x58, 0x6c, 0xd5, 0xdb, 0x43, 0x9f, 0x9d, 0x6b, 0xe1, 0x97, 0xda, 0x09,
- 0x78, 0xb2, 0x0a, 0xd6, 0x45, 0x52, 0xf0, 0xf3, 0x92, 0x87, 0x68, 0xe2,
- 0xf9, 0xd6, 0xf1, 0xbe, 0xca, 0xee, 0xf1, 0xb2, 0xbe, 0x27, 0xe2, 0x0f,
- 0x06, 0xdd, 0x90, 0x57, 0xaf, 0xce, 0x9a, 0xb0, 0x50, 0x05, 0x3b, 0x31,
- 0x28, 0xf9, 0x55, 0x53, 0x4d, 0x89, 0x9f, 0x82, 0xc1, 0xcf, 0x4d, 0x69,
- 0x0e, 0x70, 0x5a, 0x55, 0xe5, 0x9d, 0x5e, 0x5d, 0x82, 0xd8, 0xb7, 0xc5,
- 0xfe, 0x56, 0xe6, 0xe5, 0x49, 0xc6, 0xb9, 0xb2, 0xd7, 0xaf, 0x55, 0x00,
- 0x9f, 0xb5, 0x73, 0xa5, 0x14, 0x22, 0x35, 0x68, 0x2a, 0x63, 0x2e, 0x65,
- 0xd3, 0xb8, 0x77, 0xf0, 0x94, 0x04, 0x65, 0x1b, 0x53, 0xa5, 0xb5, 0x1a,
- 0x29, 0x75, 0x12, 0xf5, 0x26, 0xd4, 0x7b, 0x24, 0x25, 0x7d, 0x11, 0xe7,
- 0xf8, 0x53, 0x70, 0x86, 0x85, 0x2b, 0x8b, 0x74, 0xfa, 0xd9, 0xcc, 0xa1,
- 0xaa, 0x84, 0x72, 0x85, 0xaa, 0xe4, 0xd0, 0xde, 0x56, 0xe0, 0x13, 0xb2,
- 0xe1, 0x99, 0x85, 0x3a, 0xbd, 0x0f, 0x8d, 0x2f, 0xcd, 0x6f, 0xcd, 0x29,
- 0xb3, 0x68, 0xba, 0x9c, 0x60, 0x99, 0x28, 0x0a, 0x41, 0x2c, 0xb3, 0x63,
- 0x26, 0xde, 0xd1, 0xe4, 0x1c, 0x6a, 0xda, 0xe1, 0xc9, 0xd8, 0xce, 0xee,
- 0xea, 0x59, 0x09, 0x3f, 0xe6, 0xd8, 0x28, 0x49, 0x9d, 0x24, 0x78, 0x42,
- 0xc6, 0xaa, 0x65, 0x15, 0x70, 0x4e, 0x17, 0x57, 0xa5, 0xf2, 0x76, 0x87,
- 0x02, 0x6b, 0x96, 0x92, 0x03, 0xfe, 0x53, 0xa3, 0x60, 0x04, 0xa2, 0x26,
- 0xa1, 0x0d, 0x8c, 0x40, 0xe0, 0x57, 0x5c, 0xd8, 0xb7, 0xd5, 0xde, 0xf6,
- 0xfa, 0x02, 0xc3, 0x0c, 0x3f, 0xf4, 0x56, 0xaf, 0xb5, 0x20, 0xf1, 0x95,
- 0x6b, 0xd7, 0x5c, 0xe5, 0x70, 0xb1, 0x37, 0xe3, 0x72, 0xae, 0xc1, 0x9c,
- 0x01, 0x38, 0x17, 0x29, 0x8d, 0x04, 0x10, 0x9b, 0xc6, 0xd0, 0xe7, 0x4a,
- 0x83, 0xda, 0x24, 0xfa, 0xd1, 0x64, 0x8b, 0xbc, 0x80, 0x13, 0x1f, 0xaf,
- 0x7b, 0x2a, 0xbf, 0x52, 0x78, 0x20, 0x84, 0x69, 0x57, 0x71, 0x7f, 0xf2,
- 0xc3, 0x0f, 0x49, 0x8b, 0xa3, 0x7b, 0x7b, 0x55, 0x12, 0x93, 0x20, 0x37,
- 0xa7, 0x52, 0xd1, 0x49, 0x3a, 0x1c, 0xa0, 0xcf, 0x75, 0xdb, 0x19, 0xa5,
- 0x20, 0x01, 0xd0, 0x8d, 0xfd, 0x42, 0x52, 0x12, 0xc3, 0x18, 0x81, 0x37,
- 0x0a, 0x49, 0x6e, 0x85, 0x95, 0x91, 0xde, 0x74, 0x12, 0x41, 0x5e, 0x40,
- 0xe4, 0x6a, 0x34, 0x98, 0x5d, 0xdf, 0x80, 0x6d, 0xf9, 0xd3, 0x55, 0xb7,
- 0x00, 0x8e, 0x37, 0xe4, 0x05, 0xe6, 0xfb, 0x60, 0x3d, 0x51, 0xb9, 0xe5,
- 0x3e, 0x11, 0x40, 0x18, 0x6e, 0x7c, 0xae, 0x0d, 0x45, 0xc8, 0x1e, 0xaf,
- 0x90, 0xba, 0xe8, 0x16, 0x41, 0x64, 0x8b, 0x92, 0x2d, 0xf9, 0xf0, 0x00,
- 0x84, 0x9d, 0x7a, 0xe7, 0xc5, 0x11, 0x66, 0x74, 0x56, 0x4c, 0x90, 0x8a,
- 0x91, 0xca, 0x28, 0xa8, 0xca, 0xce, 0x4c, 0xbc, 0xc8, 0xfc, 0x2f, 0x39,
- 0x76, 0x26, 0x74, 0xd6, 0x7c, 0xe3, 0xfc, 0xc9, 0x96, 0xd9, 0xf6, 0x63,
- 0x4c, 0xb4, 0x0b, 0x62, 0xd5, 0x78, 0x54, 0x98, 0xd0, 0xba, 0x10, 0x39,
- 0x13, 0xe5, 0x20, 0x2b, 0xf3, 0x25, 0xf9, 0xf4, 0x34, 0x6e, 0xc7, 0x0a,
- 0xb5, 0x57, 0x9a, 0x22, 0x64, 0x0a, 0x73, 0x47, 0x96, 0x70, 0x05, 0xf0,
- 0x4e, 0x75, 0x4a, 0x5b, 0x0d, 0x8c, 0x59, 0x3a, 0xc0, 0x63, 0xf5, 0xaa,
- 0x10, 0xb8, 0x57, 0x26, 0x85, 0x9b, 0xa8, 0xfd, 0x39, 0x53, 0xef, 0xb6,
- 0xcd, 0x56, 0x13, 0x38, 0x36, 0x1f, 0x60, 0x4a, 0x94, 0xea, 0x1e, 0x2d,
- 0x3f, 0xc0, 0x83, 0xbc, 0x30, 0xf3, 0xef, 0xf3, 0xf7, 0x97, 0xdb, 0xae,
- 0xe4, 0xb4, 0x6c, 0x57, 0x1f, 0xca, 0x29, 0x59, 0x1e, 0x61, 0x55, 0x02,
- 0xce, 0xc5, 0x12, 0x39, 0x25, 0x70, 0x2e, 0x2d, 0xc6, 0x63, 0x8e, 0xe3,
- 0x93, 0xdd, 0x3d, 0x63, 0x49, 0xed, 0xee, 0x83, 0xf2, 0xfc, 0xc9, 0xee,
- 0x93, 0xa1, 0x9e, 0x69, 0x7d, 0x2a, 0xb8, 0x16, 0xa6, 0xfc, 0x22, 0x9c,
- 0x26, 0xd8, 0xf7, 0x4f, 0x3e, 0x7d, 0xc2, 0x8f, 0xfb, 0xdd, 0xac, 0x6d,
- 0xa5, 0xda, 0xb3, 0x64, 0x62, 0x21, 0x7a, 0x4c, 0x3b, 0xee, 0x66, 0x1c,
- 0xe1, 0x97, 0x65, 0xc1, 0x89, 0x32, 0x20, 0x95, 0xa7, 0x7c, 0xaf, 0xe1,
- 0x6a, 0x16, 0x54, 0x8f, 0x17, 0x56, 0x32, 0xdb, 0x7d, 0x1e, 0x54, 0xb3,
- 0x5d, 0xfc, 0x5c, 0x41, 0xc9, 0x1e, 0x0b, 0x84, 0x33, 0x3d, 0x23, 0x99,
- 0xb6, 0x66, 0x16, 0x3e, 0xb9, 0x39, 0xb2, 0x64, 0xb2, 0x32, 0x10, 0x73,
- 0xd5, 0x89, 0x40, 0xb2, 0x88, 0xd3, 0x15, 0x14, 0xc8, 0x07, 0x14, 0xbc,
- 0x36, 0xa7, 0x02, 0x33, 0xac, 0x7f, 0xdd, 0x97, 0x00, 0x36, 0xff, 0xeb,
- 0x49, 0xfb, 0xae, 0xbc, 0xce, 0x8b, 0x81, 0x36, 0xfa, 0x52, 0xfe, 0x12,
- 0xf8, 0x2b, 0x4f, 0xde, 0x1e, 0x9e, 0x27, 0xd0, 0x8f, 0x93, 0xd1, 0x5b,
- 0x10, 0xc6, 0x7b, 0x3e, 0x14, 0xb4, 0x61, 0x3b, 0x26, 0x7a, 0x8a, 0x14,
- 0x12, 0x60, 0x21, 0xbd, 0x56, 0x78, 0xac, 0x64, 0xe0, 0x55, 0x6d, 0x50,
- 0x3e, 0xe0, 0x86, 0xee, 0x73, 0xbc, 0xb8, 0x42, 0x79, 0x56, 0x37, 0x8e,
- 0x86, 0xef, 0xb4, 0x64, 0x23, 0xdd, 0xaf, 0x8a, 0x2c, 0x96, 0x3e, 0x76,
- 0xba, 0x93, 0x1c, 0x36, 0x60, 0x30, 0x87, 0x2f, 0x2c, 0x34, 0x53, 0x69,
- 0x2a, 0xfa, 0x3c, 0x15, 0xa0, 0xfa, 0x7f, 0x4b, 0x8c, 0x9b, 0x02, 0xfe,
- 0x6a, 0xcd, 0x04, 0xbb, 0xac, 0x99, 0xa2, 0x8b, 0x2e, 0x55, 0xb2, 0xdb,
- 0xc2, 0x3b, 0x2d, 0x1d, 0x2b, 0xa4, 0x28, 0xe9, 0x4c, 0xa4, 0x39, 0x89,
- 0x74, 0xb9, 0x92, 0xea, 0x4f, 0x4c, 0x70, 0xfb, 0x4f, 0x3e, 0x7f, 0xda,
- 0xc7, 0xdf, 0x9e, 0xed, 0xbe, 0xe0, 0x15, 0x3d, 0x39, 0xbe, 0x7c, 0xd3,
- 0x75, 0xe8, 0x55, 0x66, 0x43, 0xf1, 0x7f, 0xa9, 0x40, 0xd3, 0x8d, 0x31,
- 0x30, 0x28, 0xc9, 0x75, 0x50, 0xcf, 0x9b, 0xc5, 0x60, 0x77, 0x77, 0xd8,
- 0x7c, 0x6a, 0xfe, 0x89, 0x2c, 0x9c, 0x4f, 0x9e, 0xb6, 0x63, 0x2f, 0xa4,
- 0xd6, 0x0f, 0x68, 0xba, 0x57, 0x93, 0x31, 0xb5, 0xb7, 0x97, 0x2d, 0xf2,
- 0xa9, 0x75, 0x1e, 0xa5, 0x5e, 0x8f, 0x7c, 0xdf, 0xb2, 0x7a, 0xd9, 0xfd,
- 0x10, 0x31, 0xb3, 0x83, 0xbb, 0x4a, 0x31, 0x13, 0xe6, 0xa2, 0xc7, 0xad,
- 0xd4, 0xdc, 0x73, 0xed, 0xb3, 0x54, 0xc8, 0xea, 0x1b, 0x57, 0x55, 0x22,
- 0x9a, 0x60, 0x56, 0x0b, 0xbc, 0xbe, 0xca, 0x28, 0x59, 0x9e, 0x15, 0xbf,
- 0x82, 0xa5, 0xd2, 0xc3, 0x09, 0xff, 0x98, 0x82, 0x6a, 0xb2, 0x90, 0x64,
- 0x0b, 0xfe, 0x37, 0x5d, 0xc6, 0x2d, 0x54, 0xdf, 0xfe, 0xb3, 0xc8, 0xc4,
- 0xe1, 0xca, 0xfe, 0x95, 0x13, 0xe7, 0xd4, 0x23, 0xf6, 0xe1, 0xcd, 0xb9,
- 0x98, 0x8d, 0x78, 0xf7, 0xc3, 0x44, 0xec, 0x5a, 0xc9, 0xc2, 0x7f, 0xf1,
- 0x58, 0x68, 0xb6, 0x87, 0xeb, 0x88, 0x43, 0xdc, 0x5b, 0xbf, 0x72, 0x2c,
- 0x7d, 0x47, 0x5e, 0x4b, 0xf7, 0x07, 0xb5, 0xc7, 0x6e, 0x7c, 0xc5, 0xbf,
- 0x74, 0x9a, 0xbb, 0xc8, 0x16, 0x19, 0x06, 0xef, 0x25, 0xe3, 0xfa, 0x9b,
- 0xdb, 0xda, 0xa9, 0x8d, 0x57, 0x64, 0xcc, 0x5c, 0xa3, 0xf9, 0x82, 0xd8,
- 0xb4, 0xea, 0xa8, 0xaf, 0xa5, 0x55, 0x40, 0x04, 0x93, 0xa9, 0x6e, 0xd9,
- 0xbe, 0xd6, 0xf1, 0xe4, 0xd7, 0x75, 0x8e, 0xad, 0xbc, 0x4a, 0xc3, 0xe4,
- 0x31, 0x32, 0xd9, 0xd1, 0x86, 0x5d, 0xac, 0xd2, 0x65, 0xa0, 0x71, 0xe3,
- 0xe5, 0x0a, 0x05, 0xc0, 0xeb, 0x07, 0x7c, 0x4f, 0x76, 0x6f, 0x33, 0x12,
- 0x4b, 0xb7, 0xfc, 0xd6, 0x77, 0x17, 0x6f, 0xfe, 0xa2, 0xf6, 0x37, 0xf4,
- 0xd2, 0xd0, 0x1a, 0xee, 0x74, 0xb8, 0x55, 0x88, 0x4a, 0x92, 0x25, 0x5b,
- 0xf3, 0xee, 0xfe, 0x11, 0x01, 0xb3, 0x32, 0x1f, 0x55, 0xb2, 0x45, 0xd5,
- 0x20, 0xcc, 0x63, 0x23, 0x31, 0xea, 0x9e, 0x0c, 0x9f, 0xc1, 0x27, 0xf2,
- 0xe6, 0xe8, 0xd9, 0x93, 0xfd, 0x3d, 0x63, 0xb7, 0x6e, 0x75, 0xa4, 0xc5,
- 0xf6, 0xc6, 0xa3, 0x66, 0xdb, 0xae, 0x77, 0xf6, 0x69, 0x41, 0x7b, 0x6f,
- 0xeb, 0xf8, 0x87, 0xf3, 0x77, 0xed, 0xf1, 0xf1, 0x88, 0x82, 0x44, 0xc2,
- 0x55, 0x23, 0x74, 0xba, 0x40, 0xab, 0x7d, 0x45, 0x45, 0x52, 0x9a, 0x5e,
- 0x12, 0xa6, 0x88, 0xf6, 0xde, 0x54, 0x39, 0x69, 0xb9, 0x3d, 0x9a, 0x90,
- 0xde, 0x69, 0x59, 0x4c, 0xcd, 0xd5, 0x7f, 0x46, 0xe4, 0x0a, 0x19, 0x61,
- 0x40, 0x1e, 0x1c, 0xdd, 0xea, 0x63, 0xf2, 0xb6, 0x8f, 0xa3, 0x52, 0x84,
- 0x50, 0x84, 0xb7, 0xf8, 0x21, 0x68, 0xad, 0x28, 0x09, 0x98, 0x93, 0x2b,
- 0x96, 0xd7, 0x19, 0xbb, 0x78, 0x9b, 0x56, 0xd1, 0x2b, 0xd6, 0x24, 0xe1,
- 0x7a, 0x23, 0xaf, 0xcf, 0x4b, 0x38, 0xb5, 0x57, 0xc5, 0x43, 0x58, 0x5a,
- 0x6a, 0x44, 0x84, 0xfd, 0x44, 0x5b, 0xea, 0xda, 0xdf, 0xf6, 0x28, 0xdd,
- 0x41, 0xbb, 0xc2, 0xf1, 0x0e, 0xd2, 0xdc, 0x22, 0x32, 0x17, 0x8f, 0x39,
- 0xcb, 0x22, 0x6f, 0x03, 0x75, 0x71, 0x12, 0x91, 0x34, 0xd9, 0x6f, 0xb3,
- 0x4e, 0xc4, 0xfc, 0xe0, 0x88, 0xf5, 0xa2, 0x6e, 0x50, 0x5a, 0x4c, 0x5b,
- 0xe9, 0x26, 0x28, 0xf4, 0x04, 0xfb, 0x07, 0xd5, 0x06, 0xa1, 0x24, 0x3e,
- 0x7f, 0x12, 0x3a, 0xb5, 0xce, 0x2e, 0x8f, 0x0f, 0x24, 0x80, 0xe1, 0x92,
- 0xa3, 0x55, 0x23, 0x66, 0xb0, 0x0c, 0x61, 0xab, 0x0b, 0xc9, 0x12, 0xf0,
- 0x46, 0xd7, 0x8f, 0xec, 0x6c, 0x00, 0x34, 0x69, 0x37, 0xb0, 0x43, 0xb3,
- 0x59, 0x49, 0xe1, 0x83, 0xb4, 0x2f, 0x51, 0x81, 0x79, 0xda, 0x62, 0xe5,
- 0x80, 0x30, 0x6c, 0x18, 0x4a, 0xe0, 0x6a, 0xe2, 0x9b, 0x25, 0x98, 0x2c,
- 0x16, 0xda, 0xb0, 0x2d, 0x34, 0xf1, 0xab, 0x2c, 0x26, 0x59, 0x15, 0x20,
- 0x41, 0x10, 0x8c, 0x22, 0x1f, 0x2c, 0x4d, 0x16, 0x14, 0xef, 0xd5, 0xc5,
- 0xfb, 0x7c, 0xab, 0xc7, 0xc6, 0xcc, 0xba, 0x7b, 0x47, 0xac, 0x10, 0x72,
- 0x77, 0xad, 0xaa, 0x1d, 0x94, 0x35, 0x6e, 0xd3, 0x68, 0xa0, 0x86, 0x7c,
- 0x5a, 0x6a, 0x8d, 0x90, 0xf5, 0x64, 0x55, 0x71, 0x50, 0xc9, 0x21, 0xe7,
- 0x2d, 0x2a, 0x57, 0xe1, 0x00, 0xf0, 0x3c, 0x00, 0xaa, 0x8e, 0xf4, 0xfd,
- 0x62, 0x90, 0xc4, 0xd4, 0xd9, 0xae, 0x04, 0x16, 0xa7, 0x8a, 0xf1, 0xf3,
- 0xcd, 0xa0, 0x52, 0xf5, 0x88, 0xda, 0x63, 0x5c, 0x2f, 0xab, 0xe9, 0x72,
- 0x6e, 0xce, 0xa7, 0x8f, 0x01, 0xe6, 0xfa, 0xd9, 0xf3, 0xbc, 0x91, 0x14,
- 0xd8, 0x88, 0x4b, 0xfc, 0xd9, 0x6e, 0xab, 0xb5, 0xa1, 0xd4, 0xdd, 0x76,
- 0xeb, 0x4f, 0xb5, 0x83, 0xf6, 0xac, 0xc7, 0x31, 0x47, 0xba, 0x13, 0x47,
- 0xf3, 0x7e, 0xc7, 0x98, 0xca, 0xbc, 0x2f, 0x2b, 0xc5, 0xe8, 0x2a, 0xfa,
- 0xef, 0x17, 0x81, 0xc4, 0x90, 0xd5, 0x61, 0x28, 0x55, 0x5e, 0x24, 0xab,
- 0x0a, 0xac, 0xd2, 0x07, 0xef, 0x6e, 0xca, 0x99, 0x1f, 0xeb, 0x0d, 0xcc,
- 0x16, 0x32, 0xc8, 0x3d, 0x1e, 0x0e, 0x0f, 0xf1, 0x2f, 0x0b, 0x43, 0xf3,
- 0x0e, 0xd7, 0xd2, 0x98, 0xb2, 0xb9, 0x92, 0xbf, 0x96, 0x63, 0xf1, 0x37,
- 0x50, 0xde, 0xca, 0x75, 0x34, 0xb7, 0x1b, 0xac, 0x34, 0x46, 0x2c, 0x9b,
- 0xad, 0x46, 0x65, 0x06, 0xe9, 0x02, 0xa4, 0xfe, 0x14, 0x59, 0xc3, 0x44,
- 0x72, 0x54, 0x0d, 0x8b, 0x1c, 0xfc, 0xc9, 0x35, 0xb8, 0x3e, 0xa6, 0xec,
- 0x98, 0x18, 0x45, 0x22, 0x2b, 0x46, 0xd2, 0xee, 0x77, 0xf3, 0x77, 0xe3,
- 0xc5, 0x56, 0xfb, 0x96, 0x9c, 0x21, 0x9d, 0x34, 0x4b, 0x99, 0xf5, 0x6e,
- 0xef, 0x4a, 0xf5, 0x08, 0x9a, 0x77, 0x41, 0x56, 0x07, 0x7a, 0x98, 0x89,
- 0xd9, 0x7a, 0xe9, 0xe4, 0x5e, 0xef, 0x45, 0x77, 0x8d, 0x68, 0xbd, 0x5b,
- 0x4b, 0x6d, 0x17, 0x0c, 0xd6, 0x76, 0x82, 0x62, 0x7b, 0x79, 0xbd, 0x82,
- 0x5a, 0xf6, 0xf7, 0x82, 0xd0, 0x76, 0xab, 0xbc, 0xfa, 0xa7, 0x3d, 0x6b,
- 0x52, 0x9a, 0xe3, 0x07, 0xd2, 0x32, 0x1b, 0x9f, 0xd2, 0x8d, 0x83, 0x60,
- 0xa0, 0xfe, 0x24, 0x80, 0x3b, 0x42, 0xbe, 0x22, 0xac, 0x40, 0xd2, 0x11,
- 0xde, 0x98, 0x6f, 0xe5, 0x2b, 0xca, 0x88, 0xbc, 0x05, 0x89, 0x65, 0x73,
- 0x08, 0xd8, 0xa8, 0x7a, 0x9a, 0x6c, 0xc1, 0xd0, 0xf9, 0xfc, 0xd9, 0xd3,
- 0x6d, 0xae, 0x80, 0xad, 0xd0, 0xa8, 0xed, 0x08, 0x3e, 0x15, 0xa7, 0x4d,
- 0x18, 0x20, 0x71, 0x81, 0xe7, 0x5c, 0x8b, 0x15, 0x9c, 0xad, 0x53, 0x2d,
- 0x27, 0x01, 0xdc, 0xb8, 0xb9, 0xda, 0x41, 0x95, 0x9f, 0x33, 0x95, 0x62,
- 0x10, 0x2d, 0x07, 0x0e, 0x4b, 0x4a, 0xb9, 0x6e, 0x41, 0xca, 0x7b, 0xc5,
- 0x70, 0x12, 0x07, 0xcd, 0x67, 0x06, 0x42, 0xe8, 0x23, 0x4a, 0x42, 0xb8,
- 0x4d, 0x90, 0xc0, 0x18, 0x84, 0x01, 0x33, 0xcf, 0x55, 0xec, 0xf8, 0xae,
- 0xa6, 0x1a, 0x17, 0xa5, 0x77, 0x2f, 0x48, 0x66, 0x30, 0x5b, 0xfa, 0x72,
- 0xf3, 0x24, 0x31, 0x32, 0x2d, 0xa3, 0x97, 0x22, 0x26, 0x8d, 0xbb, 0xcc,
- 0x4e, 0x24, 0xda, 0x60, 0x76, 0x16, 0xda, 0x2a, 0xda, 0x82, 0xe0, 0x81,
- 0x64, 0x5d, 0xa0, 0x65, 0x04, 0xe5, 0xd0, 0xe6, 0x4a, 0x65, 0xcd, 0x97,
- 0x6c, 0x59, 0xb9, 0x2a, 0x4e, 0x1c, 0x90, 0xe0, 0xfb, 0x12, 0x10, 0xc6,
- 0x55, 0xa9, 0xd8, 0x6a, 0xf0, 0xa7, 0x9a, 0x32, 0xda, 0xea, 0xd8, 0x4a,
- 0x7c, 0xb9, 0xee, 0x36, 0x4d, 0xce, 0xee, 0xc2, 0xca, 0xf5, 0xef, 0x76,
- 0x57, 0x86, 0x19, 0x25, 0xfc, 0xd5, 0xce, 0x3c, 0xac, 0xe8, 0x3d, 0xd7,
- 0x36, 0x02, 0x93, 0x0a, 0x1c, 0x06, 0x83, 0x90, 0x11, 0x22, 0xd9, 0x42,
- 0x87, 0x77, 0x76, 0xb6, 0x1f, 0xee, 0xb4, 0x3c, 0xf9, 0x50, 0x27, 0xcf,
- 0xd9, 0x84, 0x67, 0xd6, 0x4b, 0x4b, 0x4f, 0xe2, 0x7a, 0x41, 0x5f, 0xcd,
- 0x01, 0xd5, 0xa5, 0x1d, 0xc4, 0x48, 0xc7, 0x4a, 0x74, 0x13, 0xca, 0x11,
- 0x0c, 0xef, 0x20, 0x1e, 0x33, 0x0f, 0xaf, 0x3d, 0x72, 0x31, 0xef, 0x98,
- 0xde, 0x45, 0x04, 0x08, 0x70, 0x40, 0x5c, 0xf1, 0xee, 0x70, 0x16, 0x14,
- 0xe7, 0xf4, 0x7a, 0x85, 0x03, 0xe1, 0x8d, 0x8f, 0x0d, 0xba, 0x96, 0x57,
- 0x99, 0x8e, 0x46, 0xcb, 0xf5, 0x1c, 0x81, 0x6b, 0xcb, 0xa3, 0x2a, 0x8c,
- 0x38, 0x17, 0x6d, 0x3a, 0x0c, 0x28, 0x9b, 0xf8, 0x41, 0x3a, 0x3e, 0x5e,
- 0x5a, 0x53, 0xcc, 0x74, 0x77, 0xf9, 0x4f, 0xdc, 0xa6, 0x91, 0xa9, 0x1f,
- 0xdd, 0xb8, 0x99, 0x33, 0x89, 0x6b, 0xc3, 0x5e, 0xb5, 0xf8, 0x7c, 0xd2,
- 0x2a, 0xf4, 0x30, 0xa3, 0x6f, 0x76, 0x7f, 0x63, 0xce, 0xb4, 0x14, 0x29,
- 0x7e, 0xda, 0x9a, 0xce, 0x3e, 0x1f, 0x53, 0x64, 0x45, 0xc7, 0xb4, 0x52,
- 0x94, 0x78, 0x08, 0x73, 0x2f, 0xdd, 0x04, 0xba, 0xdc, 0x53, 0x2f, 0xb9,
- 0xf4, 0x01, 0xd0, 0x59, 0x50, 0x5b, 0x94, 0xbd, 0x4a, 0xda, 0x68, 0xdb,
- 0xaa, 0xee, 0x94, 0xe4, 0xb6, 0x79, 0xa4, 0x71, 0x25, 0xed, 0x58, 0xaa,
- 0xdd, 0xbd, 0xd3, 0xc7, 0x8c, 0x91, 0x7d, 0xfe, 0xee, 0xf8, 0xeb, 0xb3,
- 0xed, 0x87, 0xbc, 0x71, 0xbe, 0xfc, 0xb7, 0x83, 0x02, 0xfa, 0xac, 0x22,
- 0xe4, 0x1a, 0xf7, 0x1d, 0x5a, 0xf8, 0xd7, 0xa3, 0xd1, 0xe0, 0xf0, 0xfc,
- 0x84, 0xc4, 0x64, 0x32, 0x1a, 0x99, 0xbf, 0xac, 0xe2, 0x8b, 0xd3, 0x02,
- 0x8c, 0x83, 0xef, 0xa0, 0xeb, 0xa9, 0xec, 0x67, 0x3f, 0x4e, 0x96, 0xf1,
- 0x6e, 0x64, 0xf8, 0x19, 0x6a, 0x4f, 0x68, 0x2a, 0x2e, 0x7d, 0xa0, 0x6b,
- 0x40, 0x9d, 0x9f, 0xec, 0xe0, 0x5b, 0x84, 0x0e, 0xc5, 0x80, 0xe2, 0x86,
- 0xf2, 0x32, 0x2c, 0xc6, 0x41, 0x5a, 0x0f, 0xf0, 0x94, 0x10, 0xd0, 0x0a,
- 0x4f, 0x35, 0x26, 0x0e, 0x5d, 0x27, 0x14, 0x9b, 0x92, 0xe0, 0x54, 0x3c,
- 0x1b, 0x80, 0x49, 0x08, 0x08, 0xf0, 0x2d, 0x24, 0x96, 0x5d, 0x37, 0x13,
- 0xcc, 0x11, 0xa6, 0x4b, 0xa1, 0x92, 0x97, 0x23, 0x09, 0x25, 0x76, 0xcd,
- 0xff, 0xcd, 0xc1, 0x32, 0x39, 0xd8, 0x04, 0x1a, 0xa5, 0xa0, 0x0a, 0xb1,
- 0xa1, 0xa9, 0xdd, 0x29, 0xc9, 0x23, 0x9a, 0x14, 0xf6, 0x93, 0xe9, 0x65,
- 0xb0, 0x05, 0xf1, 0xa2, 0xea, 0x3d, 0x55, 0x46, 0x81, 0x10, 0x56, 0x6f,
- 0x18, 0x62, 0x30, 0xfd, 0xa7, 0x10, 0xd9, 0xaf, 0xd1, 0x40, 0xc6, 0x1c,
- 0x24, 0x84, 0xc3, 0xa8, 0x68, 0x66, 0x73, 0xf9, 0x6b, 0x5a, 0xdc, 0xc3,
- 0x31, 0x28, 0x9e, 0x6a, 0xe4, 0x5f, 0xd9, 0x3d, 0xdd, 0xde, 0xe8, 0x4d,
- 0x35, 0x81, 0x49, 0xcb, 0x80, 0x4b, 0x4e, 0xbc, 0x5a, 0xbd, 0x67, 0x09,
- 0x49, 0xec, 0x55, 0x37, 0x2d, 0xfa, 0xda, 0x46, 0xbf, 0x55, 0xdf, 0x94,
- 0x11, 0xae, 0xb2, 0x0b, 0x62, 0xa2, 0x88, 0xeb, 0xc8, 0x6c, 0x19, 0xf3,
- 0xa1, 0x9c, 0x2d, 0x49, 0x70, 0x96, 0x60, 0xf3, 0x98, 0x81, 0x20, 0x6e,
- 0xdb, 0x62, 0x66, 0xd0, 0xb4, 0xd8, 0x7b, 0xd4, 0xee, 0x51, 0x08, 0x4d,
- 0x76, 0xb5, 0x54, 0x86, 0xce, 0xd9, 0xcd, 0x11, 0x33, 0xb1, 0xc4, 0x69,
- 0x62, 0xbd, 0x86, 0x16, 0x00, 0xe1, 0xdc, 0x2a, 0xf3, 0x47, 0x64, 0xfd,
- 0x74, 0x9d, 0x5a, 0xd3, 0xa3, 0x8e, 0x64, 0x92, 0xdc, 0x7e, 0xfd, 0xa6,
- 0x8e, 0xda, 0x18, 0x67, 0xf3, 0x08, 0xb7, 0x89, 0x46, 0xc6, 0xc7, 0x74,
- 0x4c, 0xa8, 0xc8, 0xb6, 0x7c, 0x8b, 0x3f, 0x93, 0x02, 0xb9, 0x62, 0x15,
- 0xe1, 0xc7, 0x92, 0x21, 0xb8, 0xe5, 0x18, 0xae, 0x03, 0x5e, 0xb4, 0xbf,
- 0xd4, 0x69, 0xfa, 0x3b, 0xca, 0xde, 0x5c, 0xb5, 0xc6, 0xac, 0xe2, 0x7b,
- 0x0c, 0x08, 0x52, 0x68, 0x12, 0x6b, 0x3a, 0xc4, 0x43, 0xc1, 0x06, 0xa6,
- 0xb0, 0xb1, 0x1d, 0x95, 0xaa, 0x47, 0xe4, 0x59, 0x4a, 0xb9, 0xf6, 0x07,
- 0x9f, 0x50, 0xef, 0x33, 0x7e, 0xa9, 0xf5, 0xb5, 0x59, 0xe7, 0x76, 0x71,
- 0x86, 0x8f, 0x98, 0x10, 0x37, 0x7e, 0xf7, 0xc3, 0xc0, 0xb2, 0xfb, 0xe8,
- 0x0a, 0xa9, 0xd6, 0x1c, 0x99, 0x72, 0x03, 0x33, 0xdb, 0xf5, 0x83, 0xfc,
- 0xc5, 0x7c, 0xe4, 0xfb, 0xbc, 0x30, 0xba, 0x61, 0xbd, 0xed, 0x2b, 0x4a,
- 0xe1, 0xd9, 0xa5, 0xda, 0xca, 0x37, 0x84, 0xe4, 0x72, 0xb0, 0x34, 0xd2,
- 0x9c, 0x39, 0x34, 0xc1, 0x3c, 0x69, 0xc5, 0x34, 0x71, 0xa1, 0x53, 0x5b,
- 0x85, 0xe5, 0x7e, 0x11, 0x40, 0xfa, 0x25, 0xcb, 0x09, 0xa2, 0xe4, 0x4a,
- 0x12, 0xae, 0x4d, 0x47, 0x88, 0x53, 0x7f, 0x68, 0x23, 0xd9, 0xb8, 0x3a,
- 0x38, 0x01, 0xdd, 0x39, 0x77, 0xb8, 0x38, 0x6b, 0xa4, 0x77, 0x41, 0xb0,
- 0x86, 0x66, 0x17, 0x63, 0xdc, 0x7a, 0x66, 0x46, 0xd6, 0x2c, 0xb6, 0xf6,
- 0xb6, 0x99, 0x16, 0x5b, 0x8a, 0xbb, 0x95, 0xee, 0xba, 0x0f, 0x1d, 0x39,
- 0x84, 0xa4, 0x4b, 0x70, 0x44, 0x35, 0x80, 0x08, 0xfa, 0x33, 0x54, 0x51,
- 0x41, 0x5e, 0xd1, 0x15, 0x1f, 0x62, 0x56, 0x16, 0x04, 0x98, 0x07, 0xd4,
- 0x6e, 0xc4, 0x81, 0x0a, 0x80, 0xcb, 0x82, 0xb8, 0xbe, 0x6a, 0xae, 0x1a,
- 0xbe, 0xe5, 0x4a, 0xf6, 0x08, 0x63, 0x79, 0x96, 0x73, 0xcc, 0xbe, 0xac,
- 0x66, 0xd3, 0x01, 0x09, 0x90, 0xeb, 0xaa, 0x34, 0x57, 0x64, 0x15, 0x61,
- 0x44, 0x12, 0x93, 0x02, 0xaa, 0x7e, 0x56, 0xdc, 0xe6, 0x55, 0x59, 0x80,
- 0x75, 0xea, 0x36, 0xad, 0x72, 0xc4, 0xb4, 0x7b, 0xdf, 0x9c, 0xbd, 0x3d,
- 0xee, 0xf9, 0x6e, 0x91, 0xab, 0x5c, 0x5c, 0xc6, 0xb4, 0x7e, 0x5d, 0x7f,
- 0xac, 0xae, 0x66, 0x18, 0xae, 0x49, 0xcc, 0x9d, 0x6e, 0x94, 0x1c, 0x5a,
- 0xd6, 0x5b, 0x39, 0x49, 0xa4, 0xd6, 0x6b, 0x30, 0xd8, 0xe8, 0x92, 0x14,
- 0xef, 0x96, 0xcb, 0xb9, 0x01, 0xa1, 0xb8, 0xdb, 0x60, 0x21, 0xe0, 0x04,
- 0x7e, 0x04, 0x6b, 0x20, 0x82, 0xa8, 0xb7, 0xf4, 0x6b, 0x11, 0x24, 0x5e,
- 0xbd, 0x02, 0xd2, 0xf4, 0x79, 0x03, 0xac, 0x2a, 0x47, 0xb7, 0x39, 0xbf,
- 0x27, 0xc3, 0x66, 0xb3, 0xb5, 0xeb, 0x92, 0xcd, 0x9a, 0x8c, 0xf1, 0x66,
- 0x53, 0xa7, 0x17, 0xe0, 0xc8, 0x35, 0x45, 0x35, 0x57, 0x7d, 0x9a, 0x77,
- 0x35, 0x7f, 0xc2, 0xb5, 0xce, 0x8d, 0xbb, 0xd3, 0x77, 0xc0, 0xa7, 0xef,
- 0x53, 0xd7, 0xba, 0x0b, 0xf9, 0x27, 0x52, 0x97, 0xb4, 0xd2, 0xae, 0x2c,
- 0xd5, 0x0e, 0x9c, 0x13, 0x0b, 0x66, 0xe8, 0x58, 0x34, 0x9f, 0x2f, 0x27,
- 0xc2, 0x04, 0xe2, 0x62, 0x88, 0x92, 0x17, 0x27, 0xe9, 0xe4, 0x7c, 0x4b,
- 0xf1, 0x52, 0x14, 0xde, 0xfd, 0x4c, 0x4d, 0xae, 0xa0, 0xa0, 0xea, 0x33,
- 0xcf, 0x98, 0xf2, 0xf0, 0xe4, 0x46, 0x39, 0x20, 0x0a, 0x68, 0x07, 0x24,
- 0x94, 0x4f, 0xf5, 0x95, 0x1a, 0x98, 0xd7, 0xbd, 0x1f, 0x16, 0xba, 0x87,
- 0x6e, 0xe2, 0xd0, 0x17, 0x76, 0xc9, 0x98, 0x9a, 0x8d, 0xc9, 0xbd, 0x2c,
- 0x6b, 0x8b, 0x12, 0x9c, 0x85, 0x4a, 0xf2, 0x41, 0x3f, 0x91, 0xf9, 0x74,
- 0x51, 0x7b, 0x50, 0x69, 0x11, 0x1a, 0x85, 0x2d, 0x1b, 0x7b, 0x73, 0x15,
- 0x53, 0xbe, 0x18, 0x89, 0x26, 0x55, 0xd8, 0x17, 0x63, 0x26, 0xb6, 0x1e,
- 0x49, 0x33, 0x38, 0x76, 0xed, 0x50, 0x4a, 0xfb, 0x2d, 0x72, 0xf1, 0x84,
- 0x26, 0x9c, 0x19, 0x13, 0xec, 0x9a, 0xac, 0x84, 0x06, 0xb0, 0x5a, 0xe5,
- 0x77, 0x31, 0x97, 0x7a, 0xb6, 0x90, 0x36, 0x5f, 0x4b, 0x3f, 0xa4, 0x7f,
- 0x6a, 0xf0, 0x58, 0x1a, 0x82, 0x00, 0x97, 0x5e, 0xd6, 0xa0, 0x53, 0x6b,
- 0xaa, 0x74, 0xe2, 0xfe, 0x32, 0x48, 0xeb, 0x49, 0x9e, 0x2b, 0xf1, 0x34,
- 0x85, 0xc3, 0x32, 0x42, 0x80, 0x46, 0x49, 0x2a, 0x74, 0x39, 0x2c, 0xdd,
- 0xeb, 0xb4, 0x64, 0x27, 0x2f, 0x43, 0x2c, 0x52, 0xae, 0x49, 0x40, 0x80,
- 0x0d, 0x14, 0x98, 0xb5, 0xd5, 0x18, 0x62, 0x5c, 0xdc, 0x9a, 0x5c, 0xb2,
- 0xc2, 0xbe, 0x35, 0x26, 0xf8, 0x9e, 0x6f, 0x83, 0xeb, 0x14, 0x0c, 0xa6,
- 0xa8, 0xe9, 0x8c, 0x5b, 0xd4, 0x3c, 0xb3, 0x3f, 0x5c, 0x53, 0x24, 0xd4,
- 0x0f, 0x78, 0x3c, 0xef, 0x58, 0x28, 0x4c, 0xb9, 0x12, 0xb3, 0x4f, 0x28,
- 0xe5, 0x4e, 0xab, 0x74, 0xf0, 0x12, 0x1c, 0x9e, 0x9e, 0xbf, 0x4b, 0x40,
- 0x75, 0x03, 0x56, 0xcd, 0xa2, 0x66, 0xaa, 0x7e, 0xfc, 0xd8, 0x16, 0xef,
- 0x8e, 0x94, 0x01, 0xb5, 0x95, 0x7b, 0xae, 0x22, 0x16, 0x96, 0xd6, 0xdd,
- 0x26, 0xa6, 0x07, 0xb5, 0x5f, 0x44, 0xfb, 0x53, 0x1b, 0xa3, 0x3b, 0x1c,
- 0xf3, 0x3d, 0xef, 0xb3, 0x90, 0xb4, 0xe3, 0x7b, 0x97, 0x7c, 0xc3, 0x6f,
- 0x77, 0xb9, 0x82, 0x08, 0x11, 0x02, 0xd5, 0x35, 0x10, 0xea, 0x4d, 0x66,
- 0xf9, 0x84, 0xc4, 0xb8, 0xb3, 0xfc, 0x58, 0x4a, 0xb5, 0xcd, 0x98, 0x04,
- 0x64, 0xdb, 0x6b, 0xea, 0x6e, 0xfd, 0x00, 0x93, 0x4d, 0xb1, 0x28, 0x82,
- 0x3c, 0x6b, 0x3b, 0xdf, 0x51, 0x53, 0x34, 0x40, 0xd6, 0xae, 0x4f, 0x86,
- 0xd2, 0xce, 0x12, 0xc7, 0xf7, 0x9a, 0x25, 0x7e, 0xd7, 0xe7, 0xcf, 0x8e,
- 0x97, 0x24, 0x23, 0x3a, 0xdf, 0x90, 0xf5, 0x65, 0xdd, 0x89, 0x9f, 0x90,
- 0xa2, 0xeb, 0xc0, 0xa9, 0x83, 0xcc, 0x84, 0x58, 0x96, 0xb2, 0x74, 0x6e,
- 0x94, 0x83, 0x42, 0xd1, 0xf1, 0xe4, 0xfe, 0x25, 0x08, 0x63, 0x77, 0x2a,
- 0x97, 0xa9, 0x48, 0x2d, 0xa7, 0x34, 0x74, 0x10, 0xf3, 0xfc, 0x0d, 0x60,
- 0x66, 0xb8, 0x71, 0x69, 0x3d, 0x9a, 0x08, 0xd5, 0x12, 0x23, 0x1a, 0xc1,
- 0xd1, 0x3a, 0x25, 0xcc, 0x28, 0xc9, 0x8d, 0xd8, 0x8a, 0x65, 0x66, 0x02,
- 0x26, 0x37, 0xcb, 0xe2, 0xa3, 0xe9, 0x42, 0x98, 0xa8, 0xa9, 0xf8, 0xd6,
- 0x1c, 0x45, 0x25, 0x53, 0xe6, 0x42, 0x05, 0xb9, 0x9f, 0xbe, 0x4e, 0x4c,
- 0x96, 0xb7, 0x70, 0xe6, 0x09, 0xb7, 0x63, 0xcb, 0x06, 0x8b, 0xf5, 0x6e,
- 0x6a, 0xcb, 0xd8, 0xa4, 0x8d, 0x9b, 0xc0, 0x28, 0x86, 0xdb, 0xad, 0xb4,
- 0xd4, 0x13, 0x64, 0xcb, 0xe4, 0x1a, 0x97, 0x8b, 0xe8, 0x9c, 0xd0, 0xe5,
- 0x94, 0xc9, 0x85, 0x9c, 0x34, 0x62, 0x89, 0x04, 0x02, 0x71, 0x59, 0x73,
- 0x5d, 0x70, 0x59, 0x56, 0xda, 0x0f, 0x3e, 0x4d, 0x76, 0xa4, 0x27, 0xed,
- 0xac, 0xe1, 0x75, 0xfb, 0x40, 0xbc, 0xb6, 0x2e, 0xc3, 0x58, 0x70, 0x17,
- 0xb5, 0x83, 0x3f, 0x52, 0x29, 0x9b, 0x56, 0x0d, 0x8d, 0x88, 0xe4, 0x72,
- 0xf9, 0x4b, 0x59, 0x61, 0x1b, 0x9f, 0xd3, 0x49, 0x15, 0x79, 0xf0, 0x4f,
- 0x9c, 0x25, 0x37, 0x16, 0x6f, 0xa2, 0xec, 0x0f, 0x3b, 0x93, 0x54, 0xac,
- 0x94, 0x87, 0x7e, 0xd1, 0xa2, 0x77, 0x46, 0xfa, 0x90, 0x28, 0xf4, 0x24,
- 0xe1, 0xbb, 0xae, 0x1c, 0xd4, 0x91, 0x76, 0xdd, 0x5e, 0x84, 0x2d, 0x7f,
- 0x94, 0x20, 0x6c, 0x4b, 0xb2, 0x77, 0x24, 0xf7, 0xcc, 0x7f, 0xba, 0xcd,
- 0x3d, 0x5a, 0x06, 0x42, 0x49, 0xb1, 0x06, 0xbc, 0x32, 0xb6, 0xad, 0xf0,
- 0x70, 0xfd, 0x7a, 0x21, 0x68, 0xf9, 0x26, 0xac, 0xb4, 0x8b, 0xc9, 0xc1,
- 0xa2, 0x25, 0x06, 0x15, 0x0a, 0xf3, 0xfb, 0x08, 0x41, 0xfa, 0x9e, 0x74,
- 0x39, 0x9f, 0x46, 0xb3, 0xcb, 0x75, 0x69, 0xa5, 0x86, 0x8d, 0x9c, 0x01,
- 0x5a, 0x0b, 0xa5, 0xb5, 0x38, 0x79, 0x6d, 0xf6, 0x18, 0xa9, 0xac, 0xe4,
- 0xb9, 0xfd, 0xea, 0x3e, 0x59, 0xb1, 0xb8, 0x20, 0x9f, 0xb0, 0xf1, 0x5d,
- 0xd8, 0xf9, 0x54, 0x18, 0xd4, 0x27, 0xd8, 0x21, 0xc6, 0xad, 0xa1, 0x97,
- 0x1c, 0xc0, 0x19, 0x70, 0x42, 0x4e, 0x1e, 0xf7, 0x4b, 0x90, 0x4a, 0x89,
- 0x14, 0xd3, 0x9b, 0x25, 0x17, 0x69, 0x97, 0x9a, 0x59, 0xb6, 0x3e, 0x71,
- 0x95, 0x21, 0x19, 0x92, 0x3a, 0xec, 0xf5, 0x38, 0x60, 0x8c, 0x62, 0x5f,
- 0x76, 0x9d, 0x99, 0x83, 0xc8, 0xe9, 0x31, 0xe3, 0xaa, 0xfc, 0x98, 0xf1,
- 0xa6, 0x83, 0x89, 0x41, 0x47, 0x2a, 0x55, 0x45, 0x8a, 0x43, 0x8f, 0xf9,
- 0x6c, 0x6a, 0x61, 0x7a, 0x11, 0x7d, 0x96, 0xca, 0x69, 0x48, 0x3a, 0xb9,
- 0x93, 0x86, 0xb9, 0xcb, 0xe6, 0x56, 0x8a, 0x5f, 0x5e, 0xae, 0x09, 0x31,
- 0x2e, 0x0d, 0x57, 0x97, 0x31, 0x6f, 0xbc, 0x02, 0xa2, 0xb1, 0x63, 0xdf,
- 0x3a, 0xf7, 0x16, 0xfb, 0xb9, 0xfa, 0xe4, 0xdb, 0x55, 0xf7, 0x4f, 0x7e,
- 0x64, 0x49, 0x1f, 0x5f, 0x25, 0xc3, 0xec, 0x25, 0x78, 0xc2, 0x92, 0x97,
- 0x66, 0x53, 0xb1, 0x4f, 0x8c, 0x82, 0x5a, 0x5d, 0x77, 0x17, 0xaa, 0xbd,
- 0x0c, 0xd4, 0xf4, 0x98, 0xda, 0xb4, 0xab, 0x2b, 0x49, 0x46, 0x60, 0x30,
- 0xff, 0xd4, 0x55, 0x60, 0x12, 0x76, 0x5d, 0xe4, 0xd2, 0x9b, 0x0d, 0x13,
- 0x1e, 0x72, 0xe7, 0xc7, 0x61, 0x0b, 0x14, 0x4a, 0x38, 0xad, 0x0e, 0x28,
- 0x45, 0xf2, 0xda, 0x61, 0xb2, 0xfe, 0x8d, 0x80, 0xaf, 0x46, 0xa9, 0x6d,
- 0x08, 0xf9, 0xc4, 0x5f, 0x0a, 0xd4, 0x4e, 0xae, 0x7b, 0x60, 0x93, 0x23,
- 0x38, 0xb7, 0xd9, 0xf2, 0x65, 0x50, 0xfd, 0x2b, 0xff, 0x4e, 0x60, 0xe2,
- 0xdf, 0xe4, 0x98, 0xac, 0x96, 0x88, 0x45, 0xa8, 0xf4, 0x00, 0x18, 0x63,
- 0x2e, 0x8c, 0xa1, 0x0c, 0x51, 0x12, 0xf3, 0x3a, 0x55, 0xf4, 0x91, 0x92,
- 0xcc, 0x59, 0xce, 0xaa, 0xc8, 0xa9, 0xa7, 0x1e, 0x09, 0xc6, 0x47, 0xab,
- 0xb3, 0xe8, 0x8f, 0x6c, 0xc9, 0x83, 0x96, 0x1e, 0x0e, 0x0b, 0x85, 0x0d,
- 0xd7, 0x08, 0x17, 0x2e, 0x7a, 0x93, 0xb8, 0x87, 0xfa, 0xde, 0xdf, 0x0f,
- 0x3e, 0x27, 0xc6, 0x4d, 0xc8, 0x27, 0x8a, 0x76, 0xf9, 0xcf, 0xa0, 0x8a,
- 0x67, 0x44, 0x8f, 0xa0, 0xe7, 0xcc, 0x4f, 0xed, 0xa3, 0xa1, 0x0c, 0x04,
- 0x7d, 0x1d, 0x91, 0x56, 0x3f, 0xa1, 0xa0, 0x77, 0x9b, 0x45, 0xc5, 0xb9,
- 0x95, 0x9a, 0x15, 0x5e, 0x84, 0x3a, 0x06, 0x70, 0x9c, 0x7a, 0x57, 0x8f,
- 0x2c, 0x06, 0xc3, 0xb3, 0x2b, 0x2a, 0xa1, 0x08, 0x6e, 0xaa, 0x88, 0x3f,
- 0x82, 0x5e, 0x8b, 0x38, 0x31, 0x18, 0xb3, 0x25, 0xdb, 0xcd, 0x96, 0xac,
- 0x40, 0x81, 0x04, 0xde, 0xda, 0x58, 0x47, 0x73, 0x60, 0x7a, 0xe0, 0x37,
- 0xb7, 0xf5, 0x58, 0xf3, 0xb5, 0x89, 0x59, 0x7b, 0x2f, 0x86, 0x4f, 0x5b,
- 0xe7, 0xa4, 0x99, 0xcd, 0x07, 0x77, 0xe3, 0x07, 0x62, 0x1f, 0x97, 0xa7,
- 0x6f, 0x93, 0xf9, 0x12, 0x25, 0x21, 0x85, 0x8e, 0xf3, 0x7e, 0x96, 0xa9,
- 0x1b, 0x9a, 0xdc, 0x3b, 0xec, 0x2e, 0xbc, 0x81, 0xd9, 0x19, 0xc2, 0x96,
- 0x23, 0x4e, 0x7e, 0x9b, 0x28, 0x29, 0x56, 0xbf, 0x14, 0x98, 0x49, 0xa8,
- 0x45, 0xb8, 0xb3, 0x29, 0xd1, 0x79, 0x96, 0x47, 0xb3, 0x59, 0x14, 0x4c,
- 0x9a, 0x7d, 0xca, 0x26, 0x4b, 0x04, 0xaa, 0x49, 0x41, 0x24, 0x6a, 0x9b,
- 0xf5, 0x0e, 0x74, 0xcf, 0x69, 0x2e, 0x6e, 0x72, 0xf3, 0x83, 0xee, 0x64,
- 0xb8, 0x4a, 0x0d, 0x32, 0x78, 0x1e, 0x7d, 0xe0, 0x3e, 0x63, 0x58, 0x14,
- 0x7e, 0xd7, 0xfe, 0x55, 0x10, 0x2b, 0x06, 0x84, 0x9d, 0x2e, 0x44, 0xb3,
- 0x9f, 0xf2, 0xeb, 0x82, 0x95, 0x80, 0xb7, 0xf9, 0xa4, 0x2a, 0xeb, 0xf2,
- 0x8a, 0xc1, 0x59, 0x9e, 0x76, 0x70, 0x72, 0x32, 0x4a, 0xee, 0xb2, 0xb1,
- 0x66, 0x82, 0x0e, 0x43, 0x67, 0x32, 0x4b, 0x11, 0x0a, 0x90, 0x54, 0x79,
- 0xd6, 0xd0, 0xac, 0x69, 0x48, 0x94, 0xe8, 0x6b, 0x50, 0x8c, 0x75, 0x90,
- 0x15, 0xd7, 0xc6, 0x5c, 0x85, 0x12, 0x4f, 0x65, 0x48, 0x66, 0xb8, 0x9a,
- 0x16, 0x59, 0x19, 0x09, 0x8c, 0x73, 0x07, 0xf4, 0x5a, 0xe1, 0x7d, 0x82,
- 0x3b, 0x7c, 0x9c, 0x4a, 0x41, 0x0d, 0xf6, 0x0f, 0x18, 0xb1, 0x43, 0x6a,
- 0x8a, 0x38, 0x2e, 0x3f, 0x92, 0xcb, 0x2c, 0x48, 0xd0, 0xb0, 0x45, 0xde,
- 0x5b, 0x55, 0x11, 0x50, 0x90, 0x64, 0x5a, 0x56, 0x40, 0x23, 0x79, 0x64,
- 0xf7, 0x54, 0xa5, 0x64, 0x59, 0x91, 0xcf, 0x18, 0x3c, 0x82, 0xa1, 0x3c,
- 0xbd, 0xbb, 0x29, 0xb9, 0x34, 0x08, 0xa6, 0x99, 0xae, 0x26, 0xa4, 0x96,
- 0x72, 0x36, 0x8b, 0x70, 0x29, 0x4b, 0x8d, 0x3e, 0xbd, 0x6f, 0xfc, 0x85,
- 0x8a, 0x65, 0xa3, 0xe8, 0x7a, 0xb8, 0x4c, 0x4a, 0x71, 0xcf, 0xbc, 0xce,
- 0xaf, 0x57, 0x54, 0xe2, 0x61, 0xd7, 0x91, 0x16, 0x37, 0x65, 0xc5, 0x91,
- 0x7b, 0x24, 0x97, 0x66, 0xc5, 0xa7, 0x34, 0xa8, 0x30, 0x15, 0x29, 0x73,
- 0xcd, 0xf7, 0x5d, 0x6c, 0xf7, 0xfd, 0x22, 0x04, 0xcb, 0x2f, 0xab, 0xfc,
- 0xb3, 0x56, 0xfd, 0xf3, 0xfa, 0x62, 0x8f, 0x40, 0x34, 0x06, 0xeb, 0xb4,
- 0xbc, 0x80, 0x77, 0xe1, 0x21, 0x9d, 0x2f, 0xee, 0xb1, 0xd7, 0x90, 0x56,
- 0x04, 0x98, 0xe2, 0x45, 0x65, 0xa7, 0xb6, 0x0c, 0x25, 0xad, 0x4f, 0x3b,
- 0xe6, 0xe5, 0x9f, 0xdd, 0x92, 0x7e, 0xb0, 0x3f, 0x18, 0x67, 0x29, 0xb1,
- 0xef, 0xbf, 0x6c, 0x48, 0x63, 0x5a, 0x97, 0x8d, 0x11, 0x49, 0xc7, 0xf8,
- 0x8a, 0xdf, 0xbd, 0x84, 0xb2, 0x45, 0x6b, 0x7b, 0x76, 0xf8, 0xfe, 0xf2,
- 0x9b, 0x64, 0x7f, 0xb8, 0xfb, 0xa8, 0x6c, 0x0c, 0x48, 0x84, 0x56, 0x1b,
- 0xba, 0x7a, 0x74, 0xa2, 0xca, 0xe2, 0xaf, 0xcb, 0xa2, 0xcd, 0xec, 0x1d,
- 0xf3, 0xd2, 0x8b, 0x02, 0xa5, 0xf7, 0x2f, 0xc5, 0x25, 0xba, 0x78, 0x62,
- 0xbf, 0xfc, 0xc3, 0x60, 0x00, 0x2b, 0xae, 0x7a, 0x28, 0xa0, 0x59, 0x47,
- 0x69, 0x29, 0x5a, 0x9d, 0x15, 0xd2, 0x1c, 0x89, 0x9d, 0x32, 0xc7, 0x3e,
- 0xf9, 0xf9, 0xf9, 0x50, 0xd9, 0x42, 0x42, 0x50, 0x64, 0x2f, 0xde, 0x1c,
- 0x75, 0x9a, 0x7b, 0xfe, 0xd9, 0xb3, 0xdd, 0xdf, 0x11, 0xab, 0x57, 0x92,
- 0x83, 0x44, 0x1c, 0x09, 0x51, 0xb6, 0x98, 0xef, 0x2b, 0x4a, 0xd6, 0x54,
- 0x57, 0x43, 0x29, 0x0f, 0xf9, 0xe9, 0xe4, 0x75, 0x33, 0x25, 0xdc, 0x96,
- 0x65, 0x9b, 0xa8, 0x54, 0xdd, 0xff, 0xcf, 0xff, 0x0a, 0x93, 0x49, 0x7f,
- 0xfc, 0x19, 0x71, 0x01, 0x94, 0x3b, 0xb2, 0xc8, 0x76, 0x95, 0x32, 0xb5,
- 0xbb, 0x8f, 0xe9, 0x3c, 0x6f, 0xfe, 0x61, 0x33, 0xb1, 0xf5, 0x08, 0x12,
- 0xa4, 0x20, 0xa5, 0xd1, 0x54, 0x64, 0x47, 0x41, 0x2b, 0xbd, 0xd3, 0x65,
- 0xad, 0xa4, 0xc0, 0xac, 0x55, 0x09, 0x74, 0x16, 0x84, 0xa7, 0x7f, 0xba,
- 0xaa, 0xa8, 0x88, 0x52, 0xeb, 0x0b, 0x4d, 0xbd, 0x3a, 0xcc, 0xc9, 0x4d,
- 0xce, 0x20, 0x2b, 0x8c, 0x80, 0x94, 0x51, 0x24, 0xed, 0xe6, 0xc5, 0x0a,
- 0x07, 0xa6, 0x40, 0x89, 0xfe, 0xd3, 0xac, 0x40, 0xbf, 0xb9, 0x2b, 0xff,
- 0xab, 0xed, 0xcc, 0x34, 0x2a, 0x06, 0xf5, 0xf7, 0xc3, 0x1f, 0xf6, 0x28,
- 0x0b, 0xa6, 0xd7, 0x6d, 0x82, 0x11, 0xed, 0x76, 0x55, 0xad, 0x86, 0xb4,
- 0x8e, 0x26, 0x53, 0x3f, 0x48, 0x29, 0xb6, 0x7d, 0x52, 0x1b, 0xff, 0x0b,
- 0xd5, 0x98, 0x7f, 0xdc, 0x1b, 0x3c, 0xfb, 0xd9, 0x7e, 0xf4, 0x0f, 0x7b,
- 0x1f, 0xfe, 0xb0, 0xdf, 0x8b, 0x25, 0x39, 0xb9, 0x94, 0x77, 0x0f, 0xaa,
- 0x48, 0x1a, 0x6d, 0x71, 0x2f, 0x99, 0x09, 0x12, 0x6a, 0x74, 0x65, 0x90,
- 0x50, 0xe4, 0x2b, 0xc2, 0x0b, 0x44, 0xae, 0xab, 0x21, 0x7b, 0x8c, 0x9d,
- 0xaa, 0xaa, 0xa5, 0x90, 0x54, 0x38, 0xdc, 0x95, 0xfc, 0xbe, 0x12, 0x03,
- 0xd0, 0x09, 0x11, 0xcc, 0x7c, 0x20, 0x0c, 0x8b, 0xac, 0xbd, 0x3d, 0x88,
- 0x25, 0x44, 0xa9, 0x25, 0xc2, 0xd9, 0x10, 0x80, 0x94, 0xb9, 0xd0, 0xd2,
- 0xa4, 0x33, 0xe9, 0xe3, 0xb1, 0xfd, 0x49, 0x91, 0x05, 0xc9, 0x47, 0x9a,
- 0xa8, 0xc8, 0xe6, 0x9b, 0x8a, 0x83, 0xb2, 0x15, 0x01, 0xe0, 0x0b, 0x82,
- 0x47, 0xae, 0x41, 0xb8, 0x04, 0x47, 0x3a, 0xc0, 0x20, 0xfd, 0x95, 0xf0,
- 0x1c, 0x3e, 0xe2, 0x86, 0xaf, 0x15, 0xd3, 0x60, 0xee, 0x0a, 0xb3, 0xf2,
- 0xcf, 0x24, 0x08, 0x43, 0x89, 0xed, 0xa8, 0xc3, 0x13, 0x4b, 0x4b, 0x4d,
- 0xc7, 0x54, 0xa5, 0xa8, 0x55, 0xf1, 0x01, 0x25, 0x9b, 0xe9, 0xd2, 0x19,
- 0x3b, 0x96, 0xa5, 0xb4, 0x5e, 0x31, 0x21, 0xfe, 0x54, 0x78, 0x93, 0x20,
- 0x13, 0x85, 0xc9, 0x59, 0x5f, 0xa0, 0x65, 0x40, 0x28, 0xd2, 0x26, 0x1b,
- 0x78, 0x99, 0xa0, 0xc8, 0x3c, 0xc5, 0x4f, 0x35, 0x69, 0x6c, 0xc2, 0xd5,
- 0x1f, 0x10, 0xe0, 0x1b, 0x04, 0x51, 0x49, 0xba, 0xa2, 0xa6, 0xf7, 0x46,
- 0x1a, 0x32, 0xe9, 0xe4, 0xd0, 0xe2, 0xfd, 0xd5, 0x47, 0x20, 0xd2, 0xc6,
- 0x6c, 0xb5, 0xcd, 0xc1, 0x66, 0xb2, 0x65, 0x2d, 0xbb, 0x69, 0x5a, 0xdf,
- 0x6c, 0xc7, 0x1c, 0x91, 0xce, 0xf7, 0xe7, 0x04, 0xd5, 0x58, 0x5c, 0x0f,
- 0x74, 0x67, 0xb2, 0x84, 0x5a, 0x77, 0x5d, 0x9f, 0x21, 0xbe, 0xc2, 0x78,
- 0xc1, 0x81, 0x07, 0x72, 0x69, 0xfd, 0x6c, 0x00, 0xf7, 0x06, 0x7e, 0x9e,
- 0x0c, 0xfe, 0x23, 0xbc, 0x17, 0xe4, 0x51, 0x86, 0x7c, 0x0d, 0x38, 0xf1,
- 0xc7, 0x5d, 0xa4, 0x14, 0xcd, 0x4b, 0x5e, 0x2e, 0x6e, 0x2a, 0xa3, 0xfe,
- 0x85, 0xf9, 0x45, 0xa3, 0x6f, 0x12, 0xb8, 0x62, 0xa8, 0xb8, 0x06, 0x3f,
- 0x63, 0x77, 0x87, 0x47, 0xd6, 0xf7, 0x3b, 0x72, 0xc3, 0x11, 0x9a, 0x64,
- 0x90, 0xd6, 0x83, 0x40, 0xd5, 0xb9, 0x74, 0x89, 0xa5, 0xec, 0x42, 0x2b,
- 0xd9, 0x20, 0x21, 0x24, 0x23, 0xc5, 0xd6, 0x8a, 0x09, 0x4a, 0x08, 0x26,
- 0x3b, 0xc3, 0xe1, 0x0e, 0xc9, 0xac, 0x1d, 0xf3, 0x87, 0x98, 0x33, 0xc0,
- 0xdd, 0x76, 0x4b, 0x9a, 0x98, 0x5d, 0x4e, 0xdf, 0x22, 0x1f, 0x90, 0x54,
- 0x00, 0x73, 0x0e, 0xf3, 0xfa, 0x6f, 0x4b, 0x60, 0x51, 0x2b, 0xa3, 0x4e,
- 0x56, 0x9c, 0xbb, 0x3a, 0xef, 0x5c, 0x92, 0x41, 0x21, 0x11, 0x76, 0xae,
- 0xd7, 0xc2, 0x94, 0xd0, 0xdc, 0x74, 0xd2, 0xaa, 0x18, 0x4c, 0x0e, 0x8c,
- 0x70, 0xde, 0x28, 0x43, 0x15, 0x32, 0x87, 0xd3, 0xb5, 0x06, 0xdd, 0xd3,
- 0xfd, 0xb6, 0xe3, 0x63, 0x91, 0x17, 0xc6, 0xc4, 0x30, 0xca, 0x31, 0xd8,
- 0x07, 0x09, 0x8b, 0x17, 0xe6, 0xad, 0x08, 0x57, 0x63, 0x50, 0x52, 0xc2,
- 0xd6, 0x6d, 0xf6, 0x4b, 0x84, 0xba, 0x9a, 0x25, 0x1c, 0xcd, 0xdf, 0x0a,
- 0x2e, 0x4b, 0xfe, 0xc8, 0x36, 0x35, 0xe1, 0xa1, 0x75, 0x17, 0x99, 0x25,
- 0xbe, 0x17, 0xa2, 0x93, 0x94, 0xa1, 0x40, 0x5c, 0x10, 0x9d, 0x41, 0xcc,
- 0x31, 0xb7, 0x87, 0x75, 0x3a, 0xd8, 0x03, 0xe5, 0x75, 0xc1, 0x8c, 0x99,
- 0x08, 0x1c, 0xcd, 0xcc, 0xbf, 0x3e, 0xbe, 0x10, 0x0d, 0x05, 0xc9, 0xd0,
- 0xae, 0xe8, 0x5d, 0x58, 0xdb, 0x99, 0x2c, 0x99, 0xe7, 0x4f, 0x6d, 0x55,
- 0xc4, 0xfa, 0x26, 0xdd, 0x7f, 0xf6, 0x5c, 0xba, 0xad, 0x4c, 0x51, 0x30,
- 0x94, 0x36, 0xf9, 0x57, 0x3b, 0x3b, 0x1c, 0x36, 0x27, 0xeb, 0x34, 0x90,
- 0x0b, 0xa9, 0xd4, 0x76, 0xdc, 0xfc, 0xf3, 0x66, 0x3c, 0xb3, 0x4c, 0x55,
- 0x57, 0x2d, 0xbd, 0x86, 0x58, 0x1c, 0x38, 0x18, 0x7d, 0x9a, 0xf4, 0x7e,
- 0xab, 0x7c, 0x37, 0xf2, 0x58, 0xd2, 0x35, 0xec, 0xe1, 0xc2, 0xac, 0x20,
- 0x15, 0x56, 0x12, 0xcd, 0xbf, 0x1c, 0x26, 0x87, 0xfe, 0xec, 0x00, 0x80,
- 0x86, 0x82, 0x7f, 0x93, 0x90, 0xbe, 0x43, 0xe1, 0x6f, 0xb4, 0x20, 0x5e,
- 0xcb, 0x02, 0x02, 0x25, 0x6a, 0x5e, 0xe2, 0xb4, 0xa3, 0x9d, 0xa7, 0x81,
- 0x17, 0xf6, 0xc9, 0x60, 0x31, 0x97, 0xe3, 0x20, 0x4d, 0x44, 0xbe, 0xa9,
- 0x00, 0x29, 0x36, 0xe9, 0x3d, 0x98, 0xa0, 0x3b, 0x2e, 0xe6, 0x36, 0xa8,
- 0x38, 0x00, 0xe4, 0x4d, 0xc0, 0x7a, 0xda, 0x59, 0x62, 0x7b, 0x31, 0xeb,
- 0x92, 0x33, 0xe9, 0x90, 0x59, 0x5b, 0x8a, 0xfd, 0x04, 0xe7, 0xc0, 0x6c,
- 0x85, 0x1d, 0xda, 0x07, 0x62, 0x6d, 0x04, 0x74, 0xe6, 0xe4, 0x64, 0x7e,
- 0x31, 0xdc, 0x3d, 0x48, 0xce, 0x16, 0x59, 0x61, 0xe6, 0xbf, 0x9f, 0x7c,
- 0x5d, 0x2c, 0x69, 0x3d, 0x68, 0xd0, 0x5f, 0x8f, 0xbe, 0x0d, 0xf8, 0x0f,
- 0xe8, 0x8d, 0xa7, 0x4f, 0xe8, 0x8d, 0x77, 0x23, 0x7e, 0xea, 0xae, 0x9c,
- 0x5d, 0x51, 0x95, 0xde, 0xa3, 0xfb, 0xd4, 0xfc, 0x11, 0x7b, 0xfc, 0x33,
- 0x7a, 0xdc, 0x6c, 0xbc, 0x69, 0x33, 0xab, 0x63, 0xbf, 0x47, 0x07, 0xce,
- 0xcb, 0x59, 0x5a, 0xc1, 0x53, 0xcd, 0x9b, 0x6f, 0x4d, 0x8f, 0x9f, 0x3e,
- 0x8d, 0xf4, 0xb8, 0xbf, 0xa2, 0x43, 0xc3, 0x7f, 0xbc, 0x47, 0x67, 0xf0,
- 0xfd, 0xd1, 0xdf, 0xc6, 0xe9, 0xe4, 0x23, 0x76, 0x22, 0x50, 0xed, 0x96,
- 0x54, 0xf5, 0xf7, 0x94, 0xe6, 0x9c, 0x71, 0xff, 0x98, 0x32, 0x25, 0x15,
- 0x48, 0xc7, 0x1a, 0x24, 0x72, 0x7f, 0xb6, 0xff, 0x64, 0x6f, 0xe7, 0xf9,
- 0xf0, 0xe9, 0x70, 0xdf, 0xa2, 0xcc, 0xcc, 0xc6, 0xba, 0x25, 0x52, 0x7c,
- 0x8a, 0xe8, 0xaf, 0xaa, 0x29, 0x96, 0x17, 0xa6, 0x1d, 0x8f, 0x5f, 0xa0,
- 0x66, 0xcf, 0x91, 0xc3, 0x97, 0x10, 0x9b, 0xc0, 0x9e, 0x9f, 0xab, 0x34,
- 0x8c, 0xd4, 0x84, 0x22, 0x92, 0x02, 0xea, 0x84, 0x7a, 0x3b, 0xa8, 0x80,
- 0x25, 0x80, 0x9f, 0xe3, 0xdc, 0x58, 0xcd, 0x4d, 0xb9, 0x84, 0x5b, 0x9d,
- 0x7c, 0x38, 0xca, 0x2c, 0x0d, 0x25, 0x09, 0xe3, 0xa0, 0x23, 0x16, 0x71,
- 0x8e, 0x71, 0xe7, 0x81, 0xe5, 0x75, 0x01, 0x29, 0xce, 0x87, 0xca, 0xb9,
- 0x22, 0x2d, 0x57, 0x2f, 0x30, 0xc6, 0x0c, 0x57, 0x9e, 0xfe, 0xc6, 0xd8,
- 0x1a, 0xb7, 0x70, 0x1c, 0x07, 0xb5, 0xb3, 0xa4, 0x78, 0x01, 0xa9, 0xc8,
- 0xd6, 0xf5, 0xaf, 0x48, 0x07, 0x47, 0xfc, 0x2c, 0x3f, 0xe0, 0x0c, 0x0a,
- 0xf6, 0x81, 0x60, 0xdc, 0x83, 0x30, 0xbb, 0xd5, 0x2b, 0x9a, 0xe6, 0x56,
- 0x5c, 0x78, 0x93, 0x29, 0x7f, 0x89, 0x5d, 0xdc, 0x0e, 0x2b, 0xec, 0x67,
- 0xa2, 0xc5, 0x5c, 0x30, 0x0f, 0xf8, 0x23, 0x84, 0x78, 0xa1, 0xcd, 0xbc,
- 0xc0, 0xff, 0xea, 0xd4, 0x71, 0xd3, 0x5b, 0x30, 0xc8, 0x63, 0xea, 0x94,
- 0xba, 0xd2, 0x36, 0x7f, 0xf5, 0x2e, 0x7b, 0xf2, 0xdb, 0xef, 0xb2, 0xfd,
- 0xc7, 0xee, 0x32, 0xb7, 0xc9, 0xe8, 0x9c, 0xad, 0xd9, 0x62, 0x20, 0x9a,
- 0x92, 0x2a, 0xb7, 0xf1, 0x5d, 0xe6, 0x6f, 0x33, 0x98, 0xa9, 0xb1, 0x8d,
- 0xd6, 0xda, 0x67, 0x76, 0x9b, 0xad, 0xd8, 0x65, 0x4c, 0xcf, 0xc4, 0x7b,
- 0x6c, 0xfd, 0x16, 0xd3, 0x3c, 0xe0, 0x64, 0xfd, 0x2e, 0x6b, 0xbb, 0xe1,
- 0xd7, 0xef, 0x33, 0xb7, 0x1d, 0x1e, 0xbd, 0xcb, 0xb4, 0x48, 0x05, 0x4b,
- 0x9d, 0x15, 0x5b, 0xac, 0xb5, 0xc7, 0xd6, 0x54, 0xf3, 0xda, 0x7b, 0x11,
- 0xdb, 0x65, 0x4f, 0x7e, 0xf5, 0x2e, 0x7b, 0xfa, 0xdb, 0xef, 0xb2, 0x27,
- 0xff, 0x4f, 0x96, 0xfd, 0xb7, 0x93, 0x65, 0x7b, 0xbf, 0x4c, 0x96, 0xed,
- 0x77, 0x02, 0x9b, 0x46, 0x5d, 0x65, 0x6f, 0xf3, 0x8f, 0xea, 0xf5, 0x3f,
- 0xd8, 0xd9, 0xf9, 0x19, 0xce, 0x93, 0x03, 0xba, 0xaf, 0x7f, 0x0e, 0x4a,
- 0x33, 0x66, 0x9d, 0x4c, 0xcb, 0xd1, 0xd9, 0xd1, 0xb7, 0x23, 0x71, 0x59,
- 0x8b, 0xd6, 0xa5, 0x5a, 0x19, 0x17, 0x0a, 0x07, 0x1f, 0x02, 0x97, 0x51,
- 0x0a, 0x74, 0x7d, 0x2e, 0xdf, 0x96, 0x0c, 0x3e, 0xf5, 0xad, 0xf3, 0x98,
- 0xc8, 0xb5, 0x0a, 0xc5, 0x39, 0x32, 0xaf, 0x19, 0xe7, 0x17, 0xc3, 0x5b,
- 0x20, 0x4d, 0xaf, 0xa0, 0xaf, 0xf2, 0xfb, 0x22, 0x1e, 0x8d, 0xc2, 0xbd,
- 0xb2, 0xd5, 0xdc, 0x54, 0x48, 0xed, 0xc0, 0x63, 0x9c, 0x2a, 0xe0, 0x17,
- 0x79, 0x5a, 0xd1, 0x3b, 0xe9, 0xd5, 0x37, 0x60, 0x7f, 0x5d, 0x54, 0xd9,
- 0x8a, 0x8a, 0xa8, 0x97, 0x37, 0xde, 0x6f, 0xd5, 0x85, 0x16, 0x63, 0x38,
- 0x10, 0x2e, 0x33, 0x6f, 0xbe, 0xe9, 0xbd, 0x20, 0x1f, 0x3d, 0xff, 0xd4,
- 0xe6, 0xd7, 0x49, 0x67, 0xa8, 0x7b, 0x88, 0xca, 0x06, 0xf2, 0x11, 0xdb,
- 0x46, 0xad, 0x99, 0x3c, 0x54, 0x9e, 0xa0, 0x7e, 0x6a, 0x9a, 0x0c, 0x60,
- 0xa3, 0xf8, 0x45, 0x4a, 0xbf, 0x91, 0x7f, 0x3c, 0xa3, 0x0f, 0x23, 0xd6,
- 0xca, 0xff, 0xbc, 0xc1, 0xbf, 0x19, 0x57, 0xc0, 0x74, 0x49, 0xde, 0x3a,
- 0x4f, 0xa2, 0x13, 0xad, 0x07, 0x93, 0xfd, 0x0e, 0x50, 0xc6, 0x8c, 0x79,
- 0xeb, 0x52, 0xea, 0xfc, 0x31, 0x93, 0x35, 0x8d, 0x04, 0xd1, 0x18, 0x49,
- 0xbc, 0x77, 0xac, 0xd1, 0xf2, 0xd3, 0x15, 0xc9, 0x31, 0x59, 0xe2, 0xb3,
- 0x2a, 0x2a, 0x77, 0x80, 0x5f, 0xbf, 0xc7, 0x05, 0x4b, 0x65, 0x09, 0xfa,
- 0x4c, 0xb1, 0x19, 0x62, 0x7c, 0x89, 0xae, 0x5f, 0x7a, 0xbe, 0xb7, 0xfb,
- 0x79, 0xe8, 0x6d, 0x7e, 0xaf, 0x29, 0x6d, 0x8e, 0x58, 0x10, 0x80, 0x08,
- 0xc0, 0xcb, 0xc7, 0x2e, 0x93, 0x23, 0xf6, 0xd1, 0x48, 0xde, 0x1b, 0x39,
- 0x00, 0x28, 0xe5, 0xb8, 0x14, 0xdb, 0x10, 0x25, 0x91, 0xba, 0xa5, 0xc5,
- 0x39, 0x95, 0xb7, 0x86, 0x94, 0x14, 0x4e, 0x5c, 0x09, 0xeb, 0x07, 0xd2,
- 0x02, 0x55, 0x60, 0x25, 0xd8, 0xf4, 0xa5, 0xa3, 0x2d, 0xfb, 0xe3, 0xd3,
- 0x5d, 0x5a, 0x53, 0x6d, 0x24, 0xe5, 0x12, 0xdb, 0xbc, 0xe7, 0xfe, 0xf8,
- 0x24, 0x1d, 0xfe, 0x13, 0x49, 0x87, 0x9e, 0xb5, 0x5d, 0x09, 0x7f, 0xe8,
- 0xf3, 0x09, 0xbf, 0x26, 0x5e, 0x94, 0xc1, 0x38, 0xad, 0x22, 0x29, 0x14,
- 0x72, 0x13, 0x28, 0xa1, 0x86, 0xd2, 0x51, 0xe8, 0x5b, 0xa0, 0x9d, 0x06,
- 0xb6, 0x96, 0x4b, 0x2a, 0xd9, 0x9f, 0x27, 0x61, 0x73, 0x9d, 0x8a, 0xee,
- 0xea, 0x30, 0xe9, 0x33, 0x11, 0x94, 0xc7, 0x03, 0x95, 0xce, 0xfa, 0x14,
- 0xc5, 0x8b, 0xb0, 0x05, 0xb1, 0xf2, 0xd0, 0xfa, 0x08, 0x31, 0x3a, 0xdd,
- 0x79, 0xae, 0x04, 0xa6, 0x63, 0xbf, 0x82, 0xd3, 0xde, 0xe2, 0x2f, 0xcc,
- 0xef, 0x29, 0x1a, 0x1b, 0xbb, 0xcd, 0xea, 0x49, 0x95, 0x49, 0x70, 0x84,
- 0x48, 0xfd, 0x10, 0x79, 0x25, 0x3a, 0x3c, 0x73, 0x93, 0x5d, 0x67, 0x9a,
- 0x3c, 0x69, 0xc7, 0xad, 0x04, 0x19, 0x60, 0xc5, 0x18, 0x46, 0x40, 0xc9,
- 0x1e, 0xe8, 0xc8, 0xd6, 0xe0, 0x4c, 0x85, 0x44, 0x83, 0x5e, 0x76, 0xa4,
- 0x71, 0x76, 0x3a, 0xd8, 0x53, 0x18, 0x06, 0x47, 0x5b, 0x23, 0x60, 0xd4,
- 0x38, 0xb2, 0x10, 0xf6, 0x76, 0xf7, 0x9f, 0x32, 0xf3, 0x88, 0xfd, 0x58,
- 0xd5, 0x31, 0xba, 0x90, 0xc7, 0xab, 0x47, 0xf8, 0xa5, 0x9e, 0xfe, 0x2f,
- 0x1e, 0x44, 0xe9, 0x5b, 0x39, 0x71, 0x25, 0x0e, 0x17, 0x3a, 0x23, 0xc8,
- 0xda, 0x60, 0x66, 0xe0, 0xc9, 0x4d, 0x36, 0x97, 0x1a, 0x16, 0xbf, 0xb0,
- 0xfc, 0x74, 0xa7, 0x4f, 0x8c, 0x5f, 0xbb, 0x6a, 0x16, 0xc3, 0x79, 0xf9,
- 0x77, 0x33, 0x1b, 0xe9, 0xb0, 0xac, 0xae, 0x83, 0x9d, 0x6b, 0x2e, 0xe9,
- 0x82, 0xa7, 0x8e, 0x42, 0x10, 0x85, 0x35, 0x58, 0x7d, 0x6a, 0x33, 0xe1,
- 0x6f, 0xe6, 0xd4, 0xf4, 0x24, 0x39, 0x32, 0x3d, 0x3e, 0xfe, 0xf0, 0xfe,
- 0xdd, 0xe8, 0xfd, 0x79, 0xf7, 0x80, 0x9e, 0x9f, 0x5d, 0x5c, 0x1e, 0xbf,
- 0xfe, 0x70, 0x7e, 0x71, 0x76, 0x79, 0x76, 0x74, 0x76, 0x9a, 0x6c, 0xed,
- 0x6d, 0xaf, 0xcd, 0xc5, 0xb2, 0xde, 0x12, 0x8f, 0xbf, 0x4e, 0xfb, 0xcf,
- 0xa2, 0xc5, 0xf6, 0x62, 0x8b, 0xc6, 0x13, 0xb6, 0xf6, 0xbd, 0x6c, 0x80,
- 0x76, 0x12, 0x21, 0xbb, 0x4d, 0x70, 0x0b, 0x41, 0xfc, 0xa6, 0xc9, 0xf5,
- 0x92, 0x76, 0xb3, 0x1f, 0x8e, 0x67, 0xfe, 0xc6, 0x40, 0x5b, 0xd2, 0x78,
- 0xa0, 0x97, 0xc6, 0xb3, 0xd6, 0x75, 0xf8, 0xac, 0xab, 0x5a, 0xd0, 0x1a,
- 0x40, 0x63, 0x74, 0xbb, 0xa2, 0x5e, 0xbf, 0x2d, 0x98, 0xf9, 0x03, 0xf4,
- 0xc8, 0xf6, 0x0d, 0x70, 0xc7, 0x4b, 0x84, 0x06, 0xb9, 0xaf, 0xac, 0x82,
- 0x0e, 0xa9, 0x3a, 0x4c, 0xe0, 0x67, 0x97, 0x57, 0x4c, 0x7f, 0x0b, 0xa9,
- 0xad, 0x27, 0x1d, 0x41, 0x84, 0x0e, 0x25, 0x32, 0x38, 0x62, 0x6c, 0x1e,
- 0xa0, 0xdf, 0x7a, 0xc2, 0x0f, 0x39, 0x4c, 0x81, 0x77, 0x9b, 0x5f, 0xbe,
- 0x42, 0x5d, 0xb7, 0x3b, 0xaf, 0x53, 0xd4, 0x1c, 0xe9, 0x4e, 0xe0, 0xa7,
- 0x8b, 0x08, 0xc2, 0x63, 0x0d, 0xfe, 0x70, 0x22, 0x0e, 0x34, 0x41, 0xa8,
- 0x19, 0x4a, 0x08, 0x33, 0xf2, 0x07, 0xf3, 0xc0, 0x46, 0xe6, 0x49, 0x24,
- 0x47, 0x7c, 0x9f, 0xd6, 0xbe, 0xcf, 0x1b, 0x3a, 0x2c, 0xa7, 0xde, 0x6d,
- 0xc5, 0x11, 0xab, 0xf8, 0xee, 0x33, 0x74, 0x88, 0x9c, 0xfa, 0x6e, 0x34,
- 0x5e, 0x57, 0x34, 0x1b, 0xd3, 0x5c, 0x01, 0x61, 0x75, 0x78, 0x8e, 0x70,
- 0x70, 0x96, 0xbc, 0xe4, 0xa9, 0x58, 0x52, 0x5c, 0xe2, 0xd9, 0x30, 0x9a,
- 0xf8, 0x81, 0x60, 0xa1, 0x18, 0x1c, 0xc4, 0x49, 0xf6, 0x20, 0xe8, 0x3b,
- 0x3a, 0x8f, 0x90, 0x3c, 0xb8, 0x94, 0x7b, 0xc8, 0x44, 0x2d, 0x02, 0xba,
- 0x3b, 0xdc, 0x4d, 0x46, 0x6f, 0xbf, 0x12, 0x66, 0xbf, 0xaf, 0x46, 0x4c,
- 0x08, 0xc1, 0x8a, 0xb0, 0xbe, 0x32, 0x8c, 0xd3, 0x27, 0xb1, 0x9f, 0x94,
- 0xd4, 0x0d, 0xea, 0xdd, 0x9f, 0xf0, 0x37, 0x45, 0x23, 0xf3, 0xcf, 0xdd,
- 0xb0, 0xfd, 0x71, 0xf7, 0xa3, 0x89, 0xea, 0x1c, 0x9c, 0xa1, 0x12, 0x98,
- 0x76, 0xd8, 0x5c, 0x19, 0x92, 0x07, 0x3d, 0x5c, 0x4f, 0x24, 0xb5, 0x1f,
- 0x9c, 0x87, 0xdf, 0xec, 0x24, 0xd8, 0xf2, 0xa3, 0x2a, 0x95, 0xbb, 0xd3,
- 0x71, 0xee, 0x46, 0x49, 0x93, 0x97, 0x51, 0x42, 0x0e, 0x9c, 0xcd, 0xb3,
- 0xec, 0x0a, 0x9a, 0x16, 0x12, 0xe5, 0xfa, 0xf8, 0x25, 0x22, 0x6b, 0x16,
- 0x3d, 0x15, 0xa5, 0x5b, 0x42, 0x1b, 0xe9, 0xc4, 0xd7, 0x5c, 0x95, 0x81,
- 0xac, 0x3b, 0x07, 0x7f, 0x42, 0xc1, 0x45, 0xa6, 0x5f, 0xcd, 0x6b, 0x8f,
- 0x61, 0xa1, 0x20, 0x5a, 0xb4, 0x5c, 0x83, 0x67, 0xde, 0x59, 0x9a, 0x51,
- 0xe6, 0xdd, 0x3d, 0x27, 0xed, 0x05, 0x19, 0x06, 0xd0, 0x76, 0xa6, 0xa4,
- 0xbd, 0x3b, 0x98, 0xa8, 0x97, 0x5e, 0x52, 0x18, 0x53, 0x90, 0xe9, 0x42,
- 0x2b, 0x55, 0x5f, 0x42, 0xd9, 0x38, 0x48, 0x92, 0xd7, 0x59, 0x71, 0xaf,
- 0xb2, 0xd1, 0x21, 0x9c, 0x40, 0x96, 0x71, 0xcb, 0x7e, 0x70, 0x76, 0x69,
- 0x33, 0x01, 0x51, 0x0d, 0x4c, 0x84, 0xed, 0x62, 0xd8, 0xa5, 0x76, 0x9f,
- 0x63, 0x12, 0xe0, 0x95, 0x9d, 0x06, 0x49, 0xd7, 0xf6, 0xe7, 0x62, 0x0b,
- 0x9c, 0x0c, 0x1a, 0xfa, 0xc3, 0xf7, 0xb4, 0xc5, 0xb5, 0xd3, 0xb0, 0x0d,
- 0x5e, 0x7c, 0x58, 0x31, 0xc4, 0x92, 0xf8, 0x57, 0x94, 0xe5, 0x25, 0xa5,
- 0x7d, 0x96, 0xc2, 0x2f, 0xc2, 0x53, 0x21, 0xa8, 0x38, 0x23, 0xdf, 0xcc,
- 0x33, 0x1c, 0xae, 0x0a, 0x5d, 0xd3, 0x54, 0xa7, 0x04, 0x61, 0x49, 0xa5,
- 0x90, 0x6e, 0x6f, 0x02, 0x74, 0x6a, 0x5d, 0x2a, 0xd4, 0xc1, 0xc6, 0x0a,
- 0x61, 0x39, 0xb8, 0x22, 0xe9, 0xc4, 0x50, 0xab, 0xce, 0x35, 0xc6, 0xb3,
- 0xc9, 0xf0, 0x3e, 0x0b, 0x36, 0xa5, 0xc7, 0x57, 0xb6, 0xa5, 0x32, 0xaf,
- 0xee, 0xff, 0x89, 0xfe, 0x08, 0x47, 0xd1, 0x0a, 0xce, 0xd0, 0x44, 0xeb,
- 0x61, 0xa7, 0xc7, 0x21, 0x40, 0xf0, 0xfa, 0xaa, 0x0f, 0xbc, 0x72, 0x02,
- 0x75, 0x7d, 0xdb, 0x10, 0x3e, 0x8f, 0xf9, 0xc0, 0xfb, 0x42, 0x59, 0xcc,
- 0x74, 0x7f, 0x2f, 0x2c, 0x83, 0xf8, 0x5d, 0x5a, 0x15, 0x40, 0x93, 0xfb,
- 0x8a, 0x3f, 0x71, 0x5f, 0x2c, 0xa4, 0xbe, 0x40, 0x7a, 0x45, 0x38, 0xdc,
- 0x2a, 0x73, 0x74, 0xa7, 0xb4, 0x8e, 0xcc, 0x70, 0x23, 0x0c, 0xca, 0x0a,
- 0x0b, 0x5d, 0x94, 0x0d, 0x73, 0x39, 0x13, 0x70, 0x97, 0x74, 0x86, 0x8a,
- 0xfc, 0x2b, 0xde, 0x24, 0xab, 0x46, 0x48, 0xad, 0xd9, 0xdd, 0x44, 0x2d,
- 0x2d, 0x17, 0x14, 0x23, 0x14, 0x48, 0x15, 0xc7, 0x5b, 0x3d, 0x31, 0x23,
- 0x9f, 0x63, 0xec, 0x15, 0xfc, 0x42, 0x2e, 0xa4, 0x97, 0xde, 0x96, 0x44,
- 0xe6, 0xef, 0xd0, 0xd7, 0x50, 0x84, 0xdc, 0x2e, 0xb9, 0x8c, 0xd7, 0x23,
- 0x70, 0xa0, 0x17, 0x31, 0x28, 0xc8, 0x0b, 0x04, 0x4c, 0x12, 0xec, 0x7b,
- 0x2f, 0xd5, 0x87, 0xcf, 0xb7, 0x36, 0x07, 0x64, 0x44, 0xca, 0x24, 0x6b,
- 0x66, 0x4f, 0x16, 0x1c, 0xb1, 0x12, 0x6b, 0x4b, 0x65, 0x22, 0xf5, 0x10,
- 0x0c, 0x08, 0x05, 0x29, 0xf9, 0x13, 0x4b, 0x3f, 0xd4, 0x25, 0x6c, 0x6e,
- 0x97, 0x95, 0xb5, 0xb7, 0xaa, 0x45, 0x70, 0x3a, 0x85, 0x71, 0xf8, 0x80,
- 0x18, 0xff, 0x74, 0xaf, 0x90, 0xb1, 0xb5, 0x22, 0x7c, 0x81, 0x74, 0x5e,
- 0x33, 0xd1, 0x79, 0x83, 0x05, 0xeb, 0x60, 0x56, 0x15, 0xca, 0xc9, 0x04,
- 0xd2, 0xe6, 0xf0, 0x2d, 0xbb, 0x47, 0xbe, 0xd0, 0x18, 0x9d, 0xd4, 0xa8,
- 0x6f, 0x5c, 0xed, 0x1f, 0xa8, 0x12, 0xe2, 0x99, 0x60, 0x12, 0x7b, 0x8f,
- 0xd7, 0x9f, 0xa0, 0xc1, 0x14, 0xb5, 0x8b, 0x3b, 0xfb, 0x76, 0x2c, 0x99,
- 0x8b, 0xd9, 0x30, 0xc5, 0x74, 0x60, 0x84, 0xc0, 0x62, 0x8d, 0x7b, 0xf3,
- 0x53, 0x5f, 0x07, 0xdd, 0x02, 0xbb, 0xfa, 0xf4, 0x11, 0xfc, 0x13, 0x86,
- 0xd4, 0xc9, 0xdc, 0x85, 0x60, 0x71, 0xa3, 0x0f, 0x3c, 0x89, 0xcd, 0x64,
- 0x0c, 0xb4, 0xd7, 0x0d, 0x25, 0xdb, 0x9a, 0xf2, 0x31, 0x66, 0x7b, 0x9e,
- 0x41, 0x4c, 0xa0, 0x4e, 0xd8, 0x2a, 0x80, 0x13, 0xcf, 0x9d, 0x4c, 0xdb,
- 0x7b, 0x4e, 0xa6, 0x42, 0x8b, 0xb0, 0x77, 0x0a, 0x81, 0x49, 0x7b, 0x5f,
- 0x62, 0x5f, 0x4d, 0x30, 0x8f, 0xe0, 0x57, 0x12, 0x92, 0x74, 0x79, 0x12,
- 0x7e, 0x4e, 0x5f, 0xda, 0xc5, 0x57, 0x3b, 0xe2, 0xfc, 0x80, 0x9c, 0xc4,
- 0x87, 0xa8, 0x63, 0xf9, 0x5a, 0xe6, 0x82, 0x15, 0x8b, 0x11, 0x23, 0xed,
- 0x98, 0x76, 0x10, 0xa8, 0xfa, 0x73, 0xae, 0x9e, 0x1c, 0x87, 0xbd, 0x8d,
- 0xe4, 0xbc, 0x69, 0x8d, 0x65, 0xc8, 0x69, 0xc5, 0x1c, 0x7a, 0xde, 0x30,
- 0x2e, 0xb5, 0xf3, 0xa9, 0x59, 0x5b, 0x79, 0x56, 0x3f, 0xc7, 0x84, 0x1d,
- 0x82, 0x2b, 0x91, 0x76, 0xdd, 0x3f, 0xfd, 0xdf, 0x7e, 0xea, 0xc7, 0x84,
- 0x34, 0xad, 0xd5, 0x6a, 0xb7, 0x42, 0xfb, 0x33, 0x2f, 0xcd, 0x89, 0x5e,
- 0x37, 0x28, 0x3c, 0xf4, 0x6b, 0x06, 0x15, 0x8c, 0x0a, 0xc3, 0xc0, 0x7c,
- 0x07, 0x6b, 0xc2, 0x9f, 0x59, 0xe3, 0x84, 0x5d, 0x31, 0x04, 0xd3, 0xe2,
- 0x9a, 0x8a, 0x98, 0xde, 0x30, 0xec, 0x83, 0xbf, 0x74, 0x24, 0x0f, 0x4f,
- 0x23, 0xb6, 0x06, 0xfd, 0xf7, 0xc7, 0x03, 0xf8, 0xbd, 0xa6, 0x3f, 0xaf,
- 0xec, 0xc7, 0x71, 0x5f, 0xfa, 0xf2, 0x3b, 0x74, 0x23, 0x5f, 0xdc, 0x90,
- 0x53, 0xe3, 0x65, 0x2c, 0xcb, 0xc6, 0x9b, 0x08, 0x79, 0xec, 0xb7, 0xff,
- 0x7e, 0x35, 0x73, 0xc4, 0x36, 0x6b, 0xbe, 0x2f, 0x8f, 0xfd, 0xe6, 0xdf,
- 0xe7, 0xb3, 0xfb, 0xa0, 0x03, 0x05, 0x82, 0xea, 0xb5, 0x20, 0x99, 0x23,
- 0x32, 0xf1, 0x57, 0x0b, 0x45, 0x41, 0x47, 0x87, 0x52, 0x51, 0x3e, 0x16,
- 0xad, 0x34, 0x20, 0x62, 0x11, 0x52, 0xf1, 0x37, 0x91, 0x60, 0x10, 0xcd,
- 0xe1, 0xe4, 0x48, 0xe9, 0x8f, 0x97, 0xfc, 0xe7, 0xce, 0x97, 0xb1, 0x35,
- 0xd2, 0x8c, 0x13, 0xba, 0x05, 0xb5, 0x56, 0x08, 0x8a, 0x4f, 0x30, 0x4f,
- 0x80, 0x68, 0xbc, 0xb6, 0x70, 0x02, 0x4d, 0x96, 0xad, 0x31, 0x43, 0xaf,
- 0xc6, 0x2a, 0x94, 0xc8, 0x0c, 0x29, 0x60, 0x54, 0x1d, 0xf3, 0x0e, 0x29,
- 0x44, 0x8a, 0x47, 0xe6, 0x7d, 0xb1, 0x5e, 0x55, 0x6e, 0xaa, 0x5b, 0xe8,
- 0xd1, 0xb1, 0x96, 0x7e, 0xd3, 0x97, 0x02, 0x21, 0xa6, 0x35, 0xda, 0x55,
- 0x82, 0x96, 0x14, 0x77, 0xbf, 0x2c, 0x67, 0x48, 0xef, 0x22, 0x45, 0xbc,
- 0x81, 0xe2, 0x07, 0x3a, 0x94, 0x46, 0x78, 0x74, 0xf6, 0xee, 0xdd, 0xf1,
- 0x51, 0x37, 0xa2, 0x67, 0x4b, 0x2a, 0x3a, 0x55, 0x3f, 0xa8, 0x50, 0x87,
- 0xcf, 0x83, 0x79, 0x5c, 0xf2, 0x6a, 0xf8, 0xfb, 0x28, 0x5d, 0xc3, 0xb9,
- 0x32, 0xfa, 0x4b, 0x21, 0x76, 0x67, 0xda, 0x4e, 0xd9, 0x01, 0x91, 0xc4,
- 0xae, 0x60, 0x3f, 0xf8, 0xb5, 0x22, 0x38, 0x2a, 0x40, 0x05, 0x0c, 0x05,
- 0x31, 0x0a, 0x33, 0x53, 0x7a, 0x01, 0x6c, 0xf5, 0x74, 0xba, 0x23, 0xd0,
- 0x65, 0xfd, 0xf6, 0xaa, 0xbd, 0xcc, 0x3c, 0x5f, 0x94, 0x1f, 0x32, 0x28,
- 0xaf, 0xb8, 0x58, 0xe6, 0x3c, 0xad, 0x3e, 0x52, 0x38, 0xd0, 0xcb, 0x14,
- 0x41, 0xae, 0x20, 0x58, 0x87, 0xa7, 0xd3, 0x58, 0x12, 0x7a, 0x0a, 0xbf,
- 0xac, 0x87, 0x8b, 0x97, 0xce, 0x48, 0x81, 0xb9, 0x03, 0x4d, 0xe1, 0xa3,
- 0xd7, 0x8b, 0xec, 0x8e, 0x3e, 0xc3, 0xdc, 0x1b, 0x94, 0x4c, 0x1e, 0xb2,
- 0xd5, 0x33, 0x43, 0x32, 0xbb, 0xd1, 0xef, 0x25, 0x89, 0x9d, 0x96, 0x6a,
- 0xce, 0x7c, 0xf0, 0x20, 0xe3, 0xa5, 0x12, 0x4b, 0x9c, 0xfe, 0x11, 0xcc,
- 0xd5, 0x37, 0xc2, 0xa5, 0xd7, 0x89, 0x20, 0xb5, 0xa9, 0xc2, 0x3c, 0xd6,
- 0x9c, 0x71, 0xe6, 0xb1, 0xec, 0x85, 0xd7, 0x8f, 0xdd, 0x0e, 0x98, 0x6b,
- 0x2c, 0x04, 0xd9, 0x2b, 0x42, 0xe6, 0x2f, 0x09, 0x36, 0xba, 0xbe, 0xe9,
- 0x8a, 0x60, 0xd7, 0x88, 0x88, 0xa0, 0x71, 0x5a, 0xc8, 0x0f, 0x61, 0xc4,
- 0xd8, 0xb3, 0x2e, 0xd5, 0x2b, 0x28, 0x4a, 0xe1, 0x70, 0x24, 0xfa, 0xb3,
- 0x6b, 0x20, 0xdd, 0xe9, 0x61, 0x1c, 0xd7, 0x40, 0xd1, 0x25, 0x91, 0x8a,
- 0x2c, 0xb0, 0xbe, 0xd6, 0x74, 0xa6, 0xbd, 0x6a, 0xe6, 0x97, 0x56, 0x42,
- 0x66, 0x5f, 0x99, 0x4c, 0xd8, 0xe9, 0x2e, 0x47, 0xd8, 0xfc, 0xb9, 0x58,
- 0x36, 0x41, 0xec, 0x8c, 0x88, 0x9d, 0x38, 0x9d, 0xff, 0xcb, 0x41, 0x58,
- 0xf0, 0x27, 0x9d, 0xfa, 0xab, 0x0a, 0x11, 0x0e, 0xd3, 0xbf, 0x6e, 0x8c,
- 0x04, 0x58, 0x11, 0x06, 0xd0, 0x89, 0xd6, 0x1c, 0x8a, 0x98, 0x5d, 0x83,
- 0x19, 0x73, 0x9b, 0x75, 0x07, 0xbe, 0x85, 0xee, 0x6e, 0xb0, 0xaf, 0xa8,
- 0x90, 0x58, 0x47, 0xdd, 0x01, 0x72, 0xc1, 0x8e, 0xfc, 0x33, 0x76, 0x0e,
- 0x79, 0x9f, 0xb2, 0x55, 0xd7, 0xd2, 0x47, 0x66, 0x8b, 0xe4, 0x87, 0x7e,
- 0xfb, 0xbb, 0x69, 0x7d, 0xdd, 0x6e, 0x77, 0x39, 0xda, 0xe7, 0x7e, 0x8f,
- 0x1e, 0x44, 0x0b, 0x61, 0xb7, 0xbe, 0xfd, 0xf8, 0xcf, 0x06, 0x2c, 0x77,
- 0x8f, 0xbb, 0x77, 0x1d, 0x83, 0xa3, 0xa3, 0x70, 0x0c, 0x4a, 0x5c, 0xdc,
- 0x85, 0x39, 0x5b, 0xad, 0x3b, 0x79, 0xed, 0x2d, 0xec, 0xb2, 0xf6, 0xfd,
- 0x8b, 0x38, 0x12, 0xa3, 0x8e, 0xb1, 0x49, 0x4a, 0x94, 0xf9, 0x71, 0x97,
- 0xf2, 0x83, 0x97, 0x70, 0x2b, 0xe7, 0xb3, 0x0b, 0x87, 0xb2, 0x29, 0x5f,
- 0x8f, 0x9c, 0xb8, 0x48, 0x02, 0x64, 0xf2, 0x0f, 0x2a, 0x2c, 0xc8, 0x33,
- 0x6b, 0xa9, 0x2b, 0xf8, 0x4a, 0x6b, 0x12, 0x1e, 0x73, 0x2f, 0x05, 0x53,
- 0xe2, 0xd6, 0x20, 0xa2, 0xad, 0x84, 0xb3, 0xb0, 0x0e, 0xed, 0xee, 0xb6,
- 0x27, 0x9e, 0xfa, 0xcd, 0x8f, 0x05, 0xc1, 0x5b, 0xf2, 0x89, 0xe0, 0xf8,
- 0x5f, 0x3e, 0x44, 0xc7, 0xd8, 0x0e, 0x3a, 0x4b, 0xd0, 0x49, 0xd0, 0xda,
- 0xdc, 0x90, 0x26, 0x8f, 0xc1, 0xcb, 0x8f, 0x4f, 0x04, 0xe4, 0x2a, 0x82,
- 0x4c, 0x8e, 0x00, 0x57, 0xfc, 0xb8, 0xd0, 0x93, 0x68, 0x6f, 0xeb, 0xd9,
- 0x00, 0x7d, 0xa0, 0x1c, 0xbb, 0x40, 0xd7, 0x75, 0x73, 0xd5, 0x79, 0xee,
- 0xb7, 0x9f, 0xb6, 0x66, 0x56, 0xd3, 0x5a, 0x3e, 0x46, 0xa4, 0xf9, 0x8f,
- 0xfe, 0x1e, 0xfd, 0xb0, 0x48, 0x83, 0x97, 0x0c, 0x23, 0x58, 0xdb, 0x13,
- 0xfb, 0xf0, 0xef, 0xd1, 0x13, 0x64, 0xee, 0x45, 0xf7, 0x50, 0xab, 0x0f,
- 0x78, 0xec, 0xf7, 0xf8, 0xfe, 0xed, 0xde, 0xaa, 0xcf, 0xa2, 0x9c, 0x16,
- 0x9e, 0xf8, 0x0d, 0x3f, 0xfc, 0xde, 0x1a, 0x25, 0x9c, 0xe5, 0xf8, 0x92,
- 0xfe, 0x7b, 0xa0, 0x33, 0xbc, 0xb6, 0x4e, 0x87, 0x97, 0xe3, 0xd8, 0xc2,
- 0x8a, 0xb8, 0x2a, 0xa1, 0xdd, 0x6c, 0xde, 0x47, 0x01, 0xbf, 0x24, 0xad,
- 0x90, 0x49, 0x22, 0x84, 0x31, 0x12, 0x64, 0xbe, 0x03, 0xa5, 0x9a, 0x11,
- 0x1d, 0x5a, 0x33, 0xdd, 0x25, 0x71, 0x39, 0x11, 0xf2, 0x85, 0x2e, 0xd9,
- 0x86, 0xbb, 0xac, 0xe8, 0x34, 0xc7, 0x45, 0x30, 0x74, 0x2e, 0x4e, 0x4f,
- 0xee, 0x12, 0xcc, 0x07, 0xb1, 0xe1, 0x19, 0xf3, 0x32, 0xad, 0x1c, 0x3f,
- 0xf4, 0x29, 0xa9, 0x86, 0xee, 0x48, 0x0a, 0xc6, 0x6c, 0x36, 0x05, 0x95,
- 0x07, 0x38, 0x6a, 0x67, 0x51, 0x15, 0x1e, 0x66, 0xc5, 0x53, 0x29, 0x0f,
- 0x92, 0xde, 0xe0, 0x7d, 0x72, 0xd0, 0xfb, 0x1d, 0x01, 0xe4, 0x9e, 0x71,
- 0xfa, 0xab, 0xf1, 0x70, 0xab, 0xd1, 0x61, 0x6d, 0x88, 0x90, 0xb8, 0xc7,
- 0x1f, 0xc2, 0x85, 0x5d, 0x11, 0x47, 0xe7, 0xbb, 0xee, 0x02, 0x44, 0x20,
- 0x56, 0x14, 0xa1, 0xe6, 0x80, 0xb0, 0x1d, 0x5d, 0x83, 0xf4, 0x34, 0x64,
- 0xf9, 0xfa, 0xfe, 0xe2, 0xf7, 0x41, 0x5d, 0x3f, 0x07, 0x1b, 0x6b, 0x01,
- 0xc5, 0x1c, 0x4e, 0x8c, 0x42, 0x9e, 0x0e, 0x25, 0x06, 0xac, 0x24, 0x9b,
- 0xce, 0xa8, 0x84, 0x1c, 0x18, 0xa4, 0x20, 0x34, 0x5c, 0x8d, 0x11, 0x4b,
- 0xb6, 0x2e, 0x3d, 0x17, 0xbe, 0x63, 0x1f, 0x22, 0xbb, 0x2b, 0xee, 0x3c,
- 0xc6, 0x36, 0x04, 0x1d, 0xed, 0x67, 0x41, 0xed, 0x1e, 0xc1, 0x10, 0x8a,
- 0x8d, 0xac, 0x8d, 0x25, 0xb7, 0x79, 0xca, 0x81, 0x19, 0x9e, 0x48, 0xf9,
- 0x16, 0xcf, 0xa8, 0xfb, 0xd4, 0x2a, 0xf7, 0x1c, 0x27, 0x6c, 0x47, 0xd2,
- 0x3c, 0xde, 0x8d, 0x46, 0x21, 0x54, 0xac, 0xa8, 0xb2, 0x49, 0x79, 0x5d,
- 0xe4, 0x7f, 0x97, 0xfc, 0xf2, 0x2e, 0x7a, 0xa4, 0x85, 0xd5, 0x13, 0x14,
- 0x09, 0xe3, 0x22, 0x11, 0x3f, 0xe9, 0xae, 0x86, 0xe5, 0x12, 0x21, 0x29,
- 0x85, 0x50, 0x2e, 0x48, 0x10, 0x64, 0x2a, 0xb9, 0x60, 0x2d, 0x73, 0xba,
- 0xb7, 0x62, 0x21, 0x9a, 0x73, 0xdd, 0x55, 0x74, 0x64, 0x57, 0x08, 0x04,
- 0x28, 0x7e, 0x7c, 0xb2, 0x5f, 0x01, 0xac, 0xa3, 0x90, 0xe9, 0xaf, 0x82,
- 0xd6, 0xb5, 0x2d, 0x2a, 0x2f, 0x85, 0x1f, 0x05, 0xb3, 0xe9, 0x70, 0x44,
- 0x39, 0x52, 0x84, 0xe0, 0x2a, 0x2c, 0x09, 0xe3, 0x7b, 0x28, 0xc0, 0xe6,
- 0xfc, 0x18, 0x9a, 0x14, 0xd3, 0x8e, 0xe4, 0x54, 0x85, 0x67, 0xab, 0xcb,
- 0x91, 0x62, 0x5b, 0x7f, 0x04, 0x39, 0x0a, 0x59, 0xf7, 0xca, 0x6f, 0x29,
- 0x5d, 0x06, 0xf1, 0xb3, 0xad, 0x49, 0x5e, 0x72, 0x15, 0x70, 0xef, 0x48,
- 0xf2, 0x81, 0x8d, 0x96, 0x25, 0x5a, 0x10, 0x75, 0x38, 0x25, 0x4f, 0x8d,
- 0x15, 0x0a, 0xdd, 0xf0, 0xdc, 0xd2, 0xdb, 0x54, 0xe9, 0x02, 0x70, 0x63,
- 0xcb, 0xac, 0x40, 0xee, 0x58, 0x60, 0xa2, 0x75, 0x4f, 0x74, 0xb7, 0x96,
- 0xb2, 0x8d, 0x7a, 0x5d, 0xe4, 0xc8, 0x91, 0x18, 0xfe, 0xb6, 0x8c, 0x86,
- 0x63, 0x14, 0x46, 0xf2, 0xa0, 0x94, 0x18, 0x0e, 0x59, 0xcd, 0x74, 0x9a,
- 0x1a, 0x2a, 0x26, 0x4d, 0x1c, 0x64, 0x0c, 0xb1, 0xb5, 0x6b, 0xd2, 0x27,
- 0xe9, 0xc3, 0x22, 0x57, 0xd4, 0xf7, 0xc1, 0x42, 0xa5, 0x6c, 0x77, 0xb0,
- 0xf7, 0xd2, 0xc8, 0x8a, 0x52, 0xab, 0xbf, 0x03, 0x22, 0xf3, 0xd7, 0x00,
- 0x32, 0x7f, 0x67, 0x44, 0xa6, 0x77, 0x53, 0xd0, 0xb5, 0x13, 0xde, 0x13,
- 0xf0, 0x1e, 0x52, 0x4a, 0x1d, 0x87, 0x47, 0xef, 0x52, 0xcb, 0x84, 0x1d,
- 0x53, 0xd2, 0xa3, 0x27, 0xa9, 0xdf, 0x42, 0xb7, 0x78, 0x12, 0x44, 0xe5,
- 0x23, 0x63, 0xcc, 0xa8, 0x06, 0xc7, 0x8a, 0x3c, 0xf1, 0x8c, 0xf2, 0xc1,
- 0xa6, 0x99, 0x70, 0x3c, 0xfc, 0xc9, 0x11, 0x51, 0xff, 0x9e, 0xd9, 0x5d,
- 0x34, 0xbc, 0x3d, 0x23, 0x9b, 0x5f, 0x7a, 0xf7, 0xf1, 0x17, 0x91, 0x0b,
- 0x39, 0x48, 0x3a, 0x65, 0x7c, 0x37, 0xbd, 0xda, 0x26, 0x52, 0x8a, 0x08,
- 0xbd, 0xf8, 0x81, 0x41, 0xe1, 0x2b, 0x78, 0x3e, 0x55, 0xbc, 0x69, 0x81,
- 0xf7, 0x15, 0x02, 0x4e, 0xa8, 0xba, 0x94, 0xa5, 0xd7, 0xc8, 0xf3, 0x71,
- 0xd6, 0xdc, 0x65, 0x99, 0x90, 0x66, 0xe9, 0x34, 0x7a, 0x32, 0xc0, 0xca,
- 0xc3, 0x95, 0x61, 0xb0, 0xbe, 0x90, 0x23, 0x92, 0x44, 0x61, 0x2a, 0x38,
- 0x5b, 0xe5, 0x55, 0x7d, 0xbd, 0xc1, 0xf1, 0x8b, 0x31, 0xcb, 0x3b, 0xcf,
- 0x35, 0x7f, 0x9f, 0xe6, 0xc5, 0x03, 0xe9, 0xb4, 0x70, 0xb3, 0x1a, 0xcd,
- 0x94, 0x07, 0x7d, 0xc3, 0xdf, 0x1e, 0x63, 0x39, 0xb6, 0xb1, 0xec, 0xd5,
- 0xb6, 0x98, 0xd3, 0xc5, 0xf7, 0xf4, 0xac, 0xb6, 0xd3, 0x50, 0xdc, 0x98,
- 0xb8, 0x1f, 0x23, 0xa9, 0x25, 0xbc, 0x8c, 0xde, 0x45, 0x0a, 0x48, 0x02,
- 0x4f, 0x85, 0xa0, 0xf9, 0x59, 0x80, 0xd8, 0x79, 0x58, 0x79, 0x2c, 0xbc,
- 0x61, 0xce, 0x33, 0x02, 0x48, 0xc8, 0x69, 0xcd, 0x35, 0x51, 0x9a, 0xbe,
- 0x35, 0x80, 0x2f, 0xdd, 0x89, 0x4a, 0xe6, 0x64, 0xa1, 0x8f, 0x04, 0x0e,
- 0x4c, 0xfa, 0x68, 0xba, 0x30, 0x5f, 0x22, 0x07, 0x25, 0x62, 0xc1, 0xf3,
- 0x74, 0x9a, 0x79, 0x4e, 0x0b, 0x6f, 0x1a, 0x3a, 0x8e, 0xf9, 0x08, 0xd8,
- 0x2a, 0xa0, 0x48, 0x54, 0x23, 0x82, 0x05, 0x93, 0x00, 0xf5, 0x24, 0xb1,
- 0x41, 0x9d, 0xf4, 0xe2, 0xea, 0xa1, 0x5d, 0x19, 0xe7, 0x0b, 0x11, 0x5a,
- 0x9d, 0x42, 0xb2, 0x27, 0x3a, 0x02, 0x3b, 0xac, 0x6c, 0x79, 0x59, 0xb2,
- 0x3a, 0xc5, 0xe8, 0xe7, 0x6e, 0xdf, 0x05, 0x43, 0xa0, 0x95, 0x5e, 0x38,
- 0x08, 0x4f, 0x5f, 0x80, 0x8b, 0x3e, 0x52, 0x46, 0x45, 0xa0, 0xc7, 0xfa,
- 0x82, 0x70, 0xf5, 0x49, 0xfb, 0xb6, 0x20, 0xd6, 0x2a, 0xaf, 0x68, 0x2c,
- 0x82, 0xd4, 0x12, 0x0e, 0x92, 0xa2, 0x1e, 0xf1, 0x0b, 0x6e, 0x8d, 0x88,
- 0xfd, 0x7c, 0x74, 0x74, 0xbe, 0x9d, 0x9c, 0x77, 0xb2, 0xcf, 0x01, 0x2e,
- 0xa6, 0x3b, 0xdb, 0x97, 0xf7, 0x52, 0x81, 0x84, 0xa9, 0x98, 0x56, 0x67,
- 0x2a, 0x2b, 0x01, 0x9e, 0x25, 0x1d, 0x83, 0xdb, 0xf9, 0x37, 0x97, 0x7f,
- 0x9d, 0xb1, 0x1c, 0x82, 0x75, 0x80, 0x13, 0x91, 0x25, 0x29, 0xda, 0x17,
- 0x06, 0xc6, 0xa6, 0x2b, 0x09, 0xd7, 0xce, 0x94, 0xff, 0x92, 0xbb, 0xad,
- 0x39, 0xd7, 0xb3, 0x00, 0x68, 0x81, 0x89, 0x50, 0xd4, 0x9b, 0xc7, 0xb8,
- 0x20, 0xb5, 0x77, 0x6a, 0xbe, 0xfd, 0x3a, 0x25, 0x5b, 0xb0, 0xbd, 0xaf,
- 0xb3, 0x22, 0xa4, 0xd9, 0xc6, 0x47, 0x49, 0x5f, 0x90, 0x0d, 0x3c, 0x1d,
- 0x76, 0x69, 0x1e, 0xbd, 0xec, 0x72, 0xe9, 0x9c, 0x5f, 0xcf, 0x66, 0x05,
- 0x15, 0x14, 0xab, 0x92, 0x54, 0x7a, 0x87, 0x04, 0xef, 0x35, 0x65, 0xf3,
- 0x37, 0xb8, 0x48, 0x17, 0xf7, 0x34, 0x19, 0xe6, 0xb1, 0xba, 0xbe, 0xd9,
- 0x37, 0xe2, 0x69, 0x7f, 0xf8, 0x39, 0x1b, 0xb8, 0x37, 0x46, 0x27, 0xc8,
- 0xaa, 0x15, 0x44, 0x6f, 0x52, 0xa3, 0xab, 0xd3, 0x9e, 0x28, 0xfb, 0x43,
- 0x67, 0x5f, 0x0c, 0xfe, 0x07, 0xed, 0xb4, 0xbf, 0x2d, 0x43, 0xdf, 0xe1,
- 0x16, 0x6d, 0xa8, 0x84, 0xb6, 0xd5, 0x76, 0x82, 0x8a, 0x32, 0x1c, 0xe5,
- 0x18, 0xe7, 0x0d, 0x28, 0x5c, 0x95, 0xa8, 0xa4, 0x7d, 0x30, 0x51, 0x75,
- 0xa1, 0xc2, 0x5b, 0xd1, 0xc4, 0xb4, 0x61, 0xf2, 0x3f, 0xe8, 0x53, 0xfa,
- 0x36, 0x43, 0x8c, 0x11, 0x88, 0xf9, 0xea, 0xf8, 0xcd, 0xd9, 0xc5, 0x71,
- 0x3b, 0x37, 0xa0, 0xe1, 0x8a, 0x13, 0x08, 0x34, 0x74, 0x7b, 0xc7, 0xec,
- 0x2b, 0x7e, 0x39, 0xb3, 0xbc, 0xc8, 0x09, 0x29, 0x96, 0x9c, 0x7f, 0xff,
- 0xda, 0xf6, 0x2e, 0x87, 0x78, 0x7e, 0xe3, 0x95, 0xa6, 0xec, 0xf3, 0x4c,
- 0x77, 0x35, 0x08, 0xd2, 0x35, 0xb6, 0x87, 0x24, 0x0e, 0x38, 0x88, 0xa2,
- 0xfd, 0x43, 0x78, 0x87, 0xc3, 0x72, 0x5a, 0x3d, 0x1d, 0x64, 0x9f, 0x75,
- 0x4d, 0xb9, 0x6f, 0xb6, 0xd1, 0x40, 0xbd, 0x66, 0x0d, 0x83, 0x49, 0x2e,
- 0x18, 0xd8, 0x94, 0x26, 0x60, 0x39, 0x21, 0xe2, 0x93, 0x61, 0x12, 0x7e,
- 0x48, 0x03, 0x52, 0xf8, 0x4a, 0x2c, 0x92, 0x48, 0x05, 0x3f, 0xd9, 0x85,
- 0xc9, 0xd7, 0x2a, 0x91, 0x55, 0xa3, 0x3c, 0xa1, 0x56, 0x5b, 0xe8, 0x33,
- 0x23, 0x8d, 0xe4, 0xa7, 0xf9, 0x13, 0x19, 0xf1, 0xce, 0x9b, 0x6f, 0x6e,
- 0xd5, 0x04, 0xb4, 0xf4, 0xba, 0x6a, 0x7f, 0x93, 0xa8, 0x9d, 0xbe, 0xf9,
- 0xa7, 0x4d, 0x87, 0x49, 0xe5, 0xaa, 0x31, 0xf1, 0x2a, 0x4b, 0xae, 0xe8,
- 0xc6, 0xf6, 0x43, 0xd1, 0x63, 0x1d, 0xf1, 0x2a, 0x1b, 0x4d, 0x32, 0x18,
- 0x25, 0xa0, 0x88, 0xe2, 0x57, 0x08, 0x9b, 0xc2, 0x45, 0x0b, 0xca, 0xb6,
- 0xf2, 0xaa, 0xdd, 0xdd, 0xba, 0x1f, 0x23, 0xdb, 0x24, 0xaf, 0x4f, 0xd5,
- 0x26, 0xe2, 0xe7, 0x9b, 0x97, 0x2c, 0x80, 0x31, 0xa7, 0xe9, 0x73, 0x57,
- 0x69, 0xd6, 0x50, 0xe2, 0xa0, 0xbe, 0x2f, 0x1a, 0x3a, 0xad, 0x10, 0x2c,
- 0xc1, 0xa4, 0x55, 0xb8, 0x90, 0x68, 0x2f, 0xb9, 0xdd, 0x5b, 0x23, 0x1f,
- 0xf5, 0xc5, 0xb3, 0x17, 0xa4, 0x44, 0x20, 0x44, 0x2a, 0x75, 0x28, 0x84,
- 0x8b, 0x50, 0x98, 0x3e, 0xc3, 0x54, 0x14, 0x51, 0x3d, 0x6c, 0x4b, 0x52,
- 0x3f, 0x70, 0x9c, 0xa1, 0x32, 0x66, 0x89, 0x13, 0xe4, 0x08, 0x0d, 0xd7,
- 0xd9, 0x96, 0xab, 0x21, 0x88, 0x43, 0xd6, 0x4f, 0xcc, 0x32, 0xa4, 0x1f,
- 0x25, 0x4f, 0x91, 0x0f, 0x43, 0xf4, 0x68, 0xf6, 0x75, 0x2b, 0x78, 0xfd,
- 0xb2, 0xe4, 0xcd, 0x46, 0x6c, 0x67, 0x55, 0x5e, 0x7f, 0x34, 0x07, 0xef,
- 0xdf, 0x24, 0xa9, 0x70, 0x65, 0xa2, 0x1b, 0xb9, 0x26, 0xf3, 0x62, 0x49,
- 0xc5, 0x0d, 0xbd, 0xaa, 0xb4, 0xda, 0xe2, 0x15, 0x2a, 0xa5, 0x10, 0xef,
- 0x5d, 0x0c, 0xb7, 0x5f, 0x37, 0xe5, 0x22, 0xe0, 0xb1, 0x97, 0xb4, 0x48,
- 0xd9, 0x09, 0xe1, 0xad, 0x49, 0x53, 0x05, 0x82, 0x47, 0xf1, 0x13, 0xaa,
- 0xf2, 0x34, 0x4c, 0xde, 0x17, 0xd0, 0x6e, 0x64, 0x6b, 0xca, 0x55, 0x92,
- 0x17, 0x66, 0x2c, 0x66, 0xac, 0xe6, 0x32, 0x89, 0x09, 0x2a, 0xc8, 0x42,
- 0xb7, 0xb7, 0x12, 0x15, 0xa5, 0x1d, 0xb6, 0x0d, 0x1c, 0x6d, 0x4b, 0xc9,
- 0xc9, 0xb2, 0x2d, 0x79, 0x13, 0x56, 0x7e, 0xe1, 0xa2, 0x15, 0x74, 0x1c,
- 0xcc, 0x22, 0xa1, 0x6d, 0x4a, 0x8b, 0xca, 0x66, 0xb3, 0x01, 0x33, 0x82,
- 0x12, 0x3f, 0x22, 0xd9, 0x19, 0x66, 0x99, 0xd2, 0x09, 0x87, 0xd8, 0xfd,
- 0xac, 0xb8, 0xe0, 0xf6, 0x41, 0xf2, 0xd5, 0x10, 0x28, 0x65, 0x4d, 0x5b,
- 0x16, 0xbc, 0xb8, 0x02, 0xba, 0x09, 0xff, 0xef, 0x5c, 0x33, 0x98, 0x9d,
- 0xbf, 0xa9, 0xd0, 0x8d, 0x95, 0x69, 0x08, 0x29, 0xb6, 0x26, 0x37, 0xd7,
- 0xd5, 0x82, 0xeb, 0xc5, 0xc4, 0x8a, 0xd9, 0x78, 0x06, 0x00, 0x3f, 0xa9,
- 0x6b, 0x5b, 0x67, 0x0d, 0x77, 0x85, 0x5f, 0x3d, 0x79, 0xdd, 0x2a, 0x3d,
- 0x49, 0x33, 0x01, 0xb2, 0xb7, 0x78, 0x73, 0x8d, 0xad, 0x99, 0xcc, 0x47,
- 0xd6, 0xdd, 0x2d, 0xb6, 0x35, 0x67, 0xed, 0x8c, 0xef, 0xdd, 0x6f, 0xe2,
- 0xcd, 0x49, 0x1b, 0xac, 0xce, 0x72, 0x0b, 0xda, 0x2c, 0xf6, 0x8a, 0x56,
- 0x46, 0xa5, 0xdd, 0x40, 0xf5, 0x8f, 0xf5, 0x23, 0x21, 0x8c, 0xe3, 0x66,
- 0x5e, 0x4e, 0x09, 0x73, 0x9e, 0x3d, 0x38, 0x17, 0xf4, 0xa0, 0xce, 0x85,
- 0xe0, 0xf5, 0x6b, 0x7f, 0x5c, 0x68, 0xc4, 0xec, 0x52, 0xda, 0x79, 0x22,
- 0xc4, 0xe2, 0xcd, 0xb9, 0x81, 0x6a, 0xfd, 0xa6, 0x8c, 0x5f, 0xf6, 0x87,
- 0x50, 0x24, 0xe5, 0xa4, 0xf1, 0x46, 0x40, 0x0f, 0xc4, 0x9b, 0x63, 0xe1,
- 0x1b, 0x19, 0x19, 0x41, 0xb8, 0x61, 0xdc, 0x3e, 0x34, 0x32, 0x7a, 0x30,
- 0x58, 0x65, 0xf3, 0x43, 0xc7, 0xa3, 0xe6, 0x2d, 0x31, 0x2f, 0x4e, 0xbc,
- 0xb9, 0xf6, 0x02, 0xeb, 0x0a, 0xa3, 0x0f, 0xb1, 0x05, 0x16, 0x3e, 0xc6,
- 0x50, 0x0b, 0x73, 0xa6, 0x3a, 0xcf, 0x8e, 0x7d, 0x70, 0xe5, 0x02, 0xcb,
- 0x37, 0x82, 0x59, 0x98, 0x19, 0x09, 0x69, 0xb4, 0xe0, 0x49, 0xf6, 0x81,
- 0x0b, 0xa9, 0x51, 0x39, 0xec, 0xe6, 0xc3, 0xfa, 0x09, 0x99, 0x49, 0x7a,
- 0xe3, 0xfd, 0x1c, 0x05, 0x18, 0xad, 0xac, 0x10, 0xae, 0xb4, 0x94, 0x7e,
- 0x33, 0x2e, 0x49, 0x09, 0xc4, 0xef, 0xa3, 0x14, 0xf0, 0xba, 0xed, 0xdd,
- 0xf7, 0x98, 0x5f, 0x8d, 0xaf, 0xaa, 0x45, 0x99, 0x17, 0x96, 0x05, 0x1d,
- 0x32, 0xc6, 0xeb, 0x63, 0x2c, 0xb5, 0x7e, 0x5d, 0xa0, 0x65, 0xfe, 0x91,
- 0x40, 0xe0, 0x56, 0x51, 0xf8, 0x10, 0x61, 0xba, 0xf6, 0x06, 0xc7, 0x4f,
- 0xeb, 0x6a, 0xf3, 0x90, 0xb4, 0x88, 0x99, 0x2b, 0xd4, 0xe5, 0x8e, 0xf3,
- 0x9a, 0x7d, 0xdc, 0xfe, 0xa4, 0x3d, 0x93, 0xdd, 0xfe, 0x2d, 0xee, 0xa6,
- 0x36, 0xbb, 0xfc, 0xce, 0x1d, 0x21, 0x55, 0x01, 0xc0, 0x85, 0xac, 0xa5,
- 0xf0, 0x08, 0x76, 0xca, 0x8d, 0x5d, 0x29, 0x9f, 0xe3, 0x8a, 0xa9, 0x00,
- 0xcd, 0x63, 0xa0, 0x25, 0x05, 0x1f, 0xaf, 0x32, 0x46, 0xe6, 0x60, 0x7e,
- 0x65, 0x39, 0x56, 0x4f, 0x8e, 0x3c, 0xed, 0xba, 0xc8, 0xf2, 0xdd, 0x2f,
- 0xdb, 0xeb, 0xe6, 0x48, 0x8f, 0xc3, 0x1a, 0x81, 0x27, 0x9f, 0xed, 0x8a,
- 0xbc, 0x69, 0x46, 0x3e, 0x62, 0xde, 0x0b, 0xc0, 0xf3, 0x3e, 0x7c, 0xb2,
- 0xb8, 0xe7, 0x2b, 0xe7, 0xb8, 0x9a, 0x3f, 0x70, 0xc8, 0xcd, 0x03, 0x6e,
- 0x54, 0x84, 0xe9, 0xf1, 0x46, 0x15, 0x9c, 0x4b, 0xa9, 0xf9, 0xb7, 0x62,
- 0xe6, 0x57, 0xf5, 0xa0, 0xb5, 0x0b, 0x57, 0xf7, 0x44, 0x9e, 0x8c, 0x76,
- 0xc7, 0x4d, 0x2e, 0x65, 0xf6, 0xdc, 0xbb, 0x9e, 0xc5, 0x9b, 0x93, 0xee,
- 0xba, 0xb7, 0x64, 0x7a, 0xfa, 0x9e, 0x23, 0x95, 0x89, 0xb1, 0x8d, 0x71,
- 0x19, 0xee, 0x0d, 0x3d, 0xe0, 0xbf, 0x48, 0x40, 0x90, 0x15, 0x3f, 0x2b,
- 0x7c, 0xbb, 0x9d, 0xbe, 0x68, 0xee, 0xde, 0x35, 0x70, 0x5b, 0x8f, 0x52,
- 0xd7, 0x2e, 0x37, 0x97, 0x59, 0x43, 0xa8, 0x10, 0x24, 0x20, 0x80, 0xd2,
- 0xa0, 0xae, 0x82, 0xd8, 0xce, 0xe0, 0x04, 0x99, 0x12, 0x63, 0x75, 0x88,
- 0xed, 0x4b, 0xf8, 0x9b, 0x09, 0x93, 0x80, 0x61, 0x5a, 0x51, 0x0a, 0x46,
- 0x14, 0x11, 0x2d, 0xe3, 0x56, 0x67, 0x62, 0x4d, 0xc8, 0xe3, 0x4c, 0x82,
- 0x1d, 0x16, 0xaf, 0xeb, 0x30, 0xb1, 0x91, 0x02, 0xd2, 0x21, 0x8f, 0xcc,
- 0xae, 0xa7, 0x7e, 0x25, 0x48, 0x6f, 0xf8, 0x55, 0x9f, 0xa7, 0xe0, 0xda,
- 0x0c, 0x1e, 0x7f, 0x44, 0x81, 0xac, 0xd0, 0x9a, 0xa1, 0xac, 0x50, 0x36,
- 0xe5, 0x76, 0x72, 0x91, 0x51, 0xe2, 0xd6, 0x2d, 0x09, 0x53, 0xca, 0xcc,
- 0x4e, 0xb8, 0x81, 0xad, 0x7c, 0x98, 0x09, 0x6e, 0x11, 0x6e, 0x6a, 0xe2,
- 0x97, 0x0d, 0x74, 0x1a, 0xb3, 0x33, 0xb6, 0x95, 0xbb, 0x2d, 0x95, 0x6a,
- 0x20, 0x7b, 0xc3, 0x3d, 0xa3, 0x8b, 0xbf, 0x61, 0x0a, 0x8c, 0xc4, 0x57,
- 0xaf, 0xc1, 0x84, 0x27, 0xcc, 0x96, 0xf4, 0xe9, 0xae, 0x37, 0xe2, 0x82,
- 0x3e, 0x5c, 0x87, 0x2e, 0x6a, 0xf8, 0xb9, 0x9d, 0x59, 0x73, 0x97, 0xde,
- 0x87, 0x8a, 0xfa, 0xee, 0xe0, 0xe9, 0x8b, 0x17, 0xad, 0x1b, 0xbd, 0xf6,
- 0x58, 0x41, 0x9f, 0xed, 0xee, 0x72, 0xd6, 0x79, 0xf7, 0x35, 0xf3, 0x8b,
- 0xc1, 0x0b, 0xbc, 0xd8, 0x7e, 0xad, 0xce, 0xcc, 0x12, 0x4c, 0x57, 0xbf,
- 0x37, 0xa0, 0xdf, 0x44, 0x3e, 0x07, 0xaf, 0xcb, 0xca, 0xb7, 0x5e, 0xd0,
- 0xe7, 0x22, 0x6f, 0x71, 0x42, 0x3c, 0xa6, 0xb1, 0xbc, 0xba, 0x22, 0x77,
- 0x17, 0x3d, 0x89, 0x8b, 0xcf, 0xec, 0x88, 0xbb, 0xb4, 0x9a, 0x86, 0xc3,
- 0xdd, 0xed, 0x0f, 0xf6, 0x56, 0x0d, 0x17, 0xb4, 0xa6, 0x80, 0xb7, 0xd0,
- 0x7a, 0x92, 0x35, 0x69, 0x6c, 0x09, 0x06, 0x31, 0x77, 0x1b, 0xda, 0x33,
- 0x3d, 0xda, 0x7b, 0xf1, 0xa2, 0x4f, 0x3d, 0x7b, 0xf6, 0xe2, 0xc5, 0xca,
- 0xa4, 0x35, 0xef, 0x33, 0x77, 0xa5, 0x73, 0x52, 0xd1, 0xeb, 0x6e, 0xd3,
- 0xd4, 0x64, 0xb2, 0xc4, 0xbf, 0x43, 0xbf, 0x79, 0x95, 0xbc, 0x3b, 0xbb,
- 0x3c, 0xf6, 0xdc, 0x37, 0x38, 0x5e, 0x1c, 0xbe, 0xf4, 0xec, 0x51, 0xc4,
- 0x83, 0x17, 0xa8, 0x4c, 0x01, 0xd3, 0x98, 0x6c, 0xad, 0x10, 0xe5, 0x00,
- 0x40, 0xad, 0xfa, 0x0d, 0xff, 0xa5, 0xfb, 0xb9, 0x33, 0x80, 0x97, 0xa7,
- 0xf9, 0x75, 0xde, 0xf8, 0x4c, 0x0a, 0x5b, 0x66, 0xb5, 0xb9, 0xf4, 0xfc,
- 0x6d, 0x3a, 0xcb, 0x6d, 0x68, 0x67, 0xb3, 0x26, 0x00, 0x2a, 0xd3, 0x2a,
- 0x6e, 0x92, 0x61, 0xb4, 0x19, 0x40, 0x40, 0xb3, 0xd9, 0xb4, 0xd6, 0x8b,
- 0x90, 0x1f, 0x1f, 0xe0, 0x41, 0x39, 0x2d, 0xb0, 0x67, 0xb9, 0xfc, 0x65,
- 0x0a, 0xe7, 0x32, 0x7f, 0x7a, 0x75, 0x70, 0x87, 0x24, 0x21, 0x23, 0xcf,
- 0x14, 0x3d, 0x4e, 0xed, 0xf8, 0xbc, 0x8b, 0x9b, 0xb5, 0x73, 0x8b, 0x5a,
- 0x1f, 0x5e, 0x11, 0x07, 0x3c, 0x20, 0xa2, 0x30, 0xcd, 0x16, 0xca, 0x4f,
- 0x58, 0xb4, 0xdb, 0x31, 0x7b, 0xf9, 0x2a, 0xbf, 0x5e, 0x56, 0x71, 0x70,
- 0xd5, 0x5f, 0x1c, 0x94, 0x59, 0x29, 0x70, 0xd3, 0xbb, 0xb4, 0xca, 0xb4,
- 0x64, 0x4b, 0x71, 0x6f, 0x0f, 0xb6, 0xda, 0xc9, 0x0a, 0x59, 0x06, 0x41,
- 0x71, 0xe0, 0x17, 0x23, 0x93, 0xf9, 0xca, 0xe8, 0x32, 0x70, 0x26, 0x08,
- 0xc0, 0x44, 0xa8, 0x78, 0xd3, 0xc6, 0xe1, 0xc6, 0xd5, 0xd5, 0x6e, 0xd6,
- 0x9b, 0xae, 0xd3, 0x54, 0xa6, 0xa0, 0x1b, 0xc5, 0x2b, 0x97, 0x9b, 0x1e,
- 0xe3, 0x04, 0x3d, 0x09, 0x9f, 0xcc, 0x4d, 0xe9, 0x91, 0x5e, 0x87, 0x89,
- 0xa5, 0x92, 0x1a, 0x0f, 0xe9, 0xc3, 0x4b, 0x34, 0x35, 0x4a, 0xf4, 0xac,
- 0x4c, 0xa7, 0xe2, 0x5e, 0x71, 0xa1, 0x7d, 0xd6, 0x0e, 0x84, 0x04, 0x44,
- 0xd6, 0x36, 0x20, 0x48, 0xa5, 0xa5, 0x96, 0x55, 0x36, 0x9b, 0x59, 0xcb,
- 0xc8, 0xea, 0x26, 0x2d, 0x0b, 0xab, 0x25, 0xb1, 0x9c, 0x32, 0x1f, 0xe1,
- 0x3c, 0xde, 0xed, 0x61, 0xc4, 0x0d, 0x40, 0x1b, 0x9e, 0x57, 0xcb, 0xb2,
- 0x36, 0xa3, 0x08, 0x14, 0x5d, 0x92, 0x9e, 0xd7, 0x23, 0x19, 0x9d, 0xfc,
- 0xcf, 0xe3, 0xdf, 0x33, 0x04, 0x56, 0xa5, 0x77, 0x36, 0xb9, 0x41, 0xea,
- 0x69, 0x4b, 0x68, 0xca, 0x66, 0xd3, 0xa6, 0x33, 0x31, 0xe3, 0xa9, 0x68,
- 0x2e, 0x6e, 0x0f, 0x04, 0x39, 0xa5, 0xc6, 0x9b, 0xd9, 0x58, 0xe1, 0xde,
- 0x2e, 0x1a, 0x29, 0xba, 0xa2, 0xce, 0x45, 0xe6, 0x36, 0x05, 0x30, 0x9d,
- 0x81, 0x45, 0xba, 0x98, 0x5c, 0xb4, 0x17, 0xf6, 0x3d, 0x39, 0x86, 0xc1,
- 0x20, 0x11, 0x94, 0x6f, 0x02, 0x53, 0x11, 0x75, 0xcb, 0xf4, 0xf6, 0x81,
- 0x22, 0x3b, 0x7e, 0x3e, 0x20, 0xea, 0x32, 0x56, 0x19, 0xc5, 0xcb, 0xaa,
- 0xe4, 0xe5, 0xfb, 0x8b, 0xd3, 0x15, 0x49, 0x1d, 0x23, 0xac, 0x02, 0x4d,
- 0x57, 0xef, 0x22, 0x03, 0x1d, 0x49, 0x95, 0x9c, 0xa7, 0xd7, 0x59, 0xcf,
- 0x67, 0x75, 0x51, 0x65, 0x11, 0x13, 0x20, 0x3e, 0x88, 0x98, 0xa7, 0xc8,
- 0xa7, 0x91, 0x26, 0x31, 0xee, 0xa2, 0xd4, 0x7e, 0x2a, 0xc6, 0xd5, 0x2c,
- 0x95, 0xd9, 0x5b, 0x56, 0xa8, 0x16, 0xfd, 0x7d, 0xb4, 0x16, 0x83, 0xf8,
- 0x84, 0xda, 0x64, 0x5c, 0x0e, 0x50, 0x45, 0x01, 0x22, 0x54, 0x0b, 0xed,
- 0xfd, 0x99, 0xdc, 0xf4, 0x3d, 0x8f, 0x80, 0x6a, 0x90, 0xc5, 0x78, 0x95,
- 0x79, 0x2a, 0x98, 0x3a, 0xc8, 0xba, 0x95, 0xd8, 0xe5, 0xdf, 0x72, 0xf3,
- 0xd7, 0x99, 0x06, 0x89, 0x32, 0x22, 0x5d, 0xab, 0x23, 0x55, 0x48, 0x71,
- 0x86, 0x29, 0xc5, 0xbd, 0xe4, 0x58, 0x47, 0x9a, 0x9c, 0x4a, 0xff, 0x0e,
- 0x24, 0x22, 0xc3, 0x8a, 0x90, 0xed, 0x9a, 0x84, 0xcd, 0x15, 0xef, 0x1e,
- 0x1b, 0x6c, 0x3a, 0x23, 0x82, 0x77, 0xeb, 0xc9, 0xa2, 0x71, 0x4e, 0x4b,
- 0x22, 0x05, 0xa7, 0xfe, 0xa4, 0x85, 0x75, 0x3a, 0xb7, 0x56, 0xf6, 0x77,
- 0x67, 0x20, 0x72, 0x81, 0xa2, 0xc3, 0xbe, 0x54, 0x2d, 0x18, 0x98, 0xdd,
- 0x51, 0x48, 0xb6, 0x9e, 0xb7, 0xac, 0xde, 0xde, 0xfb, 0x8f, 0x7e, 0x94,
- 0xc8, 0x7a, 0x05, 0xf9, 0x9e, 0xd7, 0xdd, 0x06, 0x18, 0x67, 0x6c, 0x98,
- 0xb3, 0x7e, 0x87, 0x4b, 0xdb, 0xe5, 0xf5, 0xc8, 0x7d, 0x19, 0xf5, 0x2d,
- 0x0e, 0xbc, 0x38, 0x75, 0x72, 0xc4, 0x19, 0x26, 0x83, 0xd7, 0xb9, 0xb9,
- 0x47, 0x6a, 0xa6, 0x4a, 0x60, 0xc7, 0x00, 0x63, 0x71, 0xed, 0x41, 0x4c,
- 0xc2, 0x6a, 0x29, 0x1a, 0x4f, 0x01, 0x92, 0xce, 0xbe, 0x62, 0xa3, 0x3b,
- 0x66, 0x4f, 0xac, 0x66, 0xd5, 0x52, 0x6a, 0x3c, 0xa7, 0x34, 0xa4, 0xce,
- 0x6b, 0x21, 0xc5, 0x4d, 0xf1, 0x6f, 0x39, 0x1f, 0xe6, 0x56, 0x88, 0xcc,
- 0x8f, 0x32, 0x18, 0x00, 0xc6, 0xe3, 0x78, 0x05, 0xa4, 0xaa, 0x40, 0x60,
- 0x6e, 0x5a, 0x72, 0x22, 0xcd, 0x5b, 0xe9, 0xfa, 0x81, 0x4d, 0x97, 0x2c,
- 0xb5, 0x3b, 0xc7, 0x58, 0x98, 0x77, 0x87, 0x53, 0x68, 0x26, 0xa6, 0xe1,
- 0x61, 0xc7, 0x33, 0xae, 0xb4, 0xf4, 0x2b, 0x50, 0x86, 0xad, 0x51, 0x35,
- 0x37, 0x1a, 0x8d, 0x97, 0x85, 0xa2, 0x28, 0x42, 0x51, 0x4a, 0x26, 0x7a,
- 0x2c, 0xa6, 0x0f, 0x40, 0x91, 0x79, 0xc2, 0xbb, 0x07, 0x19, 0x40, 0x92,
- 0xfc, 0x71, 0xe0, 0x48, 0xc1, 0xb7, 0xee, 0x33, 0xa3, 0x63, 0x5b, 0x7e,
- 0x0e, 0x35, 0xa6, 0x22, 0x39, 0x2a, 0x09, 0x17, 0xbc, 0xaa, 0x5b, 0x4c,
- 0xc7, 0x30, 0x43, 0xbc, 0x18, 0x24, 0x4f, 0xb9, 0xd1, 0x04, 0x88, 0x56,
- 0x77, 0x59, 0x64, 0x9f, 0x88, 0xea, 0x71, 0x75, 0x73, 0xa1, 0xa2, 0xfd,
- 0xfd, 0xe1, 0xc5, 0xbb, 0x93, 0x77, 0x5f, 0x1f, 0x24, 0xc7, 0x9f, 0xb2,
- 0x6a, 0x42, 0xc5, 0x19, 0xff, 0xba, 0x9c, 0xe6, 0x13, 0x08, 0x0a, 0xa9,
- 0x79, 0xe7, 0xe7, 0x12, 0x19, 0x53, 0x20, 0x13, 0x2f, 0x2b, 0x5d, 0xba,
- 0x81, 0x7c, 0x17, 0x30, 0x2a, 0x71, 0x59, 0x1a, 0x4b, 0xaa, 0xbc, 0x5e,
- 0x7a, 0xdb, 0x67, 0xc2, 0x55, 0x7a, 0x10, 0x30, 0x40, 0x34, 0xf5, 0x46,
- 0xe6, 0x9a, 0x5c, 0xaf, 0xc9, 0xeb, 0xd3, 0xd3, 0x90, 0x63, 0x0f, 0x25,
- 0x23, 0xb9, 0xfb, 0x9c, 0x90, 0x84, 0x26, 0xcc, 0xe6, 0xaf, 0xf3, 0x31,
- 0xc3, 0x9e, 0x48, 0x05, 0x20, 0x69, 0xd3, 0x12, 0x79, 0xf0, 0xad, 0x98,
- 0xae, 0x74, 0x17, 0x19, 0x38, 0x59, 0xa0, 0x15, 0xb1, 0xc2, 0x79, 0x35,
- 0x85, 0x41, 0x64, 0x64, 0x64, 0x79, 0xd5, 0x90, 0x8e, 0xd4, 0xba, 0x4d,
- 0xdb, 0x24, 0xf7, 0x6b, 0x23, 0x09, 0x37, 0x6c, 0xea, 0xb4, 0x32, 0xbc,
- 0x27, 0xb6, 0xae, 0x34, 0x5d, 0xba, 0xac, 0x1c, 0xa2, 0x3c, 0x42, 0x2c,
- 0x8c, 0x36, 0xcd, 0x52, 0x5b, 0xf1, 0xb1, 0x26, 0x79, 0x19, 0x0a, 0x8c,
- 0xbb, 0xac, 0xca, 0x5c, 0x95, 0x76, 0xe4, 0x3a, 0x19, 0x71, 0x37, 0x4c,
- 0x46, 0xa5, 0x79, 0x3e, 0xd4, 0xb2, 0x6c, 0x11, 0xa1, 0x56, 0x45, 0x52,
- 0x74, 0xc7, 0x01, 0xbd, 0x50, 0x5e, 0x01, 0xd1, 0xb9, 0xf6, 0x78, 0x23,
- 0x25, 0x0c, 0x69, 0xff, 0x8f, 0x33, 0xab, 0x54, 0xdc, 0x6b, 0xfc, 0x87,
- 0x36, 0x49, 0x6f, 0x60, 0x04, 0x6a, 0x0f, 0xa5, 0x61, 0xa8, 0xb0, 0xa2,
- 0xd7, 0xd2, 0x03, 0xe5, 0xc1, 0x7c, 0x98, 0x75, 0x77, 0xc0, 0x0f, 0x14,
- 0x5d, 0x51, 0xcb, 0xd3, 0x73, 0x9f, 0x4a, 0xe9, 0x0b, 0x1b, 0x53, 0x65,
- 0x99, 0x44, 0xac, 0x08, 0x59, 0x13, 0x84, 0xca, 0xcf, 0x6c, 0x55, 0x23,
- 0x3c, 0xe6, 0x27, 0xf4, 0xf9, 0xaf, 0xcb, 0x8d, 0xd3, 0x77, 0x1e, 0x06,
- 0xd2, 0x0b, 0x82, 0xa4, 0x32, 0x63, 0xe7, 0x0d, 0xb7, 0x63, 0x40, 0x1f,
- 0x91, 0x8b, 0x7c, 0x25, 0xd5, 0x46, 0xbd, 0x9e, 0x3e, 0x28, 0xf9, 0x86,
- 0x5a, 0x08, 0xaa, 0x7b, 0x4b, 0xd3, 0x82, 0xfa, 0x5e, 0x71, 0x6e, 0x0e,
- 0xc2, 0x24, 0xf5, 0x4a, 0x7e, 0x7b, 0x71, 0x4d, 0xe8, 0x04, 0x48, 0x9e,
- 0x0c, 0x9b, 0xf3, 0xa8, 0xc4, 0x56, 0x0b, 0x61, 0x89, 0xdd, 0xe4, 0xc5,
- 0x6d, 0xf9, 0x91, 0x6f, 0x7c, 0xc9, 0xcd, 0x0c, 0x52, 0x7c, 0x7d, 0xae,
- 0xac, 0x28, 0x6a, 0x4d, 0x89, 0x11, 0xb8, 0xef, 0x7c, 0x63, 0x79, 0x40,
- 0x78, 0x33, 0x18, 0x09, 0xc9, 0x58, 0x4e, 0x79, 0x7b, 0x3d, 0x75, 0x9a,
- 0xb3, 0x67, 0xa9, 0xaf, 0x35, 0x32, 0x93, 0x6c, 0x46, 0x25, 0xbc, 0x1d,
- 0xbd, 0xbc, 0xa5, 0xcb, 0x91, 0xdb, 0x06, 0x68, 0x54, 0x8d, 0x62, 0xae,
- 0xbe, 0x49, 0x86, 0xdd, 0x22, 0x5c, 0x1d, 0x43, 0x16, 0x11, 0x50, 0x8e,
- 0x3d, 0x4d, 0x6e, 0xca, 0x32, 0x7a, 0x71, 0xbb, 0x3b, 0x04, 0x4a, 0x0d,
- 0x32, 0x77, 0x57, 0x68, 0x10, 0x96, 0xe6, 0xc4, 0x05, 0x22, 0x03, 0xc4,
- 0xb1, 0x25, 0x45, 0x12, 0x7d, 0xd0, 0x63, 0x24, 0x6b, 0xdf, 0x6e, 0xdc,
- 0xa1, 0xe0, 0x6e, 0x8e, 0xc1, 0x1c, 0xf8, 0x77, 0x9d, 0xfb, 0xb8, 0x69,
- 0xe5, 0x78, 0xfa, 0x93, 0x12, 0xbd, 0xec, 0x18, 0x11, 0xe7, 0x70, 0x92,
- 0xd8, 0x37, 0x30, 0x9c, 0x8a, 0x76, 0x58, 0x03, 0xfd, 0xcc, 0x1b, 0x08,
- 0x90, 0x3f, 0xee, 0xef, 0xae, 0x12, 0xf2, 0xac, 0xc8, 0x6a, 0xd9, 0x04,
- 0x3a, 0x8e, 0xd6, 0x40, 0xe7, 0x8b, 0xd0, 0xe5, 0xc7, 0xd2, 0x05, 0xb2,
- 0x5c, 0x24, 0x28, 0xcc, 0x41, 0x65, 0x5d, 0x56, 0xcc, 0xff, 0xf0, 0x9f,
- 0x51, 0xcd, 0xc7, 0xc9, 0xaf, 0x0b, 0x6f, 0x8d, 0xa9, 0xa5, 0x68, 0xbd,
- 0x06, 0x96, 0x25, 0x9e, 0xbb, 0xc4, 0xd3, 0xda, 0x9d, 0xde, 0x00, 0xeb,
- 0x1e, 0xc2, 0x8e, 0xd1, 0x08, 0x79, 0x28, 0x92, 0x8d, 0x5d, 0x3b, 0x5f,
- 0x44, 0x04, 0x96, 0x3d, 0x04, 0x82, 0xf9, 0xa5, 0x5b, 0xca, 0xc2, 0x76,
- 0x35, 0xf6, 0x1c, 0x6e, 0x5a, 0x4f, 0x96, 0xb2, 0x49, 0x9e, 0x0a, 0x80,
- 0x14, 0x73, 0x42, 0xdf, 0x6a, 0x5f, 0x8d, 0xc0, 0xa6, 0x0d, 0xa2, 0x3e,
- 0x7f, 0xad, 0x69, 0x18, 0x26, 0xf8, 0xc1, 0x9a, 0x72, 0x3c, 0xb5, 0x3d,
- 0x7e, 0xbd, 0x97, 0x6c, 0x91, 0x5c, 0xdd, 0x56, 0xed, 0x35, 0x8c, 0xf7,
- 0xbb, 0x4a, 0xb9, 0x10, 0xc0, 0x69, 0x1d, 0x80, 0x79, 0xa1, 0xbf, 0x26,
- 0xc6, 0xd0, 0xab, 0x8c, 0x0a, 0xb0, 0x9c, 0xa5, 0x15, 0xc9, 0x76, 0xf3,
- 0xc9, 0xab, 0xe5, 0x2c, 0x66, 0xea, 0xe0, 0x6c, 0xdb, 0x02, 0x63, 0x79,
- 0x5d, 0x2f, 0x95, 0xe6, 0xd7, 0xa5, 0xc3, 0x0b, 0x3d, 0xd2, 0xcc, 0xf4,
- 0x08, 0x5c, 0xbd, 0x33, 0x2e, 0xc2, 0x12, 0xdd, 0xbb, 0x70, 0x10, 0x73,
- 0x55, 0x4e, 0x51, 0x31, 0xd9, 0x92, 0xe2, 0xbe, 0x55, 0xd9, 0x35, 0x75,
- 0x49, 0x76, 0xf8, 0x02, 0x25, 0x91, 0x48, 0x91, 0xa2, 0xeb, 0xaa, 0xd3,
- 0x5c, 0xef, 0xec, 0xfc, 0xf2, 0xe4, 0xec, 0xdd, 0x28, 0xf9, 0x37, 0x2f,
- 0x91, 0x65, 0xf0, 0x43, 0xdf, 0xcd, 0x79, 0xf2, 0x52, 0xbc, 0x09, 0xab,
- 0xec, 0x5f, 0x4f, 0x47, 0x9f, 0x98, 0xfb, 0xd9, 0x08, 0x50, 0x7d, 0x53,
- 0x48, 0x66, 0x64, 0x31, 0x3a, 0xbc, 0x38, 0x81, 0x3e, 0xec, 0xa7, 0x9f,
- 0xfa, 0x76, 0x32, 0x4b, 0x73, 0x67, 0x96, 0x74, 0x5a, 0x5f, 0x21, 0x63,
- 0x21, 0xdb, 0x9c, 0x7d, 0x62, 0x81, 0x28, 0xf2, 0x96, 0x2b, 0x0d, 0x8e,
- 0x07, 0xb7, 0xa4, 0x16, 0x2e, 0xab, 0x52, 0x75, 0x88, 0x16, 0xfc, 0xfa,
- 0xf8, 0x72, 0x7b, 0x98, 0x5c, 0x68, 0xae, 0xb6, 0xe2, 0x4f, 0xad, 0x62,
- 0x93, 0x5a, 0xdd, 0x4b, 0xa8, 0x29, 0xc5, 0x53, 0x61, 0xf4, 0xe3, 0x59,
- 0x5a, 0x44, 0x93, 0xac, 0x48, 0x67, 0xa5, 0x12, 0xbd, 0x24, 0x69, 0x55,
- 0xe6, 0xaa, 0x8f, 0xc4, 0x23, 0x42, 0x67, 0x8a, 0x88, 0xf3, 0xf7, 0x97,
- 0x68, 0xf0, 0xf5, 0xf1, 0xe9, 0xf1, 0xe5, 0x71, 0xd7, 0x3a, 0x1f, 0x33,
- 0xad, 0x16, 0xb2, 0x6b, 0x9a, 0x6c, 0x72, 0x53, 0x94, 0xb3, 0xf2, 0x3a,
- 0x97, 0x22, 0x65, 0xc9, 0xf7, 0xd9, 0xf8, 0xf5, 0xe1, 0x77, 0xa4, 0x31,
- 0x90, 0x5f, 0xe9, 0xfc, 0xe2, 0xec, 0xfc, 0xcd, 0xc9, 0xbb, 0xd7, 0xfd,
- 0xe4, 0xe8, 0xec, 0xfc, 0x2f, 0xfd, 0xe4, 0xed, 0xd9, 0x77, 0xc7, 0x11,
- 0x54, 0x35, 0xf1, 0xd2, 0x46, 0x8a, 0x24, 0x4b, 0xb1, 0x20, 0xbe, 0xb0,
- 0xd8, 0xbc, 0x46, 0x6d, 0xd2, 0xce, 0x45, 0x41, 0x69, 0x07, 0x75, 0x29,
- 0x12, 0xd5, 0xcc, 0x5d, 0x3f, 0xf9, 0xe6, 0xf8, 0xf0, 0x75, 0x3f, 0x20,
- 0x25, 0x1d, 0xf1, 0xa8, 0x68, 0x74, 0x76, 0xc8, 0xa0, 0xb2, 0x64, 0xfb,
- 0x02, 0x5a, 0x00, 0x87, 0xb2, 0xf8, 0x48, 0x9a, 0x13, 0x88, 0xba, 0x2e,
- 0xd3, 0x55, 0x08, 0x09, 0xa1, 0xc0, 0x5d, 0x59, 0x16, 0xb0, 0x95, 0xe9,
- 0x01, 0x85, 0x4c, 0x55, 0xe9, 0x36, 0x77, 0x04, 0xf0, 0xfc, 0x36, 0x9d,
- 0x4f, 0x97, 0x3c, 0xce, 0x5d, 0xd0, 0x6f, 0x95, 0x97, 0x81, 0xc0, 0x61,
- 0x17, 0x63, 0x2a, 0x55, 0x95, 0x40, 0x3f, 0x4f, 0x20, 0x9f, 0x11, 0x53,
- 0x77, 0x2a, 0x65, 0x5d, 0xa4, 0x28, 0xbb, 0xaf, 0x08, 0x94, 0x4a, 0x91,
- 0x2a, 0x34, 0x12, 0x34, 0x85, 0xee, 0x9b, 0x52, 0x26, 0xe0, 0x07, 0xfe,
- 0x71, 0x04, 0x57, 0xcd, 0x65, 0x4e, 0xae, 0xcc, 0xe6, 0xcc, 0x18, 0x3d,
- 0x85, 0x75, 0x72, 0xe6, 0x7f, 0x32, 0x38, 0x51, 0xe7, 0xc3, 0x3a, 0x35,
- 0x4a, 0x0e, 0x8c, 0x38, 0x60, 0x40, 0x5b, 0xa1, 0x8e, 0xa9, 0xb6, 0x9c,
- 0xb0, 0x90, 0x2d, 0x39, 0x7b, 0x57, 0x81, 0xec, 0x02, 0xdd, 0xa5, 0xae,
- 0x73, 0xdf, 0xd6, 0x81, 0x14, 0x67, 0xcd, 0x95, 0xe3, 0xf2, 0x63, 0x34,
- 0x6e, 0xdb, 0x6f, 0x15, 0x96, 0xfe, 0x66, 0xc7, 0xbf, 0x91, 0x26, 0x85,
- 0xb8, 0x3e, 0x29, 0xc4, 0x36, 0x60, 0x7b, 0xd9, 0x47, 0x00, 0xdb, 0xe2,
- 0x70, 0x9a, 0x56, 0x2c, 0x5d, 0x88, 0xd7, 0xb2, 0x75, 0x75, 0xae, 0x7c,
- 0x9f, 0xdd, 0x93, 0xdd, 0x4f, 0xce, 0x9b, 0x4e, 0x1a, 0x43, 0x9d, 0x0c,
- 0x84, 0x23, 0x74, 0x6e, 0xae, 0xba, 0xd0, 0x8f, 0xb4, 0xf5, 0x66, 0x85,
- 0x70, 0xf4, 0xfd, 0xb3, 0xb2, 0x18, 0x1e, 0xfa, 0xfb, 0xf4, 0xc4, 0x1c,
- 0x89, 0x48, 0x9a, 0xfe, 0xb4, 0x44, 0xc1, 0x43, 0x40, 0x0a, 0x72, 0xbd,
- 0x2e, 0xa8, 0xad, 0xf0, 0xc3, 0x54, 0x00, 0x34, 0xfa, 0x65, 0x54, 0x06,
- 0x7d, 0xe0, 0xd3, 0xc1, 0x9a, 0x5d, 0x1c, 0x5f, 0x5e, 0x0c, 0x93, 0x2d,
- 0x9f, 0x81, 0xee, 0xf9, 0x70, 0x37, 0x0c, 0xcf, 0x50, 0xf1, 0xd1, 0xed,
- 0xc4, 0xfb, 0xac, 0xfb, 0x2e, 0xea, 0x92, 0xae, 0xff, 0x6e, 0x88, 0x2b,
- 0xf6, 0x58, 0x27, 0x76, 0x63, 0xdf, 0xf3, 0x0b, 0x9c, 0xb6, 0x46, 0x49,
- 0xbf, 0x58, 0xf3, 0xb5, 0x6f, 0x8e, 0x4f, 0xcf, 0xc3, 0x51, 0x7e, 0x77,
- 0xf1, 0xe6, 0x2f, 0xed, 0x51, 0x3e, 0x79, 0x1a, 0xf9, 0xea, 0x6f, 0xe9,
- 0x3a, 0xcf, 0xea, 0x72, 0x66, 0x74, 0x12, 0x24, 0x8f, 0x20, 0x77, 0xe4,
- 0xc0, 0x5c, 0x02, 0x84, 0x3d, 0xff, 0x22, 0x64, 0x4e, 0x85, 0xf3, 0x85,
- 0x22, 0x59, 0x32, 0xc6, 0x44, 0x1e, 0x15, 0xa8, 0xa5, 0x67, 0x5f, 0x23,
- 0x47, 0x07, 0x49, 0x49, 0x14, 0x9a, 0x58, 0xa4, 0x79, 0xe0, 0x67, 0x7e,
- 0x6f, 0xf1, 0xd3, 0x2e, 0xa9, 0x0c, 0x72, 0x46, 0xec, 0xb2, 0x99, 0x3d,
- 0xa1, 0x5b, 0xf5, 0xb6, 0x54, 0x4d, 0x4b, 0x93, 0x95, 0xd1, 0x7b, 0xdb,
- 0x13, 0x5c, 0x77, 0xe4, 0xf2, 0x05, 0x57, 0x0b, 0x61, 0x8e, 0xec, 0x15,
- 0x5b, 0xe8, 0xb5, 0x21, 0x83, 0x9e, 0xda, 0xb7, 0x82, 0x7b, 0xd6, 0x26,
- 0x65, 0x1e, 0x49, 0xc4, 0x1c, 0xb6, 0x15, 0xee, 0x12, 0x94, 0xb7, 0xcb,
- 0x9a, 0xc9, 0x0e, 0x57, 0xaf, 0x0f, 0x2a, 0x10, 0xc4, 0xdc, 0x5a, 0x65,
- 0xd1, 0x81, 0xcb, 0xd2, 0xf5, 0xc0, 0xae, 0x65, 0x3f, 0xd7, 0xc6, 0xd5,
- 0x45, 0xf0, 0x14, 0x71, 0xea, 0x47, 0x24, 0xbc, 0xee, 0x97, 0x21, 0x70,
- 0x79, 0x2a, 0x4a, 0x5b, 0xdd, 0x5a, 0x6f, 0xbc, 0x30, 0xe4, 0xb2, 0xd6,
- 0xc8, 0x8b, 0x8b, 0x38, 0x4d, 0x58, 0x2a, 0xeb, 0x0e, 0xb2, 0x1c, 0xa8,
- 0x57, 0x2d, 0x8f, 0x8a, 0xfa, 0xdf, 0x74, 0xda, 0xa4, 0x1f, 0x5d, 0x0d,
- 0x9d, 0xd4, 0x67, 0x74, 0x82, 0xf9, 0x4c, 0xd5, 0x3c, 0x5f, 0xa0, 0xb2,
- 0x75, 0xbc, 0x40, 0x84, 0x68, 0xb5, 0xda, 0x30, 0x89, 0xf6, 0x36, 0x0d,
- 0x75, 0x7b, 0x40, 0xea, 0x5c, 0x1f, 0x3c, 0x0d, 0x03, 0x04, 0xf9, 0xe2,
- 0xf6, 0x29, 0x3c, 0x32, 0xcf, 0xfb, 0xfc, 0xaf, 0xe7, 0x2e, 0xf7, 0xc2,
- 0xb3, 0x3a, 0x58, 0x2f, 0x67, 0x35, 0xf6, 0xe4, 0x5c, 0xb3, 0x48, 0x87,
- 0xbf, 0x84, 0xe5, 0xc6, 0x99, 0x4e, 0xcc, 0x70, 0xc3, 0x3f, 0xc1, 0xc8,
- 0x05, 0xe3, 0x53, 0x06, 0x37, 0x35, 0x36, 0xde, 0x5a, 0x7e, 0xe4, 0xbd,
- 0xe1, 0x93, 0xf6, 0x01, 0x6d, 0xaa, 0x7b, 0xe4, 0x81, 0x18, 0xab, 0x3a,
- 0xb2, 0x17, 0x4e, 0xda, 0xf4, 0xc1, 0x76, 0xc7, 0x53, 0x4c, 0x8b, 0x7f,
- 0x6c, 0x0e, 0x98, 0xe2, 0x3e, 0x92, 0x63, 0xca, 0x54, 0xb9, 0x38, 0x7e,
- 0xf3, 0x7e, 0x74, 0xfc, 0x9a, 0xeb, 0x06, 0x74, 0x35, 0x42, 0x0a, 0x76,
- 0xe5, 0x88, 0x7d, 0x09, 0x9b, 0x7b, 0x53, 0x96, 0xbc, 0xe3, 0xa4, 0x2f,
- 0x41, 0x65, 0x17, 0x41, 0x86, 0x18, 0x8b, 0x26, 0x4c, 0x2e, 0xe0, 0xfb,
- 0x59, 0x5e, 0xfc, 0x05, 0x94, 0x07, 0x3c, 0xea, 0x69, 0x46, 0x05, 0x0f,
- 0x5e, 0x32, 0x88, 0x21, 0x10, 0x48, 0xae, 0x34, 0x42, 0x3d, 0xcb, 0xb2,
- 0x85, 0xa4, 0x90, 0xcd, 0xcb, 0x65, 0xc1, 0x0e, 0x2d, 0xb3, 0x32, 0xea,
- 0xc6, 0x61, 0xaf, 0x61, 0x82, 0x56, 0xd5, 0x14, 0x8a, 0x8e, 0x1c, 0x61,
- 0x3e, 0x32, 0xd8, 0x81, 0x1d, 0xce, 0xa6, 0x1e, 0x14, 0x3f, 0x98, 0x99,
- 0xad, 0xbc, 0xf1, 0x1d, 0xa0, 0x2b, 0x8a, 0x77, 0x50, 0xb9, 0x37, 0xa3,
- 0xf2, 0x72, 0x77, 0xd2, 0xd9, 0x75, 0x59, 0x99, 0x06, 0xe7, 0x36, 0xef,
- 0xad, 0x02, 0x68, 0xa5, 0xde, 0x6e, 0xcf, 0x6a, 0x98, 0x3f, 0xcc, 0x4a,
- 0x22, 0x22, 0x98, 0x19, 0x27, 0x03, 0xd3, 0xf6, 0xe7, 0x79, 0x02, 0x7a,
- 0x91, 0x62, 0x3b, 0x2c, 0xb2, 0x46, 0x92, 0xc2, 0x8b, 0xf9, 0xe0, 0x29,
- 0x0c, 0x36, 0xe2, 0xdf, 0xb3, 0xaa, 0xec, 0xda, 0xe1, 0xaa, 0x8f, 0xc5,
- 0x7a, 0xfe, 0xcf, 0xac, 0x90, 0xb1, 0xb7, 0x1f, 0x3b, 0x01, 0xf3, 0xf4,
- 0x13, 0xbc, 0x0b, 0x2b, 0xb7, 0x03, 0x63, 0xed, 0x68, 0x3a, 0xe8, 0x31,
- 0x00, 0x13, 0x88, 0x86, 0xbe, 0xb1, 0x55, 0x0f, 0x5b, 0x95, 0xdc, 0xdd,
- 0x6a, 0x8b, 0xfb, 0x21, 0x00, 0xf1, 0xf0, 0xc2, 0xd8, 0x5e, 0xc3, 0xc5,
- 0x93, 0xd2, 0x30, 0x49, 0x31, 0xdf, 0xe2, 0x3a, 0x00, 0xf8, 0xde, 0x36,
- 0xfd, 0x78, 0x56, 0x52, 0x80, 0xa9, 0xb6, 0x6e, 0x8b, 0x48, 0xf9, 0x4e,
- 0xd2, 0xfd, 0x2a, 0xda, 0x88, 0x00, 0x50, 0x59, 0xdc, 0x04, 0x28, 0xcd,
- 0x91, 0x11, 0x94, 0x4f, 0xc4, 0x59, 0xad, 0x15, 0x2f, 0x30, 0x0e, 0x7e,
- 0x33, 0x10, 0x24, 0xdc, 0x8e, 0x14, 0xd9, 0xa5, 0x26, 0xfa, 0x6d, 0xf2,
- 0x3e, 0xe9, 0x36, 0xf2, 0xed, 0x80, 0xcb, 0xbf, 0x81, 0xb7, 0x97, 0xf3,
- 0xad, 0x23, 0x46, 0x6f, 0x5f, 0x69, 0xd4, 0x91, 0xbf, 0x42, 0xc3, 0x81,
- 0xf9, 0x90, 0x16, 0x7e, 0x5f, 0xb1, 0x00, 0xa6, 0x8d, 0xbc, 0x9c, 0x22,
- 0xf3, 0x85, 0xe9, 0xd8, 0xc3, 0x92, 0x52, 0x4c, 0x58, 0xa1, 0x9d, 0xd9,
- 0x44, 0xde, 0xdf, 0xa7, 0x7c, 0xbe, 0xa4, 0xd2, 0x98, 0x39, 0xf9, 0xb4,
- 0x58, 0xb3, 0x9e, 0x93, 0x84, 0xd6, 0x85, 0x05, 0x40, 0x8c, 0x01, 0x35,
- 0xdd, 0xbd, 0x6f, 0x23, 0x86, 0xd8, 0xb6, 0x0d, 0x63, 0x36, 0xe8, 0x1d,
- 0xe6, 0x71, 0xc6, 0x42, 0xfd, 0x1f, 0xdf, 0xa1, 0xc9, 0x4b, 0x73, 0x61,
- 0x7f, 0x11, 0x76, 0x22, 0xf5, 0x24, 0x07, 0x0b, 0x0e, 0xec, 0x4c, 0x02,
- 0xaa, 0x66, 0x53, 0xcf, 0x3c, 0xe0, 0xed, 0x06, 0xc7, 0x8c, 0xac, 0xd2,
- 0x6a, 0x19, 0xd5, 0xf7, 0xfc, 0xba, 0xb2, 0xe7, 0x69, 0xa8, 0xce, 0x75,
- 0xc7, 0xd7, 0x92, 0x6c, 0xfc, 0x6b, 0x2e, 0xf0, 0xb9, 0x5c, 0x04, 0xb5,
- 0x01, 0xac, 0xa4, 0xb0, 0xda, 0x86, 0xf9, 0xfc, 0xae, 0xe0, 0x19, 0xc4,
- 0x68, 0x21, 0x67, 0xa7, 0xcc, 0xb1, 0xfa, 0x27, 0x94, 0xd5, 0x37, 0x2e,
- 0xf2, 0xb6, 0xc9, 0x55, 0x12, 0x5c, 0x23, 0x9c, 0x90, 0xcf, 0x34, 0x2c,
- 0x07, 0x34, 0x29, 0xbc, 0x7c, 0x7d, 0xcd, 0xb6, 0x7a, 0xfa, 0xe9, 0x53,
- 0x78, 0x59, 0x3a, 0x3b, 0x87, 0xab, 0xcf, 0xb2, 0x11, 0xf4, 0xec, 0x53,
- 0xc7, 0x08, 0x1a, 0x46, 0x6b, 0xc4, 0x6a, 0xda, 0x65, 0x3a, 0x2e, 0x39,
- 0x72, 0xc2, 0x33, 0x95, 0x7a, 0xb3, 0xa8, 0xbe, 0x5f, 0x11, 0x0a, 0x77,
- 0x29, 0xcd, 0x6a, 0x98, 0x7a, 0x23, 0x28, 0x3a, 0x5b, 0xee, 0xdb, 0x45,
- 0xb7, 0xcc, 0x9f, 0xcd, 0x8d, 0x51, 0xea, 0x68, 0x16, 0x75, 0x92, 0xb4,
- 0xd1, 0x69, 0xb9, 0xe4, 0xf0, 0x53, 0x16, 0xc4, 0x33, 0x72, 0x9e, 0x76,
- 0x3a, 0x4d, 0xe6, 0xb6, 0xca, 0x51, 0x8d, 0x98, 0x8f, 0x74, 0x9d, 0xec,
- 0x99, 0xf9, 0xcf, 0x8b, 0x25, 0x21, 0xe9, 0x3c, 0xd2, 0x3f, 0xdd, 0x9a,
- 0xd1, 0x69, 0x27, 0x11, 0x6f, 0x6f, 0x14, 0x11, 0x03, 0xb5, 0x17, 0xd5,
- 0xe1, 0x03, 0x82, 0xc2, 0x17, 0x62, 0xae, 0xfb, 0x17, 0x6c, 0x4c, 0x1b,
- 0xd4, 0xd8, 0x99, 0xc4, 0x40, 0xb3, 0x4f, 0x66, 0xb2, 0x99, 0x56, 0x3d,
- 0xb1, 0xf7, 0x82, 0xbb, 0xcd, 0x04, 0xdb, 0xc9, 0x74, 0xc0, 0x11, 0xc4,
- 0x46, 0x4b, 0x7e, 0xdb, 0x2a, 0x0e, 0x10, 0x71, 0x65, 0x23, 0x67, 0x91,
- 0xb3, 0x78, 0x25, 0xc8, 0xf7, 0xdf, 0xe0, 0x4c, 0xd7, 0x69, 0x3d, 0x1b,
- 0xe4, 0x5d, 0x31, 0x7e, 0x0c, 0x14, 0x98, 0xc5, 0x70, 0xd8, 0x5d, 0x68,
- 0x9a, 0x18, 0x1d, 0x8e, 0x4e, 0x3b, 0xe4, 0x41, 0x6b, 0x49, 0x0c, 0xf7,
- 0xda, 0x1a, 0xcf, 0x6f, 0xc0, 0x53, 0xa6, 0x31, 0x11, 0xba, 0x47, 0x18,
- 0xe5, 0x40, 0x30, 0x5c, 0x30, 0xdf, 0xad, 0x2a, 0xc4, 0x52, 0x1f, 0xf0,
- 0xd7, 0x1d, 0xa1, 0x5b, 0xd8, 0x19, 0x26, 0xc2, 0x21, 0x70, 0x05, 0x17,
- 0xcc, 0x49, 0x22, 0x6c, 0x2a, 0x78, 0x62, 0x47, 0xa0, 0x1b, 0x0f, 0xc5,
- 0x3f, 0x99, 0xfa, 0x4c, 0x47, 0x3e, 0xa2, 0x4b, 0x80, 0xca, 0x3e, 0x0d,
- 0x62, 0xac, 0x2f, 0x16, 0xce, 0x25, 0xaa, 0x64, 0x8d, 0xa7, 0x09, 0xc6,
- 0xd1, 0xc8, 0x8d, 0x65, 0x45, 0x15, 0xb5, 0xe1, 0xd0, 0x10, 0x44, 0x23,
- 0x1a, 0x92, 0x8e, 0x72, 0x90, 0xec, 0x8a, 0x8b, 0xf6, 0x68, 0x0f, 0xbc,
- 0x36, 0xbb, 0x02, 0x12, 0x3f, 0x64, 0x18, 0xd8, 0xdf, 0x96, 0x39, 0x29,
- 0x13, 0x94, 0x33, 0x33, 0x4c, 0x5e, 0x33, 0xa2, 0x47, 0x8a, 0xdf, 0x70,
- 0x25, 0x2c, 0x94, 0xcb, 0xa2, 0x47, 0x6d, 0x07, 0x82, 0xd8, 0x85, 0xe9,
- 0x10, 0x9d, 0xc3, 0xb7, 0xe8, 0xf4, 0x11, 0x75, 0x7a, 0x6e, 0x0e, 0x3a,
- 0x08, 0x4b, 0x24, 0x99, 0x0d, 0x18, 0x0e, 0x89, 0xf5, 0x2a, 0x02, 0x9b,
- 0x8f, 0x64, 0x5a, 0x7f, 0x0c, 0xcd, 0xc0, 0x7e, 0xab, 0xde, 0x01, 0xcc,
- 0x22, 0x31, 0x02, 0x1a, 0x2a, 0x97, 0x51, 0xa4, 0xb3, 0x1d, 0x2e, 0x78,
- 0x6f, 0xe4, 0xcc, 0x8c, 0x3a, 0x49, 0x4d, 0x69, 0x6d, 0x97, 0xee, 0xdc,
- 0x34, 0x31, 0x6e, 0x91, 0x60, 0x81, 0x38, 0xec, 0x1a, 0x06, 0xe7, 0xac,
- 0xee, 0xda, 0xb8, 0x6a, 0x34, 0x21, 0x87, 0x8c, 0x3f, 0x55, 0x64, 0x1e,
- 0xf2, 0x88, 0x31, 0x91, 0xad, 0x75, 0x5b, 0x97, 0xea, 0x7e, 0x4b, 0x1d,
- 0x32, 0x1b, 0x6d, 0x5c, 0xd6, 0x4a, 0x40, 0x68, 0x06, 0x69, 0x5e, 0x6f,
- 0x9d, 0x27, 0x30, 0x36, 0x3d, 0x48, 0x8a, 0x11, 0xa9, 0xda, 0xf8, 0xf4,
- 0x41, 0x36, 0x0c, 0x7e, 0x23, 0xac, 0x4d, 0xf8, 0x8b, 0xf9, 0x30, 0xdc,
- 0x81, 0x76, 0x74, 0x3f, 0x64, 0x43, 0x5a, 0xc8, 0x9a, 0x20, 0x51, 0x5a,
- 0xd4, 0x10, 0xb0, 0xdb, 0x28, 0x28, 0x18, 0xa9, 0x45, 0x63, 0xb6, 0xd3,
- 0x52, 0x72, 0xdc, 0x27, 0x33, 0x23, 0xeb, 0x23, 0xb6, 0xa6, 0xd6, 0x21,
- 0x22, 0xd6, 0xa8, 0x7e, 0x57, 0x9c, 0xd6, 0x4b, 0xd2, 0x3d, 0x66, 0x4b,
- 0xfa, 0x36, 0x13, 0x2e, 0x59, 0xc2, 0x1f, 0x4d, 0xcd, 0x8d, 0x92, 0x64,
- 0x59, 0x5a, 0x0d, 0x3a, 0xa3, 0x1e, 0x5f, 0xd8, 0x52, 0xab, 0x96, 0x29,
- 0x95, 0x56, 0x97, 0x73, 0x6a, 0xb8, 0xa2, 0x77, 0x64, 0x10, 0xf6, 0xfd,
- 0x4a, 0x9c, 0x7e, 0xac, 0x98, 0xd2, 0x10, 0xb4, 0x3b, 0xed, 0xea, 0x96,
- 0x31, 0x12, 0x24, 0x76, 0x48, 0xf0, 0x25, 0xe3, 0xf7, 0x4d, 0x6f, 0x0f,
- 0xcd, 0x58, 0x05, 0x38, 0xb8, 0x55, 0xdc, 0xf2, 0xa4, 0xeb, 0xfe, 0x7c,
- 0x5c, 0xf9, 0xcd, 0x95, 0x05, 0x37, 0x43, 0x7e, 0x8c, 0x58, 0x01, 0x4e,
- 0xdf, 0xdf, 0x6b, 0x0e, 0x84, 0xdf, 0xa3, 0x7f, 0xe6, 0x7d, 0xf8, 0xac,
- 0x5d, 0x96, 0x42, 0x18, 0xd0, 0x7e, 0xd5, 0x81, 0x4a, 0x1f, 0x77, 0xa2,
- 0x56, 0xe0, 0xc1, 0xff, 0xef, 0x3c, 0x51, 0xe9, 0xe3, 0x8e, 0x54, 0xda,
- 0x3a, 0x53, 0x2b, 0x4a, 0xa6, 0xae, 0xec, 0xf1, 0x6f, 0x78, 0xca, 0x6c,
- 0xd0, 0xfc, 0xb1, 0x67, 0x2c, 0x71, 0x75, 0x6d, 0xff, 0x2f, 0x3e, 0x65,
- 0x9f, 0x77, 0xb4, 0x40, 0xd0, 0x09, 0xae, 0xa9, 0xfe, 0xe2, 0xc3, 0x0a,
- 0x08, 0xc4, 0x4b, 0xba, 0xd6, 0x8e, 0x65, 0xfe, 0x8a, 0x97, 0x80, 0x61,
- 0x0a, 0x99, 0x48, 0x9c, 0x9b, 0xe1, 0x64, 0x98, 0x90, 0x67, 0x76, 0x39,
- 0x34, 0x37, 0x76, 0x6d, 0xcb, 0x81, 0x8d, 0x6e, 0xf9, 0x37, 0xbd, 0x92,
- 0xe7, 0x43, 0x25, 0x9e, 0xb2, 0xe3, 0xba, 0x36, 0x77, 0xfb, 0x22, 0x67,
- 0x15, 0xc1, 0x68, 0x2f, 0x94, 0xc6, 0xf8, 0xf5, 0x68, 0x34, 0x38, 0x3c,
- 0x3f, 0xe9, 0x9e, 0xbc, 0xf6, 0xe7, 0xb4, 0x02, 0xee, 0xb3, 0x95, 0xc5,
- 0x60, 0x7c, 0x5f, 0xe2, 0xb3, 0xe8, 0x9c, 0xf2, 0xb7, 0x8d, 0xa6, 0xdb,
- 0x9d, 0xd8, 0xc3, 0x3a, 0x69, 0xa1, 0xe0, 0xa4, 0x47, 0x3e, 0x91, 0xaf,
- 0x10, 0x50, 0x72, 0x2a, 0x1b, 0xe7, 0x55, 0x93, 0xdc, 0xc2, 0x03, 0x01,
- 0x66, 0x10, 0x34, 0x11, 0x44, 0xf2, 0xb0, 0xf7, 0xe2, 0xf9, 0x9e, 0x39,
- 0x17, 0xf7, 0xcc, 0x93, 0x26, 0x2f, 0x3f, 0x1d, 0x3e, 0xd9, 0xa1, 0x32,
- 0xe4, 0x79, 0xa3, 0xee, 0x7e, 0x98, 0x75, 0xd2, 0xbc, 0x91, 0x77, 0x91,
- 0x98, 0x3a, 0x5f, 0x63, 0xef, 0x8e, 0x8f, 0x12, 0x86, 0x56, 0x81, 0x39,
- 0x2b, 0x41, 0xa6, 0x07, 0x65, 0x8d, 0x48, 0x02, 0x30, 0x42, 0xbf, 0x24,
- 0x4c, 0x65, 0x11, 0x79, 0xbb, 0x06, 0xe6, 0x58, 0x30, 0x1d, 0x6a, 0x4c,
- 0x20, 0x7b, 0xba, 0xb0, 0x1d, 0x21, 0x81, 0xc7, 0x76, 0x85, 0xcc, 0x0b,
- 0xf5, 0x31, 0xcc, 0x92, 0xf0, 0xa6, 0xe4, 0x91, 0xcc, 0xc7, 0x54, 0x00,
- 0x71, 0xf5, 0xfa, 0xa8, 0x01, 0xb3, 0xc2, 0x04, 0x72, 0xee, 0xc9, 0xc0,
- 0xd2, 0x11, 0x91, 0xa8, 0xb0, 0x30, 0xf2, 0xb2, 0x4c, 0xe6, 0xd6, 0x28,
- 0xb9, 0xfa, 0xdb, 0x34, 0xee, 0xdd, 0x5f, 0x67, 0x51, 0x45, 0x54, 0x62,
- 0xcf, 0x70, 0xd2, 0xae, 0x8b, 0x28, 0x13, 0x6b, 0x69, 0xd5, 0x80, 0xc4,
- 0x48, 0xea, 0xfa, 0x02, 0x78, 0x0b, 0xd0, 0x71, 0x66, 0x1b, 0xca, 0x6b,
- 0xca, 0xb6, 0x1f, 0xf9, 0x99, 0xb6, 0x1e, 0x01, 0xcf, 0xd3, 0xc7, 0xb8,
- 0xad, 0x2a, 0x4b, 0x67, 0xd2, 0x2b, 0xef, 0x3b, 0xe1, 0x2f, 0x11, 0xbd,
- 0x23, 0x71, 0x5b, 0x87, 0xa0, 0x21, 0xc7, 0xa6, 0xa9, 0x5d, 0xb0, 0x10,
- 0x83, 0x79, 0xda, 0x4c, 0x94, 0x54, 0xcd, 0x5c, 0x28, 0xf9, 0x22, 0x9d,
- 0x25, 0x8f, 0xc0, 0xbe, 0xae, 0x5e, 0xfc, 0x07, 0xea, 0x5d, 0xa1, 0xf7,
- 0x7a, 0x3a, 0xd7, 0x88, 0x3a, 0x65, 0x2e, 0x89, 0x55, 0xe7, 0x6e, 0xcb,
- 0xb9, 0x15, 0x8d, 0x11, 0x16, 0x53, 0xe4, 0x99, 0x27, 0xce, 0xba, 0xa1,
- 0x5f, 0xc2, 0x49, 0xa8, 0x8f, 0x69, 0x52, 0xce, 0x17, 0x88, 0x17, 0xe0,
- 0xa2, 0xd3, 0x66, 0x25, 0x35, 0x6b, 0x5b, 0xea, 0x90, 0xaf, 0x15, 0xef,
- 0x5c, 0x4e, 0x75, 0xf2, 0x08, 0xd9, 0xfb, 0x5b, 0x08, 0x43, 0x52, 0xe2,
- 0xd8, 0xd3, 0xf0, 0xcb, 0xd5, 0x39, 0x99, 0xc2, 0x64, 0x0b, 0x81, 0x4c,
- 0x49, 0xb2, 0x51, 0xba, 0x3e, 0x8d, 0x27, 0x47, 0xfc, 0x54, 0x08, 0x8c,
- 0x61, 0x83, 0x6c, 0x0f, 0x1f, 0xc5, 0xaf, 0xda, 0x51, 0xfd, 0x42, 0x96,
- 0x97, 0xff, 0x1b, 0x14, 0xc1, 0x67, 0x89, 0x5d, 0xab, 0xc7, 0x28, 0x84,
- 0x4c, 0x45, 0xcc, 0x75, 0xfb, 0x02, 0x96, 0x1d, 0x67, 0x74, 0xfd, 0x3f,
- 0x7d, 0xf0, 0xff, 0x4b, 0xfa, 0xe0, 0x3f, 0x72, 0x4a, 0xa9, 0xc8, 0x2b,
- 0x74, 0x08, 0xff, 0x64, 0xfa, 0x87, 0x31, 0x06, 0x88, 0x9d, 0xdd, 0x0f,
- 0x5d, 0x1a, 0xd4, 0x2f, 0x38, 0xa2, 0xe1, 0x56, 0xf8, 0xbf, 0xe3, 0x88,
- 0x3e, 0xea, 0x64, 0xfe, 0x3f, 0xef, 0xc7, 0x7f, 0xb7, 0x73, 0xb8, 0x06,
- 0xeb, 0xb1, 0x65, 0xb6, 0xd9, 0x1d, 0x51, 0xfd, 0x73, 0xb9, 0x0d, 0xd8,
- 0xda, 0xdb, 0x4e, 0xf5, 0xa1, 0x84, 0x11, 0x9e, 0xba, 0x93, 0xf3, 0xef,
- 0x9e, 0xf7, 0x29, 0x82, 0x35, 0xea, 0x46, 0x2d, 0xab, 0xe4, 0xf4, 0xf5,
- 0xe1, 0xf9, 0x2f, 0x38, 0xed, 0x7f, 0x81, 0xa3, 0x75, 0x91, 0x65, 0xd3,
- 0x01, 0x47, 0x48, 0x5e, 0xe2, 0x1f, 0xd1, 0x98, 0xa2, 0x66, 0x81, 0x63,
- 0xdb, 0x52, 0xe0, 0x24, 0x0c, 0xd6, 0xe2, 0x65, 0xa3, 0xa6, 0x14, 0xc2,
- 0xcb, 0xb0, 0x40, 0xf9, 0xb2, 0xc0, 0xcb, 0x52, 0x16, 0xd3, 0x6d, 0x2d,
- 0x5a, 0x8e, 0x6f, 0x63, 0xab, 0x48, 0x90, 0x9d, 0x8e, 0xf7, 0x35, 0xb1,
- 0x37, 0x59, 0xfe, 0x3b, 0xef, 0x19, 0x86, 0xd5, 0x44, 0x11, 0x1f, 0xf7,
- 0x6e, 0x28, 0x1c, 0xdc, 0x61, 0x8e, 0xa5, 0x27, 0xbb, 0x5c, 0x9b, 0x1a,
- 0xc9, 0xb0, 0xbf, 0x63, 0x46, 0x78, 0xf7, 0xf3, 0xab, 0x30, 0x03, 0x6b,
- 0xa7, 0xd2, 0x5f, 0x89, 0xd6, 0x0c, 0x52, 0x2c, 0x70, 0xba, 0xac, 0xc2,
- 0x5a, 0x3c, 0xa9, 0x3f, 0x3b, 0x1c, 0x26, 0xe7, 0xfe, 0xda, 0x4f, 0xb4,
- 0xe7, 0xd2, 0x7c, 0xbe, 0x35, 0x9d, 0x11, 0xec, 0x78, 0xbf, 0x05, 0xc9,
- 0xf0, 0xbb, 0x64, 0x23, 0x82, 0x7b, 0x89, 0x3a, 0xf7, 0x81, 0x72, 0x12,
- 0xc4, 0x8a, 0xd9, 0x4d, 0xa1, 0xe9, 0xe7, 0x5e, 0x7f, 0xa8, 0x9e, 0x57,
- 0x59, 0x34, 0x15, 0x93, 0x09, 0x4b, 0xb0, 0xb4, 0x56, 0x96, 0xeb, 0xa5,
- 0x57, 0x13, 0x2d, 0xe5, 0xf2, 0xc4, 0x34, 0x6b, 0x21, 0xa5, 0x1f, 0x9f,
- 0xef, 0xac, 0x99, 0x0c, 0xed, 0xca, 0x82, 0x66, 0x8b, 0xca, 0x16, 0x1b,
- 0x15, 0x57, 0x2b, 0xbb, 0x99, 0x11, 0x56, 0xf7, 0x9a, 0xf0, 0x3d, 0x58,
- 0xe1, 0xad, 0xd0, 0x60, 0xff, 0x0a, 0x80, 0xf0, 0x6f, 0x08, 0x88, 0x5c,
- 0x5f, 0x81, 0x27, 0x4c, 0x72, 0x56, 0x87, 0x8c, 0x95, 0x0a, 0x29, 0xea,
- 0x07, 0xa3, 0x90, 0xa0, 0xf9, 0x5d, 0xde, 0xdc, 0x53, 0x9e, 0xfc, 0x9d,
- 0xc0, 0xb7, 0xbb, 0xf2, 0x7e, 0x74, 0xfa, 0x04, 0xd3, 0x7a, 0x79, 0x3a,
- 0xf2, 0xf9, 0xa6, 0xeb, 0x84, 0x8b, 0x65, 0x1b, 0xe1, 0xf3, 0xd5, 0xf1,
- 0xe1, 0xe8, 0x72, 0x18, 0x0c, 0xd1, 0x8c, 0x31, 0x44, 0x85, 0xd8, 0x24,
- 0x9b, 0x0c, 0xec, 0x3b, 0xb3, 0xf4, 0x9e, 0x48, 0xde, 0x24, 0xf1, 0x87,
- 0x3a, 0xc7, 0x7d, 0xd3, 0xd6, 0xc9, 0xce, 0x4d, 0x19, 0x97, 0xda, 0x64,
- 0x55, 0xc8, 0xcd, 0x64, 0xe6, 0x6e, 0x9c, 0xcf, 0x68, 0x04, 0xa6, 0x5f,
- 0xc6, 0x1a, 0x9a, 0x0b, 0xdc, 0x17, 0x59, 0xa4, 0xe5, 0x8c, 0xf0, 0x64,
- 0xf4, 0x99, 0xb6, 0x1f, 0x82, 0x38, 0x24, 0x25, 0xb5, 0x76, 0x75, 0xa2,
- 0x9c, 0xd1, 0x32, 0xca, 0x3a, 0x13, 0xa2, 0x2e, 0x6a, 0x43, 0xe7, 0x8a,
- 0xb3, 0x78, 0x2c, 0xce, 0x1e, 0xaf, 0x80, 0x66, 0x20, 0xcc, 0x42, 0x4a,
- 0xeb, 0x8f, 0x8a, 0xd5, 0x9e, 0x34, 0xa8, 0x24, 0x9f, 0xae, 0x2d, 0x6e,
- 0xb3, 0xdf, 0xb5, 0x84, 0xcc, 0x42, 0x23, 0x67, 0x93, 0xb0, 0xfd, 0x5d,
- 0xdb, 0xee, 0xfb, 0x9c, 0x58, 0x6f, 0xb7, 0xd7, 0xac, 0xb7, 0x8d, 0x90,
- 0x53, 0x71, 0x01, 0x4e, 0xbd, 0x00, 0xe2, 0xe5, 0xb6, 0x8c, 0xd7, 0xb2,
- 0x49, 0x26, 0x37, 0x99, 0xb9, 0x44, 0x86, 0x5e, 0xe6, 0xf1, 0xa3, 0x27,
- 0x64, 0x23, 0xa0, 0xa8, 0x8a, 0x4c, 0xcf, 0x2f, 0x9e, 0x90, 0xa7, 0x4f,
- 0xc3, 0x09, 0xa9, 0xb2, 0xbf, 0x4d, 0x63, 0xac, 0xbe, 0xc0, 0x4e, 0x03,
- 0xb8, 0xcd, 0x80, 0xe7, 0x0b, 0xa6, 0x26, 0xa6, 0xae, 0xee, 0x50, 0x0d,
- 0x10, 0x45, 0xa4, 0x3a, 0xc2, 0x27, 0xb2, 0xb0, 0x29, 0x04, 0x19, 0x16,
- 0x35, 0x6c, 0x24, 0x61, 0xd8, 0x3d, 0xab, 0x80, 0xa7, 0x6e, 0xba, 0xba,
- 0x30, 0x9b, 0xc8, 0x47, 0xd6, 0x6a, 0x90, 0x54, 0xba, 0x04, 0x95, 0x24,
- 0x28, 0x03, 0xca, 0x1e, 0x9e, 0xc1, 0xe0, 0xaa, 0x59, 0xd8, 0x81, 0xad,
- 0xdd, 0x1d, 0xbb, 0xc1, 0x64, 0x28, 0xa1, 0x31, 0xc6, 0xce, 0x83, 0x97,
- 0xd1, 0x27, 0x97, 0x90, 0x58, 0xec, 0x85, 0x5d, 0x33, 0x05, 0x01, 0xa4,
- 0x8c, 0x0a, 0x55, 0x30, 0x5a, 0x14, 0xe4, 0x3a, 0x52, 0x8c, 0xf0, 0xb1,
- 0x13, 0x11, 0x0a, 0x0f, 0x4c, 0x4b, 0x2b, 0x36, 0x6a, 0x07, 0x2c, 0x12,
- 0x5c, 0xe3, 0xa3, 0x32, 0x05, 0x9c, 0x1a, 0x04, 0x48, 0xee, 0x20, 0x64,
- 0xbf, 0x35, 0xd6, 0xfc, 0x6d, 0x36, 0x43, 0xb2, 0x4c, 0x56, 0x4c, 0xaa,
- 0xfb, 0x85, 0x4f, 0x43, 0x3d, 0xfd, 0x47, 0xe6, 0x5f, 0x31, 0xed, 0x52,
- 0x18, 0x73, 0xcf, 0x08, 0xbb, 0xed, 0x50, 0xff, 0xa2, 0xbc, 0x3d, 0x95,
- 0x6f, 0xec, 0x99, 0x02, 0xe2, 0x96, 0x63, 0xc4, 0x56, 0xff, 0x25, 0x6b,
- 0x46, 0xa5, 0x37, 0x13, 0xbd, 0x31, 0xb5, 0x56, 0x37, 0xee, 0xb1, 0x04,
- 0x71, 0x8f, 0x05, 0xf6, 0x3e, 0x7a, 0xed, 0xf7, 0xfb, 0x3c, 0x61, 0xb7,
- 0xfb, 0x01, 0xd8, 0x9f, 0x44, 0xc2, 0x1b, 0xf2, 0xd2, 0xb4, 0x1d, 0xf1,
- 0x74, 0x60, 0xb5, 0xa2, 0xcf, 0x3e, 0xbb, 0xa2, 0xac, 0x2f, 0xd4, 0xd5,
- 0xa9, 0x5f, 0x55, 0x30, 0x9d, 0xde, 0x76, 0x49, 0x66, 0x23, 0x23, 0x5c,
- 0x19, 0xbd, 0xa5, 0xbe, 0xa5, 0xf1, 0x32, 0x97, 0x14, 0x79, 0xba, 0x01,
- 0xcd, 0xd3, 0xb7, 0xfb, 0xab, 0x48, 0x95, 0x87, 0xf2, 0x6b, 0x24, 0x59,
- 0x4e, 0x89, 0xbf, 0xdf, 0x31, 0xbe, 0x25, 0xb6, 0xf8, 0x25, 0xc0, 0x8b,
- 0xe4, 0xa0, 0x7e, 0xbe, 0xf7, 0xd9, 0xf3, 0xed, 0x75, 0xd5, 0xfe, 0xa8,
- 0xdc, 0x05, 0xa5, 0x97, 0xf1, 0x26, 0xa2, 0x7f, 0xed, 0x0f, 0xfd, 0x09,
- 0xf2, 0x38, 0xf9, 0x25, 0xed, 0x32, 0xbc, 0xe3, 0xcc, 0x85, 0x43, 0x9b,
- 0x02, 0x13, 0xa1, 0xd4, 0xe5, 0xd8, 0x2e, 0x3c, 0x2e, 0xb2, 0x66, 0xe4,
- 0x9c, 0x63, 0x33, 0x77, 0xcd, 0xc2, 0xee, 0x30, 0xd9, 0x4c, 0x1c, 0x3c,
- 0xd1, 0x3e, 0xf0, 0xfd, 0xe9, 0x17, 0x40, 0xe3, 0xce, 0xe2, 0xef, 0xc3,
- 0xf6, 0xbf, 0xfc, 0x80, 0xa6, 0x6b, 0xe0, 0xd7, 0xac, 0xf2, 0x93, 0x7f,
- 0xc2, 0x2a, 0x3f, 0x59, 0xbf, 0xca, 0x4f, 0x1e, 0xbb, 0xca, 0x9f, 0x3d,
- 0x7b, 0xfe, 0xf9, 0xaf, 0x58, 0x65, 0x6f, 0x86, 0xff, 0x8f, 0xad, 0xb2,
- 0xb7, 0xd3, 0x7e, 0xdd, 0x2a, 0x0b, 0x30, 0x24, 0x10, 0xc4, 0x52, 0x2b,
- 0x82, 0x20, 0x7c, 0x94, 0xec, 0xcd, 0x10, 0x7e, 0x7e, 0xd6, 0xd2, 0xa7,
- 0xb6, 0x18, 0x75, 0x6d, 0x9d, 0x28, 0xd2, 0xc4, 0x22, 0x66, 0xb6, 0x4b,
- 0x3d, 0x87, 0x8e, 0xbb, 0x98, 0x51, 0xbd, 0xa1, 0xcd, 0xc1, 0xa6, 0x3a,
- 0x48, 0x34, 0xf5, 0x47, 0x99, 0x5b, 0xf8, 0x73, 0x66, 0xa9, 0xff, 0x89,
- 0xcc, 0x3f, 0x21, 0x6e, 0xc6, 0x43, 0x3e, 0xb5, 0x26, 0x6d, 0x45, 0xf9,
- 0x89, 0x68, 0x66, 0x37, 0x55, 0x3c, 0x69, 0x97, 0x3c, 0x61, 0x7c, 0x28,
- 0x93, 0x21, 0x41, 0x13, 0xee, 0x96, 0xf6, 0xc8, 0x6b, 0xe0, 0x92, 0x83,
- 0xdc, 0x32, 0xba, 0xeb, 0x04, 0xfc, 0xd4, 0xae, 0xab, 0xe1, 0x80, 0x76,
- 0xae, 0x88, 0x78, 0xc7, 0x62, 0x09, 0xac, 0x27, 0x02, 0x9c, 0x4a, 0xfd,
- 0x13, 0xbd, 0x39, 0xd8, 0x36, 0x7d, 0x4d, 0x83, 0x9e, 0x2e, 0xe7, 0x0b,
- 0xe5, 0xb1, 0xa2, 0xdc, 0x86, 0x9c, 0xcb, 0x03, 0x73, 0x96, 0x2b, 0x70,
- 0x97, 0x11, 0xff, 0x92, 0x75, 0xbf, 0x08, 0xee, 0x8b, 0x5d, 0x39, 0x5a,
- 0xba, 0xc3, 0x91, 0xdb, 0xf0, 0x18, 0x24, 0xe3, 0x06, 0xd9, 0x04, 0x45,
- 0x17, 0x16, 0xc9, 0xe9, 0x81, 0x94, 0x18, 0x34, 0xcd, 0xc6, 0xcb, 0x6b,
- 0x4d, 0x15, 0xb5, 0xa5, 0x92, 0xda, 0x8b, 0x85, 0xec, 0x0b, 0x22, 0x87,
- 0xc8, 0xfa, 0x0c, 0x84, 0xbd, 0x0f, 0xb3, 0xe2, 0x1b, 0x2a, 0x12, 0x36,
- 0x59, 0x87, 0x9b, 0x0a, 0x06, 0x8e, 0x3d, 0xd0, 0x1a, 0x39, 0x7e, 0xd2,
- 0x2a, 0x61, 0x13, 0xa9, 0xe9, 0xe2, 0x6f, 0x95, 0x66, 0xb2, 0x18, 0x5c,
- 0xa5, 0xc4, 0x2b, 0x17, 0xe4, 0x0a, 0x0a, 0x56, 0x52, 0x9c, 0x78, 0x97,
- 0x47, 0xe7, 0xc9, 0x9b, 0x54, 0x2a, 0x4a, 0x24, 0x5b, 0x46, 0x30, 0x7d,
- 0xf6, 0x74, 0xef, 0xc9, 0xf6, 0x5a, 0x05, 0xb5, 0xcd, 0x93, 0x82, 0x6f,
- 0x15, 0x65, 0x0c, 0xb3, 0x7a, 0xb9, 0xac, 0x90, 0x48, 0x8b, 0xe9, 0x37,
- 0x5f, 0xfa, 0xf0, 0xee, 0xec, 0xf5, 0xf1, 0xe9, 0xe1, 0x5f, 0x6c, 0x22,
- 0x30, 0x4d, 0x82, 0x26, 0x96, 0x7d, 0x30, 0x76, 0xdd, 0xfd, 0x07, 0x63,
- 0x2a, 0x9b, 0x5f, 0x6e, 0x3d, 0xd9, 0xa6, 0xac, 0x9d, 0xa0, 0xbc, 0xd8,
- 0x75, 0xd6, 0x4a, 0xa2, 0x16, 0x08, 0xf1, 0x1a, 0xa6, 0x0f, 0xeb, 0xb9,
- 0xdb, 0x1d, 0xee, 0x0b, 0x6b, 0xbc, 0xb0, 0x5e, 0xbb, 0xa3, 0xec, 0xf1,
- 0xd7, 0xa7, 0x42, 0x05, 0xa4, 0x49, 0xcb, 0xc1, 0xf6, 0xf8, 0xb4, 0x98,
- 0xe5, 0x93, 0x9c, 0xd4, 0xf8, 0xda, 0xec, 0x5a, 0xb3, 0x27, 0x72, 0x8a,
- 0x4f, 0x5f, 0xb5, 0x19, 0xc5, 0x90, 0x97, 0x45, 0xbf, 0x58, 0x1f, 0x6f,
- 0x6d, 0x8b, 0xc4, 0x06, 0x32, 0x34, 0x9b, 0x15, 0x59, 0x33, 0x90, 0x8e,
- 0xbd, 0x34, 0x7f, 0xbe, 0xba, 0x4d, 0x67, 0x41, 0xca, 0x1f, 0x55, 0xe7,
- 0xd2, 0x9d, 0x69, 0x71, 0x85, 0xf4, 0xa6, 0xc7, 0x98, 0x3f, 0xb2, 0xc4,
- 0xf1, 0xfa, 0xa4, 0x39, 0x2a, 0x01, 0x41, 0xfc, 0xe5, 0xe5, 0x5f, 0xce,
- 0x8f, 0x5f, 0xbd, 0x24, 0x54, 0xe2, 0x17, 0x84, 0x3b, 0xaf, 0x5b, 0x20,
- 0xc5, 0x84, 0x8a, 0xc7, 0x06, 0x63, 0xf8, 0xe1, 0xf5, 0xc9, 0xe8, 0xfc,
- 0xf4, 0xec, 0xe8, 0xd5, 0xcb, 0x1f, 0xc8, 0xdc, 0x32, 0x32, 0xf5, 0xde,
- 0x7b, 0xd7, 0xfe, 0xcc, 0x72, 0x60, 0x87, 0x79, 0xe2, 0xc7, 0xdf, 0x7f,
- 0x38, 0x7e, 0xf7, 0xdd, 0xab, 0x97, 0xb7, 0x69, 0xd5, 0xa7, 0xf1, 0xf1,
- 0xdb, 0x2b, 0x8a, 0xdf, 0xb5, 0xb6, 0x1a, 0xe9, 0xad, 0xe3, 0xd9, 0xc7,
- 0x3a, 0xff, 0x7b, 0x96, 0x98, 0xd7, 0x67, 0xcb, 0x90, 0x83, 0xf6, 0x92,
- 0x53, 0x6b, 0xcd, 0x64, 0xd0, 0xdf, 0x92, 0xaf, 0x4e, 0xbf, 0x25, 0x9e,
- 0x43, 0xeb, 0x40, 0x9c, 0x73, 0x69, 0x8d, 0xe4, 0x8b, 0x67, 0x7b, 0xfb,
- 0xdb, 0xae, 0x6e, 0x1c, 0x78, 0x52, 0x4d, 0x8f, 0x3f, 0x06, 0x39, 0x13,
- 0x7f, 0xcf, 0xbc, 0xe2, 0xf3, 0x52, 0xfb, 0xee, 0xbe, 0xc5, 0x5a, 0xa0,
- 0xbe, 0x18, 0xa4, 0x40, 0x33, 0xf7, 0x42, 0x49, 0xf2, 0x80, 0xe8, 0x62,
- 0x02, 0x57, 0xd4, 0xe5, 0x1b, 0x8f, 0xbb, 0xe0, 0x2b, 0xb7, 0xf5, 0x4c,
- 0x77, 0xc4, 0x9d, 0xb5, 0xf6, 0xda, 0xf8, 0x1d, 0x83, 0x1c, 0x5d, 0x5b,
- 0x0b, 0x93, 0x6d, 0x4c, 0x71, 0xd9, 0x3f, 0xf1, 0x79, 0xf6, 0xe0, 0x2f,
- 0xc8, 0xfe, 0x28, 0x99, 0x4f, 0x0b, 0xa3, 0xd4, 0x8d, 0xa7, 0x19, 0xa3,
- 0x0f, 0x38, 0xb7, 0xf2, 0x39, 0x25, 0x1c, 0x66, 0x75, 0xa2, 0x8e, 0x0f,
- 0xcf, 0xad, 0x31, 0xcb, 0xae, 0xd3, 0xc9, 0xbd, 0xe5, 0x07, 0x15, 0x6e,
- 0x8b, 0x48, 0x4a, 0x7b, 0x3a, 0x21, 0x2b, 0x67, 0x96, 0x4d, 0xaf, 0x21,
- 0x9e, 0x39, 0x37, 0xde, 0x1c, 0x57, 0xeb, 0x0d, 0xe1, 0xae, 0x59, 0x0e,
- 0x00, 0xbd, 0x2e, 0x57, 0xe7, 0xb7, 0xd8, 0x3a, 0x60, 0xed, 0xdd, 0x47,
- 0xdb, 0x06, 0x55, 0x2d, 0xd7, 0xce, 0xe9, 0xd3, 0xb6, 0x2b, 0xf9, 0xef,
- 0x38, 0xe4, 0x44, 0x9f, 0x02, 0x6f, 0xe5, 0x4b, 0xfa, 0x6b, 0x9c, 0x44,
- 0x19, 0x15, 0x58, 0x60, 0xcf, 0x73, 0xe1, 0x52, 0xc7, 0x39, 0x66, 0x89,
- 0xaf, 0xa4, 0x30, 0x01, 0x71, 0xf1, 0x36, 0xce, 0xcf, 0x1c, 0x27, 0x27,
- 0xb2, 0xde, 0x5e, 0xb3, 0x3d, 0xf9, 0xb2, 0xa2, 0x9d, 0xb1, 0xa2, 0x3d,
- 0x2f, 0x33, 0x2b, 0x8c, 0x5d, 0x70, 0x4a, 0x10, 0x45, 0xe9, 0x5f, 0x52,
- 0x5b, 0x24, 0x12, 0x49, 0x27, 0x31, 0x33, 0xf5, 0x85, 0x86, 0x43, 0x52,
- 0x9f, 0xde, 0x01, 0x0f, 0x31, 0x3d, 0x40, 0x1d, 0x66, 0x56, 0x33, 0xf0,
- 0x5b, 0x0d, 0x6a, 0x46, 0x2e, 0x50, 0xac, 0xc9, 0x72, 0x82, 0x9a, 0x6e,
- 0xd6, 0xaa, 0xac, 0x51, 0x0a, 0x14, 0xec, 0x57, 0xc7, 0x18, 0x18, 0xa1,
- 0xa6, 0xf0, 0x33, 0x76, 0x88, 0x3b, 0x46, 0x88, 0x3d, 0x30, 0x38, 0x25,
- 0xe5, 0x47, 0xa7, 0xb6, 0xe6, 0x34, 0x98, 0x6d, 0x66, 0x75, 0x8a, 0xb2,
- 0x79, 0x5b, 0xe5, 0xb2, 0x75, 0x4f, 0x99, 0x46, 0xe9, 0x7d, 0xb9, 0xa3,
- 0x70, 0x2b, 0x71, 0xce, 0x2d, 0x37, 0xeb, 0xcd, 0x48, 0x90, 0x11, 0xd2,
- 0x30, 0xc2, 0xbd, 0x7b, 0x49, 0x11, 0x27, 0xac, 0xe2, 0xca, 0xfd, 0x19,
- 0x55, 0x8a, 0x62, 0x94, 0x1b, 0xda, 0x1a, 0x6c, 0xdb, 0x54, 0xd9, 0xbc,
- 0xb1, 0x4a, 0x5b, 0x84, 0x47, 0xc1, 0xf2, 0xd6, 0xda, 0x22, 0x52, 0xec,
- 0x15, 0xd4, 0x1d, 0x22, 0x7b, 0x82, 0x3e, 0xb6, 0xc3, 0x79, 0x5f, 0x2a,
- 0x84, 0xf2, 0x48, 0xea, 0x69, 0xd0, 0x58, 0x91, 0xdd, 0xf9, 0x8d, 0x39,
- 0x85, 0xdc, 0x36, 0xf8, 0x7b, 0x3a, 0x82, 0x8d, 0x31, 0x41, 0x49, 0x2b,
- 0xc9, 0xcb, 0xef, 0x8e, 0x2f, 0x46, 0x27, 0x67, 0xef, 0xbe, 0x88, 0xda,
- 0x89, 0x89, 0xfc, 0x36, 0xb1, 0xe5, 0x7c, 0x34, 0xd3, 0xcd, 0x15, 0x54,
- 0x21, 0xef, 0x90, 0xba, 0x21, 0x92, 0x43, 0xca, 0xee, 0xa1, 0x07, 0xba,
- 0x5b, 0xa0, 0x96, 0x16, 0xe0, 0xfe, 0x4c, 0xab, 0x6b, 0xcc, 0x85, 0xd9,
- 0x8b, 0xb0, 0x69, 0x50, 0x2c, 0x53, 0x8d, 0x1d, 0xfb, 0xd7, 0xfd, 0x60,
- 0xfc, 0x71, 0xa8, 0x8a, 0x17, 0x29, 0x5e, 0x2e, 0x38, 0x13, 0x8a, 0x12,
- 0xd1, 0x99, 0xad, 0xc2, 0xef, 0x5d, 0xc0, 0xaa, 0x4d, 0xb5, 0x21, 0xfd,
- 0x17, 0xcd, 0xc3, 0xb7, 0x7b, 0x5e, 0xf6, 0x86, 0x7d, 0x6e, 0x2f, 0xf6,
- 0xdc, 0x5e, 0xf8, 0xdc, 0x7e, 0xec, 0xb9, 0xfd, 0xf0, 0xb9, 0x27, 0xb1,
- 0xe7, 0xbc, 0x04, 0x1d, 0xcf, 0x7c, 0xd5, 0x19, 0x5a, 0x67, 0x11, 0x7a,
- 0xeb, 0xd9, 0xaa, 0x22, 0xb8, 0xe1, 0x99, 0x70, 0x9e, 0x09, 0xab, 0x16,
- 0xec, 0x6a, 0x03, 0xd6, 0x87, 0xd8, 0x74, 0xfc, 0xa8, 0xe6, 0x43, 0x84,
- 0xd8, 0x21, 0x95, 0xc6, 0x08, 0x5e, 0xf3, 0xdf, 0x2f, 0xc2, 0xb4, 0xbb,
- 0x04, 0xd3, 0x1e, 0xd6, 0x1a, 0x27, 0x35, 0x28, 0xa1, 0xcc, 0x10, 0xae,
- 0x6f, 0xdb, 0x57, 0x83, 0x42, 0x0a, 0x69, 0xf1, 0x86, 0x5a, 0x79, 0x7d,
- 0xf4, 0x46, 0x17, 0xe7, 0xbd, 0xbe, 0x04, 0xf3, 0xcc, 0x07, 0x06, 0xe6,
- 0xdf, 0x09, 0x74, 0x6d, 0x62, 0x88, 0x7f, 0xf6, 0x54, 0x70, 0x37, 0x5e,
- 0x95, 0xfa, 0x88, 0x77, 0x19, 0xbf, 0xb4, 0xd8, 0x23, 0x2e, 0xb7, 0xe6,
- 0x8a, 0x39, 0x18, 0x35, 0xb8, 0x3d, 0x42, 0x46, 0x04, 0xf4, 0x1d, 0x6f,
- 0x68, 0xbc, 0x77, 0x1e, 0xa5, 0x11, 0x77, 0xf3, 0x81, 0x1c, 0xf8, 0xa7,
- 0x9d, 0x19, 0xd5, 0x0e, 0x45, 0xa6, 0xd2, 0x55, 0x57, 0x2f, 0x2b, 0xd6,
- 0x95, 0x94, 0xbe, 0x09, 0xd5, 0xa9, 0x3b, 0x53, 0x2c, 0xf4, 0x2a, 0xab,
- 0x53, 0x38, 0x34, 0x67, 0xdd, 0x1b, 0xe4, 0x50, 0xfd, 0xdd, 0xa2, 0x10,
- 0xb8, 0xf9, 0xf3, 0x48, 0x92, 0x1f, 0x1e, 0x90, 0x3f, 0x1e, 0xbc, 0x1d,
- 0xc5, 0x38, 0x62, 0x77, 0x28, 0x08, 0x2c, 0x79, 0xd4, 0xa0, 0x94, 0x1b,
- 0xe7, 0xd7, 0x0d, 0x49, 0x7c, 0x3a, 0xdd, 0x75, 0xa7, 0x91, 0x85, 0x56,
- 0xf5, 0xa3, 0x06, 0xda, 0x1a, 0x29, 0x9d, 0xcd, 0x40, 0xa5, 0x3b, 0x1d,
- 0x6d, 0x27, 0xea, 0x63, 0x73, 0x00, 0x3f, 0x1a, 0xa7, 0x27, 0x8e, 0x20,
- 0x7e, 0x1e, 0x01, 0xec, 0x13, 0x17, 0x1b, 0xbd, 0xa9, 0x9c, 0xd6, 0x6b,
- 0xf2, 0xee, 0xc2, 0xd3, 0x4a, 0xf2, 0x22, 0xda, 0xc3, 0x88, 0x13, 0xb0,
- 0xdd, 0xbd, 0x3d, 0xe1, 0x12, 0xf0, 0xfa, 0xc7, 0xd5, 0x57, 0x7f, 0xfb,
- 0x1e, 0xee, 0xff, 0xea, 0x39, 0xdc, 0xff, 0x27, 0xcd, 0xe1, 0x93, 0x5f,
- 0x37, 0x87, 0x4f, 0x7e, 0xb3, 0x39, 0x74, 0x45, 0x35, 0xe9, 0x21, 0x6a,
- 0xd9, 0xab, 0x41, 0x28, 0x77, 0x31, 0xdd, 0xad, 0xe6, 0x9f, 0x63, 0x8a,
- 0x94, 0x93, 0x57, 0xc2, 0x3c, 0x48, 0xf9, 0xac, 0x19, 0xca, 0x0b, 0x76,
- 0x06, 0xec, 0x48, 0x08, 0x51, 0xae, 0xa3, 0xca, 0x1b, 0x47, 0x59, 0x63,
- 0x0e, 0x1c, 0x39, 0xd1, 0x8c, 0x70, 0xfc, 0xaa, 0x24, 0x95, 0x93, 0xdc,
- 0xbb, 0x74, 0xe5, 0xbc, 0x1b, 0x8d, 0xf0, 0xc9, 0x5f, 0x40, 0x76, 0xe1,
- 0x9c, 0x9a, 0x51, 0x0d, 0x23, 0xc4, 0xfd, 0xb7, 0xe7, 0xef, 0x53, 0xe8,
- 0x8a, 0x5e, 0xeb, 0x89, 0xf6, 0x26, 0x90, 0x43, 0x2e, 0x9c, 0x99, 0xdd,
- 0x39, 0x77, 0xfd, 0x44, 0x34, 0x8d, 0x98, 0x96, 0x81, 0x64, 0x5f, 0x16,
- 0x10, 0xce, 0x7b, 0xdc, 0x71, 0x1f, 0x7b, 0xae, 0xda, 0xa0, 0x6e, 0xef,
- 0x6a, 0xdf, 0xf1, 0xc3, 0x17, 0x6f, 0x87, 0x3b, 0x6d, 0xb5, 0xef, 0x38,
- 0xae, 0x09, 0xb4, 0xfe, 0xd5, 0x4a, 0xf8, 0x6d, 0xaa, 0x81, 0xf2, 0xfb,
- 0xc7, 0x19, 0x06, 0x9d, 0x8d, 0x44, 0x68, 0x5f, 0xd2, 0x9c, 0x49, 0x7b,
- 0x12, 0x93, 0x7c, 0x70, 0x2c, 0xef, 0x3a, 0x57, 0x25, 0xc7, 0x68, 0x57,
- 0x16, 0x72, 0xb4, 0xd9, 0xd3, 0x9a, 0xbe, 0xca, 0xa3, 0xac, 0x39, 0x04,
- 0xbe, 0x2c, 0xf4, 0x23, 0x52, 0x46, 0x0b, 0x89, 0xa0, 0x20, 0x71, 0x08,
- 0x96, 0x75, 0x92, 0x71, 0x82, 0x7f, 0xfe, 0x90, 0x68, 0x7e, 0xde, 0x1e,
- 0x6f, 0x3a, 0xc9, 0x06, 0x69, 0x3d, 0xc9, 0xf3, 0xb8, 0x51, 0xc2, 0xfe,
- 0x3b, 0x30, 0x68, 0x25, 0x57, 0x4b, 0x8a, 0xc0, 0xe1, 0x15, 0xd3, 0x97,
- 0x25, 0x33, 0x70, 0x72, 0x4d, 0x05, 0xc9, 0x7e, 0xa7, 0x4e, 0x97, 0xcb,
- 0xe6, 0xba, 0x54, 0xdf, 0x44, 0x3f, 0xb0, 0x71, 0xb4, 0xb6, 0xba, 0x59,
- 0x9e, 0x49, 0x95, 0x2f, 0xc0, 0x98, 0xe4, 0x15, 0x27, 0xe8, 0xdb, 0xea,
- 0x7d, 0xb0, 0x1a, 0xc4, 0x11, 0xcc, 0xe5, 0xec, 0xde, 0x07, 0x19, 0xc7,
- 0xbd, 0x41, 0x8f, 0x2c, 0x34, 0xcb, 0xe8, 0x6e, 0xde, 0x25, 0x76, 0x3b,
- 0x26, 0xc0, 0xe1, 0x57, 0x51, 0x1d, 0x75, 0xb5, 0xa3, 0x5d, 0x3d, 0x32,
- 0x66, 0x0b, 0xdd, 0x2b, 0x7f, 0x1a, 0x48, 0x6b, 0xd5, 0xd3, 0x3a, 0x66,
- 0x1a, 0x4c, 0xf2, 0x14, 0x28, 0x23, 0xe9, 0x4d, 0xf6, 0x89, 0x73, 0x45,
- 0x42, 0xbd, 0x89, 0x05, 0xcd, 0x8d, 0x66, 0x52, 0x1c, 0x8e, 0x8e, 0x4e,
- 0x4e, 0x5a, 0x79, 0x25, 0x34, 0x6d, 0x48, 0xf5, 0xe5, 0x9c, 0xe5, 0xa4,
- 0x26, 0x32, 0x2a, 0xd2, 0xc1, 0xb8, 0xbb, 0x31, 0xbe, 0xda, 0x79, 0x7e,
- 0x7d, 0x03, 0x27, 0x52, 0x96, 0xd6, 0xb9, 0x96, 0x94, 0x49, 0x45, 0xd3,
- 0x29, 0x4c, 0x37, 0x61, 0x2f, 0xdc, 0x2c, 0x8d, 0x79, 0xf8, 0xfb, 0x27,
- 0xcb, 0xc7, 0x01, 0x9b, 0x32, 0x5b, 0x7c, 0xae, 0x7c, 0xa7, 0x75, 0xb8,
- 0xd7, 0x22, 0xe4, 0xb0, 0xe7, 0x95, 0x94, 0x0f, 0x01, 0xc3, 0x0e, 0x49,
- 0x5a, 0x21, 0x78, 0xa5, 0x22, 0x97, 0xc4, 0xd9, 0xc3, 0x8d, 0x9b, 0xe1,
- 0xaa, 0x2b, 0x1c, 0xc4, 0x8a, 0xd6, 0x4f, 0xd6, 0x35, 0x7f, 0xd8, 0x23,
- 0xb8, 0x16, 0x11, 0xbf, 0xd7, 0xbd, 0xbc, 0xf0, 0x85, 0xb5, 0x27, 0x20,
- 0xe5, 0xfd, 0xcf, 0x4f, 0xfa, 0xbb, 0xdf, 0x6d, 0x7f, 0xf6, 0x08, 0xd8,
- 0x03, 0xf0, 0xdf, 0xf3, 0x04, 0x48, 0x3a, 0x56, 0xef, 0x8f, 0xbd, 0x24,
- 0x4e, 0x1f, 0xfc, 0x88, 0x76, 0x5a, 0x69, 0xd6, 0xff, 0xdc, 0x9d, 0x16,
- 0xc9, 0xfb, 0xf6, 0x84, 0x98, 0xbf, 0xa6, 0xcb, 0x22, 0xff, 0x04, 0xd0,
- 0xa6, 0xb9, 0xe5, 0x5f, 0x12, 0x77, 0xee, 0x0a, 0xd2, 0xd8, 0x23, 0xad,
- 0x15, 0xaf, 0xe5, 0xde, 0xe9, 0xc3, 0xef, 0xcd, 0xcb, 0xc9, 0xb4, 0x9c,
- 0x53, 0x04, 0x8f, 0xdb, 0xe8, 0xfb, 0xcc, 0x7d, 0x10, 0xeb, 0x91, 0x08,
- 0x60, 0x91, 0x35, 0x04, 0xb1, 0x5a, 0xeb, 0xa4, 0x6b, 0x3b, 0x3e, 0x2f,
- 0x51, 0x89, 0x63, 0x41, 0xc0, 0xc0, 0x35, 0x95, 0xde, 0x30, 0x19, 0x0e,
- 0x85, 0xd7, 0xf6, 0x84, 0x78, 0xf4, 0xc5, 0xb2, 0x75, 0x6c, 0xc0, 0x99,
- 0x99, 0x81, 0x63, 0xc1, 0x4a, 0xcb, 0x61, 0xed, 0x08, 0xe0, 0xf3, 0xae,
- 0x8b, 0x05, 0x24, 0xe3, 0xce, 0x13, 0x2d, 0x35, 0x5a, 0xd6, 0xf2, 0x27,
- 0x33, 0xe7, 0xb5, 0x2b, 0x8d, 0xd5, 0x62, 0xca, 0x07, 0xeb, 0x4a, 0x3e,
- 0xa3, 0xcd, 0xbf, 0xa3, 0x81, 0x9a, 0x59, 0x88, 0xaf, 0xf3, 0xaa, 0x45,
- 0xb2, 0xac, 0x23, 0x34, 0x37, 0xbc, 0xb5, 0xf4, 0x6f, 0x30, 0x26, 0xa8,
- 0x12, 0xd1, 0x1e, 0x05, 0xd7, 0x53, 0x88, 0x96, 0xc1, 0x66, 0x57, 0xfa,
- 0x0d, 0x55, 0xe5, 0xd3, 0x7e, 0x55, 0xbc, 0x11, 0xdb, 0x75, 0x17, 0xd5,
- 0x3b, 0xef, 0x91, 0x4a, 0x47, 0x2a, 0xf3, 0x8a, 0x12, 0x26, 0xba, 0x13,
- 0x53, 0x68, 0x11, 0x96, 0x9e, 0x28, 0x6e, 0x29, 0x12, 0x6f, 0xab, 0x80,
- 0xf1, 0xc2, 0x7a, 0xc5, 0xa4, 0x83, 0x20, 0x0f, 0xd1, 0x50, 0xb4, 0xb0,
- 0x91, 0x4b, 0x2e, 0x1d, 0xa4, 0x70, 0xec, 0x2d, 0xa3, 0x3e, 0x6b, 0xa5,
- 0x65, 0x6a, 0x91, 0xe8, 0x69, 0x5d, 0x99, 0xe5, 0x80, 0x68, 0x75, 0xd5,
- 0x69, 0xc2, 0x99, 0x6f, 0xc7, 0xa8, 0x49, 0x74, 0x6c, 0xa5, 0xca, 0xd3,
- 0x44, 0x5e, 0xbf, 0x6d, 0x55, 0x2e, 0xcd, 0x11, 0xcf, 0x0b, 0x7f, 0xbf,
- 0xa7, 0x51, 0x3f, 0x2f, 0x0b, 0xa5, 0xe4, 0x50, 0xc8, 0x0f, 0x33, 0xf2,
- 0x55, 0x74, 0xbe, 0x31, 0x34, 0x52, 0x66, 0x2b, 0x75, 0x6c, 0x50, 0x0c,
- 0x88, 0xdd, 0x0e, 0xd8, 0x72, 0xef, 0x39, 0x03, 0xd2, 0x2b, 0xf8, 0xe2,
- 0xd3, 0x25, 0x53, 0x57, 0x3b, 0x5d, 0x03, 0x76, 0x0a, 0x31, 0x94, 0xf0,
- 0x24, 0x22, 0x11, 0x11, 0xe6, 0x03, 0x78, 0xa8, 0x71, 0x5d, 0x42, 0x20,
- 0x6b, 0x31, 0x0e, 0x91, 0x68, 0xc2, 0x87, 0x25, 0x6d, 0xc2, 0x1f, 0x39,
- 0xce, 0xc2, 0xe6, 0x78, 0x11, 0x23, 0x93, 0xfa, 0x17, 0x5b, 0xbe, 0x48,
- 0xb1, 0xf8, 0x24, 0xd5, 0xc2, 0x23, 0x6d, 0x4b, 0x56, 0x10, 0x07, 0xb6,
- 0xec, 0xfb, 0x75, 0x9c, 0xc1, 0xc3, 0xe4, 0x98, 0x9e, 0x0e, 0x1b, 0xfa,
- 0x13, 0x5a, 0x20, 0x26, 0x4d, 0xaf, 0x1c, 0x0d, 0x57, 0x77, 0x0c, 0x77,
- 0x96, 0xec, 0xbd, 0x44, 0x2b, 0xe6, 0x72, 0x22, 0xdf, 0x50, 0xf8, 0xd6,
- 0x49, 0x71, 0x57, 0x6d, 0x33, 0xe9, 0x5d, 0xcf, 0xca, 0xf1, 0xd8, 0x8c,
- 0xbc, 0xa7, 0x7a, 0x8a, 0xf9, 0x76, 0xe0, 0x12, 0xf2, 0x7b, 0xa2, 0xbe,
- 0xc9, 0x3e, 0x2c, 0x07, 0x36, 0x89, 0xa8, 0x17, 0xae, 0xa2, 0x93, 0x7e,
- 0x5e, 0x8b, 0x8b, 0x47, 0x6e, 0x9a, 0x5a, 0x92, 0x8f, 0x65, 0x73, 0xd0,
- 0xd8, 0x3c, 0x58, 0xa3, 0xa4, 0x0f, 0xd1, 0x4f, 0xb5, 0x7b, 0x09, 0x17,
- 0xbf, 0x5e, 0x5d, 0x4d, 0x5e, 0x44, 0x18, 0x04, 0x97, 0x14, 0xc4, 0xc8,
- 0xc3, 0x42, 0xd5, 0x3c, 0x05, 0xed, 0x01, 0xf5, 0xfe, 0x93, 0xfe, 0xd8,
- 0xeb, 0xd3, 0x7f, 0xf7, 0xff, 0xab, 0x97, 0x90, 0x09, 0x73, 0xb0, 0xb3,
- 0x73, 0x77, 0x77, 0x37, 0x14, 0x22, 0xe0, 0xa1, 0x59, 0xb2, 0x8d, 0x10,
- 0xdf, 0x4f, 0x7c, 0x2b, 0x2b, 0x3e, 0x70, 0x99, 0xf4, 0xf2, 0xf9, 0xf5,
- 0x8f, 0x7b, 0x83, 0xbd, 0xdd, 0xdd, 0xdd, 0x9f, 0x87, 0x0b, 0x9a, 0xdf,
- 0x2b, 0x34, 0x6b, 0xfe, 0xeb, 0x37, 0xbb, 0xc3, 0x3d, 0xd9, 0x89, 0x52,
- 0x58, 0xf1, 0xef, 0x5c, 0x25, 0x76, 0x90, 0xca, 0xf2, 0x4e, 0x3e, 0xf0,
- 0x84, 0x0c, 0xbb, 0xc4, 0x53, 0x21, 0xbd, 0x8f, 0x66, 0xcb, 0x71, 0x0d,
- 0x07, 0xf2, 0x04, 0x3e, 0x7b, 0xb2, 0xbf, 0x9f, 0xb0, 0xca, 0xc1, 0x20,
- 0x74, 0x8e, 0xcc, 0x50, 0xfe, 0xa1, 0xd4, 0xba, 0xe3, 0xdb, 0x6c, 0x42,
- 0x44, 0x2c, 0x15, 0x97, 0xd1, 0x0a, 0xaa, 0x2a, 0x29, 0xe6, 0x01, 0x14,
- 0xdd, 0x46, 0x8c, 0x25, 0xe3, 0x72, 0x7a, 0xef, 0x5a, 0x35, 0x5b, 0xbc,
- 0x22, 0xd1, 0x4a, 0xa5, 0x6a, 0xb8, 0x46, 0x69, 0x22, 0xee, 0xc6, 0x3a,
- 0x5a, 0x00, 0xde, 0x02, 0xca, 0x71, 0xcf, 0x81, 0xef, 0xab, 0xa0, 0xf9,
- 0x45, 0x51, 0x04, 0x30, 0xf6, 0x2c, 0x2b, 0x61, 0xe2, 0x46, 0xd4, 0xe6,
- 0x2e, 0xbd, 0x6f, 0x5d, 0xf7, 0x66, 0xc6, 0x5f, 0x9a, 0xff, 0xac, 0x2a,
- 0x92, 0x4a, 0xca, 0xa5, 0x2d, 0x17, 0x76, 0x95, 0x35, 0x93, 0x9b, 0x80,
- 0xc4, 0x92, 0x64, 0xb8, 0xe9, 0xed, 0x8d, 0x19, 0xd0, 0xbd, 0x2d, 0xed,
- 0x17, 0xab, 0x43, 0xe2, 0x65, 0xdf, 0x98, 0x26, 0x89, 0x9b, 0x16, 0x65,
- 0x3d, 0xb9, 0x34, 0x21, 0x8b, 0xc5, 0xa8, 0x7a, 0x94, 0xb9, 0xea, 0x1d,
- 0xf8, 0x5e, 0x5e, 0x6b, 0x72, 0xd0, 0xe4, 0x26, 0x9b, 0x8b, 0xcc, 0xdc,
- 0x52, 0xf8, 0x47, 0x4f, 0xf6, 0x60, 0x2f, 0x09, 0x2f, 0xb5, 0xde, 0x95,
- 0xfe, 0xca, 0x8c, 0x64, 0x5b, 0xd2, 0x6b, 0xec, 0x45, 0x27, 0x5c, 0xdd,
- 0xd7, 0x4b, 0x32, 0x1d, 0xc7, 0xa9, 0xdc, 0x28, 0xca, 0x0b, 0x3b, 0x8c,
- 0xa3, 0x97, 0x8c, 0x50, 0xcc, 0x2a, 0x5c, 0x63, 0xf5, 0x72, 0x3c, 0x10,
- 0xdd, 0x07, 0x3d, 0x42, 0xa4, 0x8c, 0x4e, 0xeb, 0xeb, 0x93, 0xa3, 0x4b,
- 0xae, 0x87, 0xda, 0x67, 0x48, 0xac, 0xf9, 0x83, 0xf2, 0x5b, 0x42, 0x32,
- 0x75, 0xc2, 0xc9, 0xa2, 0x62, 0x2a, 0x6d, 0x56, 0xee, 0x1e, 0x4b, 0x08,
- 0x8b, 0x98, 0xf1, 0x95, 0xbf, 0xbe, 0x47, 0xd0, 0x1b, 0xe1, 0x36, 0x6f,
- 0xe9, 0x89, 0x16, 0x65, 0xf1, 0xf4, 0xd9, 0x70, 0x97, 0x87, 0x48, 0x73,
- 0x28, 0xd1, 0x40, 0x41, 0x64, 0xc3, 0xc7, 0x53, 0x0b, 0xb3, 0x5d, 0xba,
- 0x82, 0x95, 0x53, 0xbb, 0xd2, 0x4f, 0x98, 0xc8, 0x91, 0x13, 0x26, 0xf5,
- 0xb7, 0x1e, 0xf4, 0xe3, 0x81, 0x50, 0xb2, 0xde, 0x5e, 0x02, 0x76, 0xba,
- 0xef, 0x52, 0xf0, 0x81, 0x25, 0x51, 0xa1, 0xb8, 0x10, 0xc2, 0x31, 0x50,
- 0xbc, 0xec, 0x09, 0xc1, 0x86, 0xf5, 0x1d, 0x33, 0x7a, 0x49, 0xb7, 0x80,
- 0xdc, 0x58, 0x02, 0x2f, 0x46, 0xbd, 0x20, 0x57, 0x70, 0x23, 0xa6, 0xa1,
- 0x04, 0xb4, 0xf3, 0x83, 0xaf, 0xa4, 0xe6, 0x1b, 0x6b, 0xca, 0x31, 0x80,
- 0x37, 0xd6, 0x72, 0xdb, 0x82, 0x76, 0xc4, 0x7c, 0xb5, 0x7a, 0xe7, 0x10,
- 0x9e, 0x46, 0x5e, 0xfd, 0xa6, 0x53, 0x21, 0x30, 0xc0, 0x11, 0x23, 0x8f,
- 0xd9, 0x43, 0xf1, 0xa7, 0x18, 0x20, 0xb6, 0x00, 0x6c, 0x3d, 0x76, 0x4f,
- 0xf5, 0xfe, 0x4c, 0x7e, 0xe8, 0x57, 0x87, 0xbd, 0x0e, 0x94, 0x2b, 0xc6,
- 0xae, 0x5e, 0xb3, 0x7c, 0x6b, 0x9b, 0x33, 0x22, 0xd3, 0x48, 0xee, 0x67,
- 0x9f, 0x1a, 0xbe, 0xf9, 0xaf, 0x50, 0x07, 0xad, 0x78, 0xb2, 0x9f, 0xd4,
- 0xf7, 0x46, 0x87, 0x98, 0xfb, 0x93, 0xd0, 0x2d, 0x7c, 0x17, 0xf5, 0xbe,
- 0xb7, 0xaa, 0x49, 0xb0, 0xe8, 0x7a, 0x4f, 0xaf, 0x1c, 0xe2, 0x15, 0x61,
- 0x9f, 0x57, 0xf0, 0xc1, 0x23, 0xaa, 0x29, 0x96, 0x2a, 0xc4, 0xc6, 0xb3,
- 0xb4, 0xf8, 0x68, 0xab, 0xbf, 0x71, 0x43, 0x7d, 0x2a, 0x51, 0xc4, 0xe9,
- 0x22, 0xee, 0x87, 0x32, 0x3d, 0x7c, 0x31, 0x76, 0x9a, 0xfb, 0xdb, 0x12,
- 0xaa, 0xfd, 0x3c, 0xad, 0x3e, 0x5a, 0x04, 0xdc, 0xe3, 0x6a, 0x35, 0x46,
- 0xe7, 0xd6, 0xd5, 0x6e, 0xfc, 0xfd, 0xe2, 0xa8, 0x4b, 0x9d, 0x75, 0x23,
- 0xa1, 0xcd, 0x7f, 0x0f, 0x34, 0xc2, 0xb0, 0xae, 0xa0, 0x35, 0x1e, 0xb7,
- 0x35, 0xf6, 0x6c, 0x4c, 0xc2, 0x2f, 0x9a, 0xc4, 0xda, 0x9c, 0x8b, 0x83,
- 0xc4, 0x52, 0x2e, 0x86, 0xc9, 0x99, 0x33, 0x1e, 0x8b, 0x3e, 0x68, 0xee,
- 0x9a, 0x6a, 0x22, 0xa6, 0x23, 0xfe, 0x3e, 0xd0, 0x0a, 0xa8, 0xd1, 0x22,
- 0x80, 0xd0, 0x68, 0x50, 0x51, 0xf5, 0xde, 0xe9, 0x79, 0xde, 0x75, 0xc6,
- 0xf5, 0x79, 0x9c, 0xec, 0x35, 0x52, 0x84, 0x0a, 0xd9, 0x80, 0x8c, 0x22,
- 0x80, 0x94, 0xf1, 0x20, 0xa2, 0xfc, 0xd7, 0xf1, 0xf1, 0xd6, 0x12, 0x7b,
- 0x9b, 0x99, 0xfb, 0x6f, 0xb9, 0xf0, 0x48, 0xc4, 0x85, 0xad, 0xd2, 0x88,
- 0xaf, 0xb2, 0xe8, 0x07, 0x8c, 0x0d, 0x20, 0xe8, 0x14, 0x17, 0x13, 0xc1,
- 0x19, 0xe6, 0x52, 0x35, 0x2e, 0xb3, 0xd5, 0x68, 0xf8, 0x4d, 0xdd, 0x8a,
- 0xee, 0xe3, 0x0f, 0x14, 0xb7, 0x62, 0xaa, 0x6e, 0x5d, 0x0c, 0xb3, 0xed,
- 0xfa, 0x8c, 0xcc, 0x8f, 0xb3, 0x6f, 0xf2, 0xd1, 0xff, 0xd6, 0x58, 0xeb,
- 0x59, 0x55, 0xd6, 0xc9, 0x77, 0xcf, 0x14, 0x63, 0x20, 0x95, 0xf2, 0xe4,
- 0x6e, 0xb2, 0x7a, 0x39, 0xcf, 0x35, 0x18, 0x51, 0xa2, 0x6e, 0x13, 0x4d,
- 0x5c, 0xd6, 0xd7, 0xfd, 0x4b, 0xaa, 0x3b, 0x12, 0xb2, 0xd7, 0x8d, 0xbc,
- 0x44, 0x8d, 0xd2, 0xe0, 0xfa, 0x6c, 0x17, 0xb6, 0x32, 0x17, 0x2e, 0x29,
- 0x3a, 0xe4, 0xdf, 0x31, 0x2a, 0xfc, 0x98, 0xaa, 0xa6, 0x43, 0x5d, 0xb0,
- 0x1d, 0x4f, 0x2e, 0x73, 0x72, 0x01, 0xb8, 0x02, 0x59, 0x51, 0xd4, 0xaa,
- 0x44, 0x3f, 0x1d, 0x33, 0x64, 0x27, 0x42, 0x47, 0x7a, 0x45, 0x7d, 0x43,
- 0x57, 0x33, 0xdd, 0x18, 0x30, 0xfc, 0x36, 0x56, 0xd4, 0x49, 0x82, 0xb5,
- 0xf2, 0xee, 0xf2, 0xf4, 0xad, 0x04, 0x7f, 0xdd, 0xfa, 0x04, 0x05, 0xc5,
- 0x65, 0x6b, 0xa6, 0x31, 0xfe, 0x69, 0x6f, 0x32, 0x14, 0x54, 0xce, 0x99,
- 0x88, 0x34, 0x6d, 0x7d, 0x49, 0x34, 0xa9, 0x04, 0xae, 0xac, 0x26, 0x9a,
- 0x4c, 0x6a, 0xc4, 0xbb, 0x49, 0x38, 0x9d, 0x1a, 0x7e, 0x02, 0x98, 0xcf,
- 0x46, 0xd0, 0x98, 0x2d, 0xe9, 0x95, 0xca, 0x08, 0xf7, 0x75, 0xd9, 0x39,
- 0x32, 0xfe, 0x82, 0xd1, 0x36, 0x64, 0x2a, 0xd8, 0xe4, 0x75, 0x79, 0x57,
- 0x0c, 0x4e, 0x29, 0xef, 0x24, 0x39, 0x2d, 0xaf, 0xcd, 0x54, 0xbd, 0x8b,
- 0x5a, 0xf2, 0xef, 0xcf, 0xdf, 0x25, 0x5b, 0x24, 0x89, 0x93, 0x73, 0xcb,
- 0x35, 0x42, 0x4f, 0x6e, 0x8b, 0xd2, 0x69, 0xc4, 0xe1, 0x1b, 0xd7, 0x9b,
- 0x7e, 0x72, 0xfc, 0xc3, 0xe1, 0xdb, 0xf3, 0xd3, 0xe3, 0x9f, 0x38, 0x4a,
- 0x1b, 0x0c, 0x87, 0x7e, 0xfc, 0xa5, 0xa7, 0x85, 0xc3, 0x6b, 0x4f, 0xd1,
- 0x27, 0xd3, 0x8f, 0xfb, 0xd5, 0xb2, 0x80, 0x8f, 0x8f, 0x6e, 0xc1, 0xd1,
- 0xe8, 0xfc, 0x64, 0xa0, 0x44, 0x21, 0x5c, 0x61, 0x25, 0x2f, 0x48, 0x65,
- 0xc6, 0x29, 0x16, 0x0e, 0xdf, 0x6f, 0xc3, 0x00, 0x85, 0x9e, 0x88, 0x7e,
- 0xf2, 0x4e, 0x69, 0x37, 0xfb, 0x58, 0x71, 0xba, 0xe3, 0x5f, 0xe7, 0xd7,
- 0x08, 0x32, 0x74, 0x38, 0x3f, 0xb4, 0xd8, 0x34, 0x6d, 0x82, 0x80, 0x83,
- 0x87, 0x3c, 0x91, 0x36, 0x00, 0x58, 0x67, 0x33, 0x76, 0x69, 0xad, 0x94,
- 0xa3, 0xc0, 0x21, 0x61, 0x19, 0x09, 0x06, 0x19, 0x84, 0x4f, 0x04, 0x16,
- 0x49, 0x5a, 0x14, 0xaf, 0x9f, 0xe8, 0xa9, 0xbc, 0x47, 0x58, 0x76, 0xc8,
- 0x25, 0x63, 0x85, 0xc3, 0x81, 0xb1, 0xd3, 0x97, 0xc9, 0x41, 0xef, 0x77,
- 0xbc, 0x48, 0x7c, 0xef, 0x5f, 0x84, 0x09, 0x5e, 0xa2, 0x28, 0xea, 0x1e,
- 0xe4, 0xfc, 0x5c, 0x56, 0x6e, 0xd5, 0x03, 0xc3, 0xfe, 0x4f, 0x73, 0xd4,
- 0x05, 0x21, 0x01, 0xe4, 0xf5, 0x75, 0x24, 0x8d, 0xb7, 0x80, 0x5c, 0xca,
- 0x38, 0xab, 0xc3, 0xa8, 0x2d, 0x44, 0x60, 0x2d, 0x7e, 0x5d, 0x33, 0x86,
- 0x1e, 0xe2, 0x55, 0xa2, 0x52, 0x97, 0xd3, 0x1e, 0x61, 0x7a, 0xe0, 0x95,
- 0x46, 0xc9, 0xed, 0xb0, 0x39, 0xcc, 0xd5, 0xe6, 0x17, 0x9b, 0x12, 0x68,
- 0xeb, 0xc9, 0x8d, 0x4c, 0x1a, 0x4d, 0x8f, 0x55, 0x1a, 0x22, 0x99, 0xa1,
- 0xde, 0x9b, 0x13, 0xbf, 0xf9, 0x72, 0x53, 0xb9, 0x92, 0xf5, 0xc9, 0xae,
- 0xc0, 0xc1, 0x7b, 0x12, 0xf6, 0x51, 0xc6, 0x2d, 0x59, 0x7d, 0x01, 0x4e,
- 0xdd, 0xe4, 0xd3, 0x69, 0x26, 0x9e, 0x12, 0x2a, 0x79, 0xc1, 0xdc, 0x3e,
- 0x1c, 0x58, 0xea, 0x5e, 0x4c, 0xad, 0x9e, 0x4b, 0x5f, 0xff, 0x4d, 0xfb,
- 0xea, 0xd5, 0x83, 0x22, 0x37, 0xb5, 0x2b, 0xd4, 0x30, 0xe6, 0x92, 0x42,
- 0xb1, 0xe5, 0xa6, 0x5d, 0x8a, 0x58, 0x08, 0xcc, 0x25, 0xe8, 0x46, 0x6a,
- 0x2d, 0x8a, 0x9c, 0x66, 0x85, 0xb6, 0xdf, 0x81, 0x9e, 0x23, 0xd6, 0x11,
- 0xba, 0xb4, 0x1a, 0xcb, 0x64, 0x85, 0x12, 0xea, 0x15, 0x71, 0x93, 0x73,
- 0x49, 0x46, 0x2a, 0x6a, 0xb1, 0xea, 0xa4, 0xaa, 0xbb, 0xcf, 0xed, 0x3c,
- 0x4e, 0x22, 0x53, 0x00, 0x20, 0xd9, 0x62, 0x78, 0x30, 0x2b, 0xe0, 0xf8,
- 0x15, 0x6d, 0xbf, 0x1f, 0x66, 0x31, 0x73, 0xdd, 0x04, 0xa5, 0x4d, 0xb6,
- 0xe1, 0x88, 0x76, 0xfc, 0x4c, 0xf1, 0x7b, 0x51, 0xfe, 0x54, 0x2f, 0xc9,
- 0xa2, 0x5d, 0x82, 0x42, 0xdc, 0x9b, 0x20, 0x96, 0x5d, 0x0d, 0xdb, 0xc7,
- 0x34, 0xb9, 0x79, 0x0a, 0x12, 0x1f, 0x9c, 0x83, 0xdc, 0xf6, 0x2f, 0x8e,
- 0xea, 0x89, 0xba, 0xca, 0xbf, 0x93, 0x53, 0x15, 0x41, 0x11, 0xbe, 0x96,
- 0x60, 0x4a, 0xab, 0x80, 0x38, 0x23, 0xe1, 0xd9, 0x8f, 0x24, 0x6a, 0xab,
- 0xc6, 0x6c, 0x35, 0x7a, 0x9c, 0xc3, 0xe3, 0x5b, 0x0f, 0x63, 0xb5, 0x30,
- 0x45, 0x75, 0xc1, 0xa6, 0xd3, 0x8b, 0x9d, 0xbd, 0xae, 0x88, 0xb0, 0x68,
- 0x13, 0xa4, 0x98, 0xe2, 0x3c, 0x68, 0xdb, 0x91, 0x70, 0x1b, 0x6e, 0x8f,
- 0x27, 0xb6, 0x92, 0xad, 0x79, 0xb2, 0x4a, 0x2b, 0x2e, 0x36, 0x56, 0x7c,
- 0x54, 0xcc, 0x0b, 0x97, 0xa4, 0xcf, 0x26, 0xcb, 0xa6, 0x8d, 0xf0, 0xf6,
- 0xfa, 0x24, 0x09, 0xfd, 0xe8, 0xd2, 0x16, 0x0e, 0x82, 0x58, 0x28, 0xbd,
- 0x73, 0xcd, 0xc6, 0x3e, 0xe8, 0x6d, 0x4b, 0x64, 0x8f, 0xa3, 0x3e, 0x36,
- 0x4d, 0x3b, 0x16, 0xb3, 0xd3, 0x2e, 0x57, 0x19, 0x3b, 0xd8, 0x5c, 0x00,
- 0x3b, 0xfa, 0x79, 0xae, 0xc6, 0x1b, 0xf9, 0xfa, 0x1b, 0xf6, 0xc6, 0x78,
- 0x1f, 0xb7, 0xe5, 0x5e, 0xc4, 0x51, 0x53, 0x07, 0x47, 0x39, 0xf8, 0x32,
- 0x8a, 0xad, 0x19, 0x01, 0x65, 0x0b, 0x21, 0xea, 0xab, 0x3a, 0xf9, 0x81,
- 0x83, 0xec, 0xe4, 0xfc, 0xf6, 0xb9, 0xf8, 0x37, 0x49, 0xdf, 0xa0, 0x1b,
- 0x0f, 0x3f, 0xb2, 0x12, 0x3f, 0x18, 0xc5, 0xc7, 0x6a, 0xfc, 0xd4, 0xfc,
- 0xf1, 0x2d, 0xfd, 0x71, 0xc5, 0x46, 0xa2, 0x90, 0xa9, 0xb0, 0x67, 0x2e,
- 0xdc, 0xda, 0x94, 0x0a, 0x97, 0xf8, 0xf9, 0x74, 0x00, 0xf0, 0x12, 0x0e,
- 0x9f, 0x98, 0x57, 0x5c, 0x12, 0x3c, 0xf4, 0x5f, 0x6d, 0xa6, 0xcf, 0xb9,
- 0x31, 0x61, 0xe0, 0x4a, 0xfe, 0x07, 0xa6, 0x10, 0x66, 0xe2, 0xe8, 0xc3,
- 0x0b, 0x31, 0xe2, 0xc2, 0x58, 0x65, 0x2c, 0x3d, 0xc2, 0x4c, 0xd5, 0xdf,
- 0x29, 0x36, 0xa3, 0xd5, 0x93, 0x13, 0xd4, 0xf2, 0x9c, 0x5b, 0x3c, 0x2c,
- 0x2c, 0x23, 0x1b, 0xe4, 0x67, 0x87, 0x25, 0x1d, 0x34, 0x96, 0x67, 0xf9,
- 0x8a, 0x2e, 0xac, 0x1e, 0x32, 0x6e, 0x77, 0xf9, 0x23, 0x24, 0x1b, 0x5b,
- 0xfd, 0xde, 0x6b, 0x24, 0x07, 0x89, 0xa1, 0x27, 0x45, 0x3a, 0x48, 0x61,
- 0xd3, 0xa5, 0x76, 0x59, 0x83, 0xfc, 0xa8, 0x95, 0x0e, 0xac, 0x96, 0xac,
- 0xe8, 0xe7, 0x9c, 0x6b, 0xa2, 0x10, 0xdf, 0x32, 0xc4, 0xc2, 0x47, 0x1b,
- 0xc1, 0x9c, 0x67, 0x73, 0x0a, 0x87, 0xd8, 0x9b, 0x91, 0xe9, 0x1b, 0x48,
- 0xb3, 0xa2, 0xcf, 0x0d, 0xe2, 0xcd, 0x4d, 0x49, 0x7b, 0xa3, 0x5b, 0x96,
- 0xd1, 0x36, 0xff, 0x12, 0x44, 0xc0, 0xea, 0xfb, 0x62, 0x72, 0xf3, 0xfa,
- 0xdd, 0x28, 0xfe, 0x7a, 0x77, 0x70, 0x78, 0xda, 0x68, 0x21, 0xb4, 0x17,
- 0x18, 0x03, 0x27, 0xd4, 0x45, 0xa8, 0xae, 0xed, 0xfd, 0x36, 0xde, 0x5c,
- 0xfb, 0x15, 0xeb, 0x1c, 0x22, 0xcd, 0x82, 0xa5, 0xb8, 0x28, 0x9e, 0xf0,
- 0xc4, 0x0f, 0x52, 0x3a, 0x0b, 0xd1, 0x32, 0x46, 0xf6, 0x4c, 0x53, 0x08,
- 0x01, 0xf5, 0x1e, 0xd1, 0x62, 0xe5, 0xe1, 0x85, 0xba, 0xfb, 0x1a, 0x54,
- 0xeb, 0xfa, 0xc7, 0x2f, 0x59, 0xe6, 0x53, 0x2a, 0x08, 0x1a, 0x09, 0x38,
- 0x05, 0x33, 0x64, 0xdd, 0xf6, 0x2e, 0x20, 0x68, 0xb6, 0xea, 0x8c, 0x5e,
- 0xe7, 0x5d, 0xda, 0x97, 0xcd, 0x8a, 0x1f, 0x55, 0xab, 0x86, 0x64, 0xe6,
- 0x64, 0xff, 0xeb, 0xaf, 0xc2, 0xdb, 0xf3, 0xf5, 0xbb, 0x15, 0x9f, 0xa3,
- 0xdf, 0x0c, 0x14, 0x2c, 0x2f, 0x1a, 0x81, 0xa7, 0xd0, 0x87, 0x73, 0x11,
- 0xa7, 0xf5, 0x6c, 0xff, 0xf2, 0x21, 0x29, 0x61, 0x9e, 0x90, 0x3f, 0xd6,
- 0x3e, 0x28, 0x40, 0xd7, 0xf8, 0xa7, 0x18, 0x01, 0x3b, 0xe2, 0x94, 0xd8,
- 0x0b, 0x8e, 0xec, 0x9d, 0x8b, 0x22, 0xbc, 0xbd, 0x6e, 0x8d, 0xe2, 0xcd,
- 0x91, 0x7c, 0x8b, 0x51, 0x11, 0x90, 0x58, 0xd8, 0xe7, 0x3f, 0x76, 0xf6,
- 0x2d, 0x60, 0xc9, 0x66, 0x3c, 0xe0, 0x98, 0x9a, 0x1b, 0x3c, 0x54, 0x10,
- 0x8a, 0xfc, 0xd3, 0x08, 0x31, 0xe6, 0x15, 0xbb, 0x19, 0xc1, 0x68, 0x8e,
- 0x42, 0xdb, 0xce, 0x51, 0x3f, 0x55, 0x13, 0x8b, 0xf6, 0x64, 0xc4, 0xd9,
- 0x7b, 0x0f, 0x6d, 0xa6, 0x3c, 0x82, 0xb1, 0x5a, 0xc7, 0xb7, 0xf4, 0xd6,
- 0x28, 0x49, 0x74, 0xb9, 0x3e, 0x7a, 0x93, 0xea, 0x0b, 0xc9, 0xd6, 0xd8,
- 0x5c, 0xd7, 0x5e, 0xf2, 0x34, 0xab, 0xd8, 0x4f, 0x19, 0x9b, 0x1c, 0x6f,
- 0xee, 0xd9, 0xe7, 0xcf, 0x9e, 0x6e, 0x6f, 0xbb, 0xea, 0x8c, 0x0c, 0x99,
- 0x18, 0x93, 0x9a, 0x33, 0xcf, 0x49, 0x72, 0x71, 0xf0, 0xc1, 0x4c, 0xf1,
- 0x0d, 0x04, 0x83, 0xf5, 0xc2, 0xc4, 0x9b, 0xa3, 0x7b, 0x4c, 0xdf, 0xa3,
- 0x45, 0x24, 0x13, 0x1c, 0x02, 0xdd, 0x1a, 0xc2, 0x74, 0xd9, 0x64, 0xfc,
- 0x80, 0x75, 0xc3, 0xaf, 0x94, 0x0a, 0x88, 0x1b, 0x39, 0x3f, 0x14, 0xd7,
- 0x8e, 0x86, 0x9d, 0xa4, 0x37, 0x6d, 0x98, 0xd9, 0x78, 0xce, 0xd7, 0x1e,
- 0xfe, 0x20, 0x11, 0x6d, 0x2e, 0xf5, 0x8a, 0x9d, 0x45, 0xe7, 0xcb, 0xf1,
- 0xcc, 0xdc, 0x41, 0x23, 0xaa, 0x92, 0xf9, 0x29, 0x39, 0xcd, 0xa5, 0x76,
- 0x1e, 0xeb, 0xe0, 0x12, 0xef, 0x5e, 0x75, 0xe7, 0x60, 0xdc, 0xed, 0x8d,
- 0x26, 0x1e, 0x44, 0x97, 0x9f, 0x24, 0x5a, 0x5b, 0xd2, 0x5b, 0xf0, 0x87,
- 0xa8, 0x1e, 0xe7, 0x60, 0xd5, 0xc0, 0x3e, 0x65, 0xb5, 0x5f, 0x83, 0xf7,
- 0x8e, 0x14, 0x44, 0xe4, 0x48, 0x93, 0x23, 0x3a, 0x79, 0xc9, 0xaa, 0xe0,
- 0xea, 0x5a, 0x5c, 0x9a, 0x94, 0xe7, 0x2b, 0x8d, 0x50, 0xbf, 0xe1, 0xb2,
- 0x4d, 0xaf, 0x28, 0x83, 0x88, 0x11, 0x74, 0xb3, 0x0c, 0x75, 0x62, 0x49,
- 0x90, 0x05, 0xa0, 0x65, 0x06, 0x27, 0x66, 0x62, 0xdc, 0x8b, 0x93, 0x42,
- 0x9c, 0xaf, 0x00, 0x46, 0xa5, 0x48, 0x7a, 0x67, 0x77, 0x0d, 0x27, 0x5b,
- 0xb3, 0x17, 0xd8, 0x2c, 0xf2, 0xa7, 0xe0, 0xf0, 0x0a, 0x1e, 0xb2, 0x30,
- 0x86, 0x92, 0xf3, 0xcf, 0x6b, 0xda, 0x5f, 0xdd, 0xfa, 0x52, 0xe0, 0x63,
- 0xa1, 0x2c, 0xa0, 0x40, 0x79, 0x68, 0x60, 0xbc, 0xf6, 0xb8, 0x47, 0x3d,
- 0xa4, 0x39, 0x29, 0x53, 0x1c, 0xa0, 0x33, 0xaa, 0xde, 0x4f, 0xc5, 0x61,
- 0xc7, 0x6d, 0xb3, 0xe1, 0x1d, 0x12, 0x55, 0x20, 0x10, 0x2d, 0x4e, 0xf1,
- 0x2f, 0x15, 0x86, 0xd3, 0x4b, 0xa4, 0x70, 0x24, 0xcc, 0x7b, 0x85, 0x7f,
- 0xda, 0x36, 0xa5, 0xc9, 0x48, 0xe6, 0x1f, 0x47, 0xb4, 0x51, 0xb6, 0x8f,
- 0x56, 0xcd, 0x34, 0x39, 0xe8, 0x45, 0x35, 0x4f, 0x3b, 0x01, 0x44, 0x46,
- 0x07, 0x3b, 0xb4, 0x65, 0x9f, 0xe9, 0x27, 0x5c, 0x3d, 0x55, 0x82, 0xcd,
- 0x36, 0x79, 0xb3, 0x0c, 0xa5, 0xe3, 0x58, 0xdd, 0xa2, 0xc8, 0x94, 0xc4,
- 0x7d, 0x4a, 0x8b, 0xe1, 0xd2, 0x19, 0x61, 0x8f, 0x11, 0x56, 0x89, 0x0a,
- 0xfe, 0xd4, 0xf6, 0x30, 0x53, 0xad, 0xc3, 0x59, 0x79, 0x17, 0x20, 0x6f,
- 0xc9, 0x14, 0xb0, 0xbd, 0x6b, 0x67, 0x20, 0x50, 0x31, 0xf5, 0xff, 0xd4,
- 0x5f, 0x7e, 0xa0, 0x99, 0xfa, 0x2f, 0x9d, 0x29, 0x0d, 0xed, 0xa7, 0x41,
- 0xba, 0x1e, 0x8c, 0xe0, 0xe4, 0x8f, 0x98, 0x95, 0xbf, 0x12, 0x24, 0x85,
- 0xa7, 0xc6, 0x74, 0x79, 0x8e, 0x06, 0xff, 0x38, 0xb4, 0x0a, 0xaf, 0x34,
- 0x92, 0x52, 0xf6, 0x11, 0xb4, 0xf2, 0xf1, 0x7d, 0xe0, 0x3b, 0xa2, 0x6d,
- 0xf8, 0x53, 0xd1, 0x07, 0x17, 0x9e, 0xb1, 0xbd, 0x28, 0x5b, 0x98, 0x0b,
- 0x3a, 0xf1, 0x2a, 0xfe, 0x54, 0x49, 0xde, 0xbb, 0x31, 0x3a, 0x4c, 0xcf,
- 0xc9, 0x22, 0xe3, 0x9f, 0x87, 0x16, 0x00, 0xa1, 0x65, 0x0e, 0xb0, 0x1a,
- 0x7f, 0x1c, 0xd4, 0xf7, 0xf3, 0x71, 0x39, 0x93, 0xbd, 0x4e, 0xe3, 0x35,
- 0x7d, 0xd6, 0x9f, 0xf1, 0xc2, 0x20, 0xb2, 0x31, 0xf0, 0x72, 0x57, 0xfb,
- 0x51, 0xbe, 0x5e, 0x36, 0x52, 0xca, 0xc9, 0x04, 0x69, 0x24, 0x80, 0x87,
- 0x53, 0xdd, 0xe9, 0x3f, 0x26, 0x0c, 0xc7, 0x61, 0x75, 0x68, 0x09, 0xaf,
- 0xd5, 0x9d, 0x73, 0xd5, 0xae, 0xcc, 0xdd, 0x78, 0x60, 0xf3, 0xb8, 0x22,
- 0xeb, 0xb1, 0xbc, 0x5f, 0x3a, 0xa4, 0xa6, 0xa3, 0x1f, 0x90, 0x2b, 0xc2,
- 0xaf, 0x1e, 0xf1, 0x8f, 0x06, 0x97, 0xf4, 0x23, 0xe5, 0x96, 0x96, 0x2c,
- 0x33, 0xf2, 0x67, 0x68, 0x1e, 0x18, 0x15, 0xb9, 0xba, 0x8a, 0x4b, 0xa9,
- 0x36, 0x98, 0x89, 0xc0, 0xc2, 0xe6, 0x70, 0x07, 0xfd, 0xd4, 0xa3, 0xf4,
- 0x81, 0x93, 0xed, 0x8d, 0xc9, 0xbf, 0xbe, 0x35, 0x58, 0xa8, 0x04, 0x59,
- 0x98, 0x23, 0xbd, 0xce, 0x02, 0xe2, 0xfc, 0xb4, 0x5c, 0x26, 0x8b, 0xe0,
- 0xe8, 0xd3, 0xf0, 0xa1, 0xe6, 0x18, 0xd5, 0x03, 0x67, 0x88, 0x40, 0x25,
- 0xc8, 0xf9, 0x94, 0x5f, 0xd9, 0xeb, 0xb7, 0x29, 0x67, 0x53, 0xc6, 0x67,
- 0x50, 0xbb, 0x0f, 0x8c, 0xb5, 0x64, 0x24, 0xae, 0x27, 0x2d, 0x22, 0xf1,
- 0x40, 0xc1, 0x41, 0x51, 0xe8, 0x70, 0x7d, 0x73, 0x2e, 0xae, 0x28, 0xde,
- 0xfd, 0x13, 0x72, 0x73, 0x21, 0x06, 0xcc, 0xf5, 0xe3, 0x41, 0x67, 0x60,
- 0xe4, 0x34, 0xf9, 0x34, 0x23, 0xb1, 0xa3, 0x24, 0x26, 0x62, 0x11, 0x76,
- 0xfa, 0x8f, 0xbe, 0xeb, 0x0e, 0x7b, 0x7e, 0x06, 0x5e, 0x58, 0x52, 0xcb,
- 0xdb, 0xae, 0x6f, 0x6e, 0x75, 0x85, 0xdf, 0xab, 0x66, 0xf1, 0x81, 0xca,
- 0x93, 0xde, 0x7f, 0x20, 0x5c, 0x1f, 0xd6, 0x4c, 0x7d, 0xee, 0xf8, 0x01,
- 0xa6, 0x96, 0x33, 0xdb, 0x96, 0x0b, 0x6a, 0x07, 0x5b, 0x7c, 0x56, 0xb2,
- 0x39, 0xf3, 0xd0, 0x30, 0x24, 0xa2, 0x27, 0x10, 0x30, 0x3f, 0x83, 0x7a,
- 0xab, 0x5d, 0x1b, 0xe3, 0x69, 0xd0, 0x31, 0x8a, 0xd8, 0x7f, 0x40, 0xa8,
- 0xcf, 0x6e, 0x26, 0x73, 0xd9, 0x64, 0x55, 0x3e, 0xf1, 0x0b, 0x45, 0xe1,
- 0x01, 0xec, 0x27, 0x66, 0x4c, 0xa2, 0xd8, 0x5f, 0x94, 0x1a, 0xae, 0xf3,
- 0x3f, 0x78, 0x47, 0xb9, 0x2c, 0x16, 0x39, 0xfd, 0x14, 0x1e, 0x86, 0x40,
- 0xbb, 0xe9, 0x26, 0x6a, 0xe4, 0x7a, 0xc1, 0xda, 0x93, 0x07, 0xc6, 0x09,
- 0xee, 0xc9, 0xfd, 0x44, 0x80, 0xe8, 0x79, 0x5a, 0xdb, 0x1e, 0xf2, 0x10,
- 0x70, 0xa4, 0x30, 0x60, 0xa1, 0xbb, 0x78, 0xf0, 0x1c, 0x32, 0x62, 0x87,
- 0x6e, 0xfd, 0xe1, 0x8a, 0x99, 0x61, 0xa8, 0x65, 0x77, 0x66, 0xda, 0x13,
- 0x22, 0x33, 0xe2, 0xa8, 0x34, 0x22, 0x18, 0xc1, 0xa4, 0x8b, 0x7f, 0x57,
- 0x6a, 0x90, 0x64, 0x4b, 0x2e, 0x58, 0xe1, 0x12, 0xde, 0xb6, 0x87, 0x86,
- 0xdd, 0xa3, 0xc2, 0x26, 0xf2, 0x50, 0x73, 0x10, 0x44, 0x9d, 0x05, 0xdf,
- 0x5f, 0xb5, 0xe0, 0xaa, 0xd3, 0x8a, 0xf4, 0xa0, 0x9f, 0x25, 0x56, 0xd1,
- 0x15, 0x60, 0x14, 0x06, 0x66, 0x65, 0x10, 0xc5, 0x12, 0x63, 0xf4, 0xa3,
- 0x9d, 0xff, 0xf9, 0x9f, 0x7f, 0x16, 0x2b, 0x3d, 0x0d, 0xe4, 0xe5, 0x87,
- 0x7c, 0xe1, 0x0b, 0xaf, 0x93, 0x73, 0xaf, 0x12, 0x72, 0x79, 0xa5, 0x73,
- 0x08, 0x8c, 0x26, 0x1d, 0x0a, 0x15, 0xb7, 0x74, 0xcc, 0x1f, 0x9a, 0x86,
- 0x09, 0x32, 0x10, 0xd9, 0x70, 0xf6, 0x18, 0xca, 0x06, 0xaa, 0x22, 0x89,
- 0x19, 0x7d, 0x72, 0x7e, 0xfb, 0x34, 0x02, 0x52, 0x49, 0x22, 0x5e, 0xa5,
- 0x56, 0xf5, 0xee, 0x17, 0x2b, 0x87, 0x04, 0x3b, 0xc4, 0x0e, 0x49, 0x3a,
- 0xef, 0x93, 0x10, 0x7b, 0x83, 0x68, 0xf7, 0x73, 0x7d, 0x1f, 0xbc, 0x41,
- 0x3c, 0xd8, 0x13, 0xf3, 0xa5, 0x0f, 0x96, 0xc2, 0xd2, 0x5c, 0xd3, 0xf6,
- 0xc3, 0x46, 0x2b, 0x70, 0xdc, 0x96, 0x28, 0xae, 0x29, 0x77, 0x33, 0x77,
- 0x24, 0x89, 0xeb, 0xb3, 0x49, 0x44, 0xbd, 0xed, 0xec, 0xaf, 0x27, 0xd1,
- 0x3e, 0x68, 0xa9, 0xae, 0xda, 0xf6, 0x01, 0xcb, 0xea, 0xfd, 0x58, 0xb6,
- 0x18, 0xdd, 0x83, 0x57, 0xa5, 0x94, 0xd0, 0x7b, 0x8c, 0x40, 0x59, 0xb5,
- 0xcf, 0xc3, 0x7e, 0xe0, 0x2c, 0x7d, 0xa8, 0xeb, 0x19, 0x6d, 0xf6, 0xfc,
- 0xea, 0xde, 0x74, 0xaa, 0x5e, 0x99, 0x63, 0xec, 0xdf, 0xa5, 0xfc, 0x9c,
- 0x2e, 0x97, 0x67, 0x59, 0x6e, 0xd6, 0x70, 0xfe, 0x2d, 0x32, 0x2a, 0x53,
- 0xcc, 0xf4, 0x89, 0x0f, 0xcc, 0x18, 0xd8, 0x15, 0xf1, 0x79, 0x17, 0x11,
- 0x13, 0x91, 0x61, 0x35, 0x87, 0x21, 0x55, 0xae, 0x14, 0x93, 0xe9, 0x81,
- 0xc1, 0xb7, 0x5a, 0xa2, 0x46, 0x5c, 0x18, 0xb8, 0x3d, 0x21, 0x94, 0xaa,
- 0x15, 0x4c, 0x88, 0xce, 0xfe, 0x07, 0x48, 0x15, 0x0e, 0xdc, 0x6a, 0x6d,
- 0x4a, 0x5b, 0x7f, 0x35, 0x95, 0xed, 0xa1, 0xc1, 0xd7, 0xc1, 0x29, 0x5d,
- 0x8b, 0xb3, 0x08, 0x3b, 0x64, 0x12, 0x22, 0x17, 0xa4, 0x1c, 0x00, 0x20,
- 0xac, 0x6e, 0xad, 0xb7, 0x08, 0xdc, 0x42, 0x1f, 0xe3, 0xa2, 0xa9, 0xf8,
- 0xc5, 0x4a, 0x5f, 0xa4, 0xa3, 0x41, 0x6a, 0xb6, 0x05, 0xb3, 0xa3, 0x3a,
- 0x9b, 0xd4, 0x9a, 0x23, 0x12, 0x23, 0xc8, 0x87, 0x74, 0x42, 0xb4, 0xd9,
- 0x02, 0x91, 0x4b, 0x1f, 0xda, 0x36, 0x42, 0x9d, 0xc5, 0x05, 0x25, 0x60,
- 0xed, 0x5c, 0x83, 0xe2, 0xa1, 0xec, 0x6c, 0x25, 0x73, 0xbf, 0x44, 0x66,
- 0x8e, 0xee, 0x55, 0x2b, 0xb4, 0x2e, 0x7d, 0xbc, 0xba, 0x91, 0x5d, 0x2a,
- 0xba, 0xfe, 0xf1, 0x03, 0x1e, 0x95, 0x52, 0x65, 0xd5, 0x91, 0x43, 0x0f,
- 0xdd, 0x91, 0x51, 0xd1, 0x20, 0x63, 0x50, 0x29, 0xe5, 0x8f, 0xe1, 0x9f,
- 0x2c, 0xa4, 0x04, 0x39, 0xe8, 0x1f, 0x39, 0x5a, 0x42, 0xf9, 0xf1, 0x56,
- 0xed, 0x38, 0xe6, 0x28, 0xd1, 0x68, 0xea, 0xe2, 0x16, 0xdb, 0x51, 0xc6,
- 0x8d, 0xae, 0x46, 0x67, 0x76, 0xb0, 0x7f, 0x69, 0x21, 0x6e, 0xfb, 0xe0,
- 0xd9, 0x20, 0xca, 0x92, 0x0f, 0x96, 0xee, 0x98, 0x23, 0x1c, 0xa8, 0xf1,
- 0xe9, 0x0a, 0x73, 0x33, 0xf9, 0x0c, 0x9f, 0x5f, 0x12, 0x5b, 0xfa, 0x74,
- 0xc4, 0x99, 0x85, 0xd6, 0x24, 0x5e, 0x9a, 0xac, 0x6b, 0x4d, 0x53, 0xac,
- 0x6c, 0x53, 0x88, 0x39, 0x3e, 0x70, 0xd2, 0x88, 0x46, 0x2c, 0xfa, 0x45,
- 0x3d, 0xc4, 0x8f, 0xeb, 0x3f, 0x4c, 0x67, 0xd5, 0x58, 0xd6, 0x7f, 0xd1,
- 0x17, 0x11, 0xf1, 0x4f, 0x2b, 0x74, 0xfa, 0x71, 0x9f, 0x5e, 0x09, 0x4f,
- 0x07, 0xd3, 0xb3, 0x5b, 0x07, 0x6a, 0x2b, 0xa5, 0x88, 0xfb, 0xb5, 0xc7,
- 0x45, 0xcd, 0xfc, 0xe0, 0xce, 0xb6, 0x31, 0xb2, 0xb3, 0x5e, 0x56, 0x5c,
- 0x81, 0xf5, 0x61, 0x75, 0x4f, 0x3d, 0x38, 0xb6, 0x3d, 0x22, 0x19, 0x6a,
- 0x93, 0x64, 0xaf, 0xe8, 0x95, 0x1d, 0xa2, 0xdf, 0x2b, 0xf9, 0x61, 0xb7,
- 0x4f, 0xae, 0x53, 0xbf, 0xb0, 0x57, 0xdc, 0xde, 0x63, 0xfa, 0xf4, 0xcb,
- 0xef, 0xb5, 0xce, 0xc5, 0xd6, 0xbd, 0xca, 0x5a, 0x77, 0xd5, 0x63, 0x84,
- 0xfd, 0x03, 0x57, 0x59, 0xeb, 0xb6, 0x7a, 0xf8, 0xcc, 0xae, 0xba, 0xca,
- 0xf6, 0x62, 0x22, 0x84, 0xe4, 0xc3, 0x87, 0x74, 0xb1, 0x10, 0xb1, 0xf3,
- 0x88, 0xb1, 0x4b, 0xfd, 0x6e, 0xda, 0xee, 0x42, 0xaa, 0x2e, 0xc5, 0xa8,
- 0x9b, 0xb2, 0xfc, 0xc8, 0x1e, 0x2e, 0xc6, 0x32, 0xa6, 0xd5, 0x03, 0xcd,
- 0x71, 0xe5, 0x63, 0x99, 0xc1, 0x9d, 0xd1, 0xe8, 0x9b, 0x9d, 0xac, 0x99,
- 0x58, 0x09, 0xb8, 0xe3, 0x20, 0x53, 0x52, 0x63, 0xf4, 0x41, 0x85, 0x06,
- 0x32, 0x18, 0x85, 0x2d, 0x68, 0x1e, 0xac, 0x8b, 0xf1, 0xb1, 0xd3, 0xd0,
- 0xb6, 0x50, 0x7e, 0x97, 0x81, 0x12, 0x09, 0x9e, 0xfd, 0x8c, 0x8c, 0xca,
- 0xdd, 0x80, 0x5c, 0x93, 0x63, 0xeb, 0xa1, 0x7d, 0x2e, 0xb6, 0x4d, 0x7b,
- 0x8c, 0xd1, 0x11, 0x91, 0xd9, 0x4d, 0x68, 0x89, 0xe5, 0xe2, 0xff, 0xd0,
- 0xc2, 0xc2, 0xee, 0xe7, 0xc0, 0x19, 0xd0, 0x25, 0x0f, 0x77, 0x79, 0x41,
- 0x36, 0x2e, 0x9b, 0xb1, 0x0f, 0xf7, 0x99, 0xbb, 0xcc, 0xc5, 0xd5, 0xba,
- 0x1d, 0x16, 0x67, 0x2b, 0x97, 0xc0, 0x78, 0x6c, 0x9f, 0x5d, 0x0a, 0x93,
- 0x76, 0x02, 0x7d, 0x86, 0xcb, 0xd0, 0x96, 0x11, 0x1f, 0x67, 0xd7, 0x79,
- 0xf1, 0x28, 0xdf, 0x8f, 0xe2, 0x1b, 0x52, 0x60, 0x43, 0xb3, 0x81, 0x6d,
- 0x54, 0xb2, 0xb8, 0x38, 0x84, 0x41, 0x99, 0xfb, 0x0f, 0x8a, 0x89, 0x54,
- 0x48, 0xf8, 0x48, 0x54, 0x78, 0x0e, 0xd1, 0x89, 0x7a, 0x2c, 0x08, 0x04,
- 0x91, 0x4f, 0x96, 0x94, 0xc2, 0x1c, 0x29, 0xd3, 0x16, 0x78, 0x39, 0x8c,
- 0x12, 0xc0, 0xa9, 0x0b, 0xb7, 0x14, 0xd3, 0x5c, 0xb1, 0x16, 0x56, 0xd7,
- 0x5b, 0x31, 0xd9, 0x54, 0xc3, 0x1b, 0x7b, 0x43, 0x8a, 0xa1, 0xeb, 0xf3,
- 0x0f, 0x8a, 0x29, 0x23, 0xe2, 0x16, 0xb5, 0x97, 0x0e, 0x8b, 0x6d, 0xc2,
- 0x1b, 0xb5, 0xaf, 0xe7, 0xa3, 0x9f, 0x3c, 0x7a, 0x2b, 0xc0, 0xfd, 0xab,
- 0x53, 0xeb, 0x28, 0xc5, 0xe0, 0xc2, 0xa3, 0x40, 0x25, 0xff, 0x32, 0x65,
- 0xad, 0x8a, 0x16, 0xf4, 0xa1, 0xde, 0xa5, 0x5c, 0x9e, 0xa1, 0x33, 0x0b,
- 0x2e, 0xb7, 0xdb, 0xde, 0x32, 0x80, 0x96, 0x3c, 0x4a, 0xc4, 0xe7, 0x52,
- 0xa4, 0x4e, 0x53, 0xa2, 0x12, 0x7f, 0xb6, 0x28, 0x7e, 0xe5, 0x08, 0xb2,
- 0x1f, 0xf4, 0xdc, 0xc4, 0x8c, 0x34, 0x74, 0x15, 0x3d, 0x7f, 0xfc, 0xf1,
- 0xf9, 0x5d, 0x8e, 0x3c, 0x23, 0x7c, 0x48, 0x51, 0x89, 0x1e, 0x9d, 0x47,
- 0x1b, 0xc8, 0x15, 0x56, 0x80, 0xc1, 0x0c, 0x0e, 0x28, 0xd4, 0x11, 0x11,
- 0xec, 0x67, 0x0f, 0x8b, 0xce, 0x47, 0x34, 0x03, 0x4e, 0x2e, 0x67, 0x71,
- 0x20, 0x90, 0x63, 0xe2, 0xde, 0xcc, 0x24, 0x41, 0xce, 0xa8, 0xc8, 0x74,
- 0x7a, 0x9a, 0xec, 0x51, 0x37, 0x0d, 0x5d, 0xff, 0xf1, 0x33, 0xc3, 0x1a,
- 0x9b, 0x9b, 0x61, 0x5b, 0xdf, 0xbe, 0x7d, 0x74, 0x34, 0x89, 0x95, 0x61,
- 0x4f, 0x40, 0x28, 0x3e, 0x66, 0x1b, 0x91, 0x37, 0x2c, 0x72, 0x5a, 0x41,
- 0x6a, 0xaa, 0xaa, 0xba, 0x33, 0x04, 0x9c, 0x9b, 0x91, 0x52, 0x9e, 0xc0,
- 0xdf, 0x47, 0x06, 0xbf, 0xfa, 0xa5, 0x61, 0x9a, 0x90, 0x96, 0x31, 0x78,
- 0xc8, 0x17, 0x0b, 0xb7, 0x35, 0xf9, 0xad, 0x01, 0xc1, 0x43, 0x0d, 0x29,
- 0x72, 0x5c, 0x6b, 0x50, 0x4a, 0x0c, 0x55, 0xa5, 0xe1, 0x3c, 0x58, 0xdf,
- 0x9c, 0x12, 0xf8, 0xfe, 0x8e, 0xd4, 0x6d, 0x9f, 0x52, 0x73, 0x0a, 0x62,
- 0xf0, 0xea, 0x3a, 0xc5, 0x3d, 0xa4, 0x05, 0xd6, 0x4b, 0x21, 0xf8, 0x6b,
- 0x17, 0x82, 0x6a, 0xba, 0x65, 0x07, 0xeb, 0xa6, 0x0c, 0xf2, 0x76, 0x48,
- 0xd7, 0x43, 0xd4, 0x91, 0xfd, 0xf1, 0xc6, 0xd2, 0x4a, 0x25, 0x05, 0xaf,
- 0x30, 0x52, 0xa1, 0x61, 0x07, 0x34, 0xa7, 0x4b, 0x9a, 0xbe, 0xe4, 0xe3,
- 0x65, 0x43, 0x81, 0x46, 0x47, 0xec, 0x15, 0x01, 0xa5, 0x4b, 0x16, 0x10,
- 0xbe, 0x66, 0xd3, 0x19, 0x3f, 0x4d, 0xaf, 0x87, 0x65, 0x95, 0xd3, 0x8d,
- 0x03, 0x1c, 0x9c, 0x36, 0x46, 0x3b, 0xbf, 0x0f, 0x89, 0x42, 0x36, 0x45,
- 0xac, 0x39, 0x0d, 0xbd, 0x30, 0xab, 0x58, 0x12, 0x36, 0x3d, 0xc7, 0x7e,
- 0xa5, 0xdf, 0xd9, 0x56, 0xb5, 0x42, 0x73, 0x2c, 0x42, 0xc9, 0x09, 0x35,
- 0xae, 0x04, 0x92, 0x22, 0x06, 0xec, 0x68, 0xdd, 0x40, 0x29, 0x32, 0x66,
- 0x36, 0x5e, 0x85, 0xe4, 0xd0, 0xd0, 0x43, 0x91, 0xd7, 0xf5, 0x12, 0x0b,
- 0xf6, 0xe6, 0xe4, 0xf4, 0xd8, 0x82, 0x82, 0xfe, 0xf7, 0xce, 0x90, 0xa6,
- 0xbc, 0x9a, 0x04, 0x10, 0x28, 0x4e, 0xca, 0xf2, 0x32, 0xec, 0x24, 0x6b,
- 0xeb, 0xdb, 0x3e, 0x17, 0x8c, 0xc1, 0x8f, 0x5b, 0x29, 0x5b, 0xc7, 0xef,
- 0xbe, 0x3b, 0xb9, 0x38, 0x7b, 0xf7, 0xf6, 0xf8, 0x9d, 0xf5, 0xf6, 0xd2,
- 0xa1, 0x88, 0xb1, 0xbe, 0xd6, 0x61, 0xc8, 0x37, 0xa7, 0x78, 0x01, 0x51,
- 0x0f, 0xa2, 0xd2, 0x15, 0x51, 0x6d, 0x2c, 0x16, 0xf2, 0xaf, 0xa1, 0xdf,
- 0x9c, 0xf7, 0x90, 0x7a, 0x7c, 0x29, 0x10, 0xbf, 0x20, 0x73, 0x7f, 0x4a,
- 0x81, 0xb7, 0x21, 0xfb, 0x88, 0x6d, 0xc1, 0x2d, 0x22, 0x9e, 0xfd, 0x34,
- 0xc9, 0xa4, 0xe0, 0x28, 0x15, 0x57, 0xda, 0xb0, 0x53, 0xc2, 0x61, 0x22,
- 0x17, 0x4c, 0x6b, 0x75, 0xc2, 0x6d, 0xee, 0xf7, 0xb5, 0x60, 0xb5, 0x92,
- 0xe8, 0x68, 0x18, 0x00, 0xde, 0xb8, 0x92, 0x9d, 0x9c, 0xdb, 0xa9, 0xee,
- 0x79, 0x61, 0x9d, 0x76, 0x37, 0xa0, 0x4b, 0xb8, 0xf5, 0x6b, 0x83, 0x75,
- 0xe3, 0x7e, 0xde, 0x28, 0x7e, 0x54, 0x1f, 0xc2, 0xc1, 0xce, 0xce, 0xcf,
- 0x28, 0x4b, 0xf7, 0x85, 0xd4, 0xa5, 0x0b, 0x69, 0xcc, 0x6a, 0xaf, 0x1b,
- 0x2e, 0xe3, 0x42, 0x53, 0x78, 0x68, 0xdf, 0xda, 0xe9, 0x84, 0x73, 0xf0,
- 0xc3, 0xf9, 0xc5, 0xd9, 0x0f, 0x7f, 0xf9, 0x8d, 0x3f, 0xe1, 0x61, 0x75,
- 0x7e, 0x24, 0x08, 0x9b, 0x36, 0xfe, 0xf3, 0x6f, 0xfe, 0xb5, 0x76, 0xf3,
- 0x7d, 0xaf, 0x78, 0x6a, 0xb4, 0x72, 0x2e, 0x17, 0xec, 0xce, 0x6b, 0x8d,
- 0x57, 0xc8, 0x0f, 0x9c, 0xed, 0x6b, 0x61, 0x34, 0xb8, 0xe4, 0xea, 0xf6,
- 0x06, 0xed, 0xba, 0xe9, 0xc0, 0xf6, 0x80, 0xf4, 0x3c, 0x07, 0x80, 0xec,
- 0x4b, 0x9e, 0x26, 0x25, 0x62, 0xf6, 0x91, 0xe0, 0x07, 0x38, 0x9f, 0x9d,
- 0x8f, 0xc3, 0xd3, 0xd3, 0xdf, 0x74, 0x12, 0x50, 0xda, 0xcb, 0x8d, 0x65,
- 0x60, 0x75, 0x54, 0x2d, 0x45, 0xb8, 0x9e, 0x4d, 0xee, 0xdd, 0x99, 0xf4,
- 0xe6, 0x25, 0xd4, 0xe3, 0x41, 0x9d, 0x19, 0xa5, 0x96, 0xaa, 0x29, 0x27,
- 0x33, 0x42, 0xc4, 0x18, 0x6b, 0x9b, 0x3a, 0x16, 0xd4, 0xf0, 0xc2, 0x2f,
- 0xe1, 0x15, 0x87, 0xfd, 0x04, 0x38, 0x1a, 0xcf, 0x22, 0x67, 0x13, 0x01,
- 0xee, 0x5d, 0x5a, 0x8a, 0x0f, 0x2e, 0x30, 0xa8, 0xd5, 0xe8, 0xc3, 0xfa,
- 0x65, 0xb8, 0x14, 0xe8, 0x9a, 0xad, 0xf2, 0xfa, 0x23, 0xa0, 0xf0, 0x74,
- 0x30, 0xa1, 0xec, 0x6a, 0x2e, 0x2c, 0xe9, 0xba, 0xe8, 0xca, 0x6a, 0x16,
- 0xf0, 0x27, 0xc4, 0xa0, 0x85, 0x4b, 0x25, 0x7a, 0x4a, 0xb5, 0x78, 0x90,
- 0x5f, 0x39, 0x15, 0xc9, 0xe4, 0x1d, 0x41, 0x79, 0xe5, 0xe5, 0xd0, 0xd0,
- 0x01, 0xb5, 0x27, 0xd4, 0xcb, 0xc9, 0x62, 0x78, 0x8c, 0x4e, 0xde, 0x2b,
- 0x56, 0x2a, 0x91, 0x61, 0x1e, 0x24, 0xca, 0x4b, 0xae, 0x8b, 0x5c, 0x6d,
- 0x83, 0x4f, 0x89, 0xa6, 0xba, 0xf3, 0x84, 0xf8, 0xf9, 0x30, 0xfa, 0x9b,
- 0xc7, 0x34, 0x47, 0x2a, 0x38, 0x7c, 0x0e, 0x84, 0x34, 0x90, 0xcb, 0xc7,
- 0xfc, 0x41, 0x08, 0xc4, 0x46, 0xf6, 0x26, 0x60, 0xa2, 0x39, 0xa7, 0x84,
- 0xf7, 0x45, 0x67, 0x0f, 0xa0, 0x10, 0xe1, 0x08, 0x22, 0x3d, 0x5e, 0xd9,
- 0xe5, 0x48, 0x74, 0xce, 0x3c, 0x46, 0x4e, 0x50, 0x26, 0x3f, 0x68, 0xb5,
- 0xe7, 0xfa, 0x8b, 0xde, 0x6a, 0x5f, 0x59, 0x6b, 0xc2, 0x46, 0x89, 0x05,
- 0x41, 0xcc, 0x7a, 0xf3, 0x0e, 0x35, 0xff, 0xbd, 0x3c, 0x3b, 0x3a, 0x3b,
- 0x35, 0x7f, 0x39, 0x7e, 0x73, 0xf2, 0x83, 0xbb, 0xc4, 0x78, 0x03, 0xb4,
- 0xe0, 0xf0, 0xae, 0xd6, 0xa4, 0x3d, 0x35, 0x0c, 0x64, 0x8a, 0x31, 0x5f,
- 0x74, 0x98, 0xdb, 0xbc, 0x63, 0x29, 0x15, 0x23, 0x5b, 0xd5, 0x1f, 0x85,
- 0x7c, 0x83, 0x94, 0x3e, 0x6e, 0xd9, 0x42, 0xa7, 0xdd, 0xce, 0xa4, 0x8c,
- 0x08, 0xff, 0x54, 0x0a, 0xf6, 0xcc, 0x27, 0xdb, 0x48, 0xfc, 0x7d, 0x28,
- 0x9d, 0x2b, 0x2b, 0x5b, 0x8b, 0xa8, 0xf1, 0x2b, 0xdd, 0x75, 0x18, 0x94,
- 0x3d, 0x66, 0x3d, 0xa3, 0x90, 0xf9, 0x83, 0xb4, 0xe5, 0xe9, 0x9a, 0x2a,
- 0xc3, 0x21, 0x46, 0xee, 0x3f, 0xdd, 0x5b, 0x7e, 0x96, 0x77, 0x07, 0x68,
- 0x08, 0x3c, 0xbe, 0x6d, 0xb1, 0x3d, 0x26, 0x99, 0x00, 0x01, 0x04, 0x21,
- 0x78, 0x8e, 0x92, 0xdd, 0x0e, 0x72, 0xc2, 0x55, 0x1a, 0xcd, 0x5c, 0x45,
- 0xd3, 0x83, 0x72, 0xbe, 0x15, 0x89, 0x8b, 0xee, 0x36, 0x45, 0x32, 0x06,
- 0x95, 0x16, 0x95, 0xd2, 0x8e, 0x9d, 0x36, 0xd2, 0x5f, 0xd5, 0x48, 0xda,
- 0x6e, 0xe5, 0xd9, 0xaf, 0x69, 0xe4, 0x59, 0xa7, 0x8d, 0x9b, 0x5f, 0xd5,
- 0x88, 0xad, 0xef, 0x6c, 0x54, 0xa1, 0x1f, 0x4e, 0x2e, 0x93, 0xa3, 0xb3,
- 0xd7, 0x6e, 0x8f, 0x5e, 0x0a, 0x48, 0x08, 0xff, 0xa1, 0xe2, 0xb0, 0x05,
- 0xe1, 0x2b, 0x49, 0x80, 0x72, 0x61, 0x28, 0x6a, 0x0b, 0x40, 0x48, 0xc4,
- 0xe6, 0x6b, 0xcd, 0xf3, 0xc8, 0x2b, 0x66, 0x75, 0xa0, 0x68, 0xbb, 0x4f,
- 0x92, 0xc7, 0x8f, 0xce, 0x89, 0x2d, 0xe2, 0x5a, 0x25, 0x2f, 0x6d, 0x6d,
- 0xa2, 0x0c, 0x4a, 0x2b, 0x4d, 0xc4, 0x1a, 0xa7, 0x44, 0x0a, 0x51, 0x70,
- 0x3a, 0x91, 0xd1, 0x84, 0x0f, 0x95, 0x2f, 0x9b, 0xed, 0x32, 0x47, 0x30,
- 0x01, 0xa1, 0x29, 0x5c, 0x8b, 0x7d, 0xc9, 0xdf, 0xc8, 0x1b, 0xed, 0x8a,
- 0x8f, 0x30, 0xda, 0x53, 0x84, 0x6c, 0x6b, 0xc7, 0x48, 0x55, 0x02, 0x18,
- 0x39, 0x84, 0x86, 0x9c, 0x6a, 0x32, 0x09, 0x34, 0xa1, 0xc2, 0x21, 0x5d,
- 0xb9, 0x5e, 0x57, 0x70, 0x25, 0xd9, 0x26, 0xec, 0x77, 0xf6, 0xf9, 0x8f,
- 0x37, 0x29, 0x0a, 0x7c, 0x9b, 0xf3, 0x27, 0x78, 0x93, 0xfc, 0xef, 0x9e,
- 0x5e, 0xf6, 0xc4, 0x5e, 0xc3, 0x66, 0xf0, 0x33, 0x54, 0xc2, 0x9a, 0x32,
- 0xb0, 0xb0, 0xbe, 0x2f, 0x9a, 0xf4, 0x13, 0xec, 0x30, 0x52, 0x9b, 0x85,
- 0x19, 0xc3, 0xbd, 0xf9, 0x54, 0x2e, 0x63, 0x4b, 0xbf, 0x51, 0x56, 0xd6,
- 0x12, 0x71, 0xf0, 0x01, 0xdf, 0x56, 0xd5, 0xd4, 0x42, 0x61, 0x06, 0xcc,
- 0x6a, 0xaa, 0xce, 0xb5, 0x11, 0x0d, 0xef, 0xea, 0xdb, 0xe6, 0xc3, 0xb6,
- 0xa4, 0x39, 0x7d, 0x00, 0xc1, 0x1d, 0x57, 0x63, 0xc2, 0x52, 0x27, 0x98,
- 0xef, 0x61, 0xd2, 0x06, 0x51, 0x36, 0xf6, 0x4b, 0x3f, 0x7b, 0x49, 0xd5,
- 0xcd, 0x69, 0x29, 0x94, 0x98, 0x48, 0x4f, 0xa4, 0x4a, 0x81, 0xe6, 0x37,
- 0xf7, 0x5a, 0xd9, 0x22, 0x2d, 0x90, 0xa8, 0xd3, 0xc5, 0x0b, 0xea, 0xc2,
- 0x48, 0x1e, 0x83, 0x4b, 0x19, 0x78, 0xc6, 0x7f, 0x1c, 0xe9, 0xcd, 0xed,
- 0xca, 0x16, 0xfb, 0x75, 0xdb, 0x85, 0x4b, 0x43, 0xaf, 0x4e, 0x76, 0x9c,
- 0x4e, 0x10, 0x91, 0x64, 0x28, 0x6e, 0x30, 0x1b, 0x75, 0xc7, 0xcf, 0xf5,
- 0xbc, 0xf3, 0x1d, 0xfd, 0x0c, 0x93, 0x64, 0x5c, 0x5a, 0xba, 0x8e, 0xae,
- 0x57, 0x99, 0x9a, 0x0f, 0x5b, 0xfb, 0xac, 0xbb, 0x45, 0xd4, 0xc9, 0x4b,
- 0x5c, 0x6a, 0xa5, 0x1f, 0xeb, 0xf9, 0x5c, 0xac, 0xd1, 0x8c, 0xb2, 0x7e,
- 0x44, 0x7d, 0xaa, 0xb2, 0x05, 0x15, 0x5c, 0xbe, 0x74, 0x89, 0xc9, 0x08,
- 0x29, 0xc1, 0x9e, 0xc4, 0x54, 0x4f, 0xb4, 0x97, 0x46, 0x21, 0xf2, 0x8d,
- 0x81, 0x17, 0xf2, 0xd9, 0xcb, 0x73, 0xb9, 0xd0, 0xcc, 0x66, 0x28, 0x72,
- 0xbb, 0xf1, 0xa4, 0x88, 0x1c, 0x7e, 0x44, 0x08, 0x28, 0x24, 0x45, 0xeb,
- 0xbf, 0xf5, 0x8d, 0x90, 0x3c, 0x88, 0x2f, 0x03, 0xe7, 0x4f, 0xc4, 0x78,
- 0x97, 0x15, 0xe7, 0xbd, 0x39, 0xca, 0x2c, 0x20, 0x4c, 0xd3, 0xa2, 0xe1,
- 0x01, 0x57, 0x44, 0x72, 0x34, 0x4c, 0xde, 0x86, 0xc0, 0x92, 0xf2, 0xaa,
- 0x91, 0xdc, 0x55, 0x02, 0x2f, 0xf1, 0xec, 0xdc, 0xa4, 0xc5, 0x75, 0xc6,
- 0xaa, 0x96, 0x6b, 0x50, 0x6a, 0x2d, 0xf0, 0xfd, 0x42, 0xa7, 0x1e, 0x7a,
- 0x5d, 0xb1, 0x32, 0x7d, 0xdb, 0xcd, 0xc3, 0xde, 0xae, 0x9d, 0x07, 0x0c,
- 0x8b, 0x72, 0xf0, 0xb1, 0x14, 0x43, 0x63, 0xf6, 0x93, 0xed, 0x7a, 0x97,
- 0x32, 0x77, 0xab, 0xd6, 0xe8, 0x73, 0x7a, 0xab, 0x2e, 0x14, 0x25, 0x75,
- 0x84, 0x60, 0x4a, 0xc4, 0xf5, 0x53, 0x76, 0xab, 0x30, 0x18, 0x8c, 0xd3,
- 0x83, 0xc4, 0x39, 0xd1, 0x87, 0x45, 0x67, 0x45, 0x25, 0x87, 0x5f, 0x60,
- 0x72, 0x13, 0xb4, 0x7c, 0x23, 0x16, 0x9e, 0x62, 0x26, 0x10, 0x2f, 0xca,
- 0x4b, 0x20, 0x72, 0xe6, 0x9e, 0xf4, 0xc6, 0xb3, 0xe7, 0xc6, 0x73, 0x87,
- 0x9d, 0x72, 0x7e, 0x38, 0x1a, 0xe9, 0x3e, 0x39, 0x0a, 0xb7, 0x84, 0x20,
- 0x50, 0x28, 0x19, 0x5c, 0x39, 0x32, 0x42, 0x2b, 0x5e, 0xda, 0xe8, 0x04,
- 0x1f, 0xf7, 0x58, 0xbc, 0xbd, 0x66, 0x31, 0x1d, 0x1f, 0xee, 0x5d, 0x6b,
- 0x12, 0x39, 0x79, 0xb6, 0xe5, 0x49, 0x0b, 0xf6, 0x90, 0x3f, 0xad, 0x98,
- 0x66, 0x64, 0xf3, 0xa9, 0x1f, 0x8e, 0xbc, 0x81, 0x46, 0xfa, 0xb4, 0x8b,
- 0x0a, 0xee, 0x3d, 0x89, 0x0c, 0xfa, 0x3b, 0x1e, 0x55, 0xff, 0x1f, 0x19,
- 0xf4, 0x77, 0x91, 0x41, 0x3f, 0xb5, 0xdf, 0xe2, 0x4f, 0xed, 0xef, 0x7f,
- 0x26, 0x78, 0x67, 0xa6, 0x5f, 0x9f, 0x25, 0xee, 0x63, 0xf2, 0x35, 0x1e,
- 0xb1, 0x79, 0x70, 0xc0, 0xd9, 0x8b, 0xe1, 0xb7, 0xbc, 0xc3, 0xeb, 0x7d,
- 0xea, 0x99, 0x1b, 0xd6, 0x24, 0x45, 0x7b, 0xa4, 0x6a, 0xb2, 0x9c, 0x09,
- 0xc4, 0x8f, 0xf2, 0xf4, 0x10, 0x1a, 0xe2, 0x8e, 0x90, 0x15, 0x4d, 0x1c,
- 0xcc, 0xa3, 0xdd, 0xf0, 0xbe, 0xf3, 0xdc, 0x1a, 0xd2, 0x3b, 0xfb, 0xbc,
- 0x29, 0x29, 0x31, 0x59, 0x2a, 0xb7, 0x62, 0x6b, 0x4e, 0xb3, 0xc6, 0xac,
- 0x89, 0x73, 0x00, 0x71, 0xd2, 0xca, 0x55, 0x95, 0x82, 0xc1, 0x12, 0xd5,
- 0x62, 0x87, 0x2b, 0x38, 0x52, 0x59, 0x8d, 0x4e, 0xa9, 0x18, 0x74, 0x41,
- 0xc0, 0x3d, 0x28, 0x05, 0xe2, 0x38, 0x21, 0x4f, 0x1c, 0x6a, 0xf3, 0x5e,
- 0x59, 0x67, 0x9d, 0xd6, 0x8b, 0xed, 0x07, 0x33, 0xc4, 0x43, 0x6c, 0xe9,
- 0x0c, 0x71, 0xba, 0x9d, 0xbd, 0xcf, 0xec, 0xbc, 0xd9, 0x95, 0x20, 0xcf,
- 0x06, 0xa7, 0xd8, 0x0f, 0xfd, 0x2b, 0x42, 0xc4, 0x89, 0x8b, 0x01, 0x58,
- 0x92, 0xf7, 0x60, 0x5f, 0xca, 0xdb, 0xee, 0x2b, 0x2c, 0x8f, 0xcf, 0x49,
- 0xda, 0x09, 0x8f, 0xe1, 0x30, 0x39, 0x83, 0x27, 0xa6, 0xc5, 0xdd, 0x7a,
- 0xc5, 0x07, 0xc0, 0xe5, 0x5d, 0xb5, 0xb7, 0xee, 0x0b, 0x6f, 0x8d, 0xb5,
- 0x5b, 0x1a, 0x17, 0xdf, 0x11, 0x41, 0xeb, 0x28, 0xa0, 0xd4, 0xe5, 0x98,
- 0x25, 0x17, 0xc7, 0x97, 0x17, 0x80, 0xf5, 0x90, 0x08, 0xe8, 0xde, 0xb9,
- 0x46, 0x24, 0x6c, 0x5b, 0xbe, 0x3f, 0x91, 0x67, 0x4e, 0x29, 0x71, 0x22,
- 0x82, 0x49, 0x61, 0xec, 0x8a, 0xf3, 0x3f, 0xf5, 0x3d, 0xc6, 0xa5, 0x9b,
- 0x35, 0xe7, 0x29, 0x77, 0x3e, 0xfd, 0x36, 0x5d, 0xcd, 0xfe, 0xbe, 0xc3,
- 0x27, 0xa0, 0xfa, 0x15, 0xdf, 0x73, 0x02, 0x37, 0x1d, 0x0a, 0x9c, 0xcb,
- 0x42, 0xb4, 0x6d, 0x75, 0x3f, 0xd6, 0x2c, 0x04, 0xb4, 0x19, 0x04, 0x2e,
- 0xed, 0xc7, 0x55, 0x0d, 0x50, 0x6d, 0xd1, 0x83, 0x0b, 0xe3, 0x93, 0x9e,
- 0x0c, 0xe5, 0x34, 0x9a, 0xa7, 0xbb, 0xbb, 0x61, 0x73, 0xe9, 0xd8, 0x88,
- 0x55, 0x51, 0xed, 0x04, 0x6f, 0x8f, 0x57, 0xd8, 0x73, 0x06, 0x75, 0xb3,
- 0x26, 0xab, 0x65, 0x70, 0x45, 0xae, 0x2c, 0x9a, 0x31, 0x15, 0xd4, 0xde,
- 0xbc, 0xb1, 0x94, 0xf9, 0x1e, 0xf8, 0x7f, 0x99, 0xb3, 0xb6, 0x6c, 0xe1,
- 0xd4, 0x00, 0xad, 0xae, 0x94, 0x2a, 0x00, 0x11, 0x69, 0x75, 0xec, 0x02,
- 0x0d, 0x7b, 0x16, 0x48, 0xf0, 0xfd, 0x67, 0x91, 0x1d, 0x91, 0x8c, 0x2e,
- 0xcf, 0x2e, 0x12, 0xd9, 0x64, 0xe1, 0x0d, 0x8d, 0x48, 0x38, 0x3d, 0x61,
- 0x09, 0x0b, 0xfa, 0x91, 0xfa, 0xce, 0x36, 0xc5, 0xd6, 0x72, 0xc3, 0x79,
- 0x5f, 0x65, 0x19, 0x70, 0x41, 0x49, 0x22, 0x32, 0xb6, 0xef, 0x24, 0xa9,
- 0x56, 0x79, 0x10, 0xf5, 0x64, 0x7a, 0x2f, 0xf1, 0x41, 0x3b, 0xe3, 0x13,
- 0xcc, 0x09, 0xa0, 0x28, 0x53, 0xc2, 0xa9, 0xa0, 0xc4, 0xa3, 0x28, 0x40,
- 0x39, 0x5b, 0x09, 0xa6, 0xbb, 0x17, 0xf9, 0x10, 0x9d, 0x39, 0xa6, 0x4b,
- 0x96, 0xf1, 0x32, 0x48, 0x67, 0x6a, 0xa2, 0x20, 0x11, 0x32, 0x91, 0x98,
- 0x0b, 0x52, 0xf6, 0x10, 0x74, 0x87, 0x40, 0x83, 0x35, 0xc7, 0xa6, 0xac,
- 0x94, 0xfb, 0x4e, 0x2e, 0x4f, 0x35, 0x1f, 0x9c, 0xda, 0xed, 0xdd, 0xfc,
- 0xe7, 0x67, 0x17, 0x97, 0x89, 0xbd, 0xf8, 0xf1, 0x6d, 0xfc, 0xa8, 0x73,
- 0x84, 0x88, 0x26, 0x1e, 0x2e, 0x1c, 0x87, 0xee, 0x0e, 0xdc, 0x52, 0x62,
- 0x22, 0x34, 0xda, 0x84, 0xb6, 0x41, 0x94, 0x2c, 0xc4, 0x4d, 0x3a, 0x65,
- 0x32, 0x88, 0xd4, 0x97, 0x39, 0xc2, 0xdc, 0x42, 0x17, 0x4e, 0xbc, 0xba,
- 0x8f, 0x53, 0x72, 0x9f, 0xec, 0x45, 0x76, 0x07, 0x79, 0xd0, 0x2e, 0x8e,
- 0xa9, 0xd6, 0xf7, 0xe5, 0x0d, 0xff, 0x2d, 0xe8, 0x39, 0xa7, 0xd8, 0xc9,
- 0x0f, 0xa3, 0xe5, 0xe2, 0xb1, 0x3b, 0x28, 0x3e, 0x65, 0xcc, 0x0f, 0xb4,
- 0x6f, 0xf3, 0x44, 0xbd, 0x39, 0x7b, 0xe2, 0x61, 0x91, 0x20, 0x39, 0x65,
- 0xaf, 0xe0, 0x90, 0xe3, 0x07, 0x3d, 0xf9, 0x48, 0xcf, 0xa8, 0x67, 0x7c,
- 0x28, 0x5a, 0xcc, 0xb6, 0x4f, 0x9e, 0x7a, 0xd2, 0x82, 0x6e, 0x2b, 0x69,
- 0xe0, 0x44, 0x8b, 0x29, 0xd1, 0x0f, 0x07, 0xba, 0x5d, 0x70, 0x65, 0xf0,
- 0xc6, 0xe0, 0xe7, 0x5c, 0x3b, 0xcf, 0x6c, 0x3e, 0xb8, 0x2a, 0x0c, 0x5e,
- 0x57, 0xe8, 0xc7, 0x0a, 0x02, 0x81, 0xf2, 0xd6, 0xd9, 0x76, 0x4f, 0x78,
- 0xb7, 0x7f, 0x65, 0x36, 0xbb, 0xc5, 0x34, 0xf1, 0xd0, 0xbd, 0x8b, 0x95,
- 0x34, 0xae, 0xbc, 0x58, 0x66, 0xd0, 0xd4, 0xd2, 0x6a, 0x46, 0x2c, 0xda,
- 0x46, 0x8e, 0x54, 0x92, 0x69, 0x72, 0x17, 0x04, 0xbf, 0x00, 0x1b, 0x72,
- 0xdf, 0x90, 0x5b, 0xe8, 0xe4, 0xf4, 0xd8, 0xad, 0x14, 0x53, 0x70, 0xe3,
- 0x14, 0x3b, 0x8d, 0x9f, 0x0a, 0x20, 0xda, 0xab, 0x62, 0x98, 0x9c, 0x53,
- 0x65, 0x3b, 0x68, 0x4f, 0xf5, 0xbf, 0xbb, 0xd6, 0xf8, 0xa0, 0xc0, 0x13,
- 0x6b, 0x2e, 0x4f, 0x98, 0x2a, 0x79, 0x61, 0x16, 0x16, 0x3f, 0xa1, 0xbf,
- 0x7a, 0x74, 0xb1, 0xc1, 0x70, 0x5f, 0xb8, 0x97, 0x6b, 0x33, 0x14, 0x63,
- 0xb4, 0x77, 0x1f, 0x79, 0x2a, 0xfb, 0xca, 0x58, 0xf4, 0x68, 0x82, 0x3e,
- 0x00, 0xd9, 0x4c, 0xe7, 0x59, 0xcb, 0x38, 0x73, 0x0b, 0x57, 0xfa, 0x8c,
- 0x1a, 0x35, 0xfc, 0x9c, 0x6b, 0x8a, 0x2f, 0x84, 0xc3, 0xb1, 0x2d, 0x9b,
- 0x40, 0x20, 0x42, 0x52, 0xe7, 0x4c, 0x5b, 0x05, 0x49, 0xdb, 0x99, 0x45,
- 0xe2, 0xfa, 0xb1, 0x40, 0xcc, 0xad, 0xa5, 0x5d, 0xe9, 0x4e, 0x6e, 0xa7,
- 0x4c, 0xdf, 0x53, 0xde, 0x89, 0x76, 0xdb, 0xd8, 0x3b, 0xac, 0xd5, 0x3b,
- 0x41, 0x2f, 0x0a, 0x7d, 0x14, 0x39, 0x12, 0xc8, 0x2f, 0x6c, 0xae, 0x78,
- 0xdf, 0x04, 0x78, 0xfa, 0xcc, 0x35, 0x75, 0x45, 0x19, 0x57, 0xb6, 0x2d,
- 0x27, 0x7f, 0x1c, 0x3b, 0x77, 0x6e, 0x1f, 0x13, 0xab, 0x91, 0xef, 0xb1,
- 0x71, 0x84, 0x44, 0xc9, 0x9f, 0x13, 0xde, 0x0c, 0x97, 0x25, 0x99, 0xc1,
- 0xc5, 0xbd, 0x43, 0xe6, 0x0e, 0x39, 0xba, 0xc8, 0x0e, 0x29, 0xae, 0x01,
- 0x20, 0xbf, 0x11, 0x76, 0xb0, 0x1b, 0xf1, 0xd6, 0x50, 0x6d, 0xa8, 0x80,
- 0xfa, 0x75, 0x39, 0x17, 0x84, 0x9f, 0xf7, 0xa5, 0xcf, 0xc5, 0xb5, 0xc1,
- 0x95, 0xb4, 0x95, 0xc2, 0xc4, 0x8e, 0xc4, 0x4c, 0xb4, 0x58, 0xce, 0x5e,
- 0x8c, 0x7c, 0x0a, 0xe4, 0x99, 0x85, 0x84, 0x87, 0x54, 0x55, 0x44, 0x00,
- 0x84, 0xcb, 0x58, 0x94, 0x5e, 0xf5, 0x32, 0x94, 0x9a, 0xa3, 0x27, 0xe1,
- 0x62, 0x79, 0x8e, 0x7f, 0xb5, 0x9a, 0x81, 0xa3, 0xca, 0xfe, 0x0a, 0x75,
- 0x72, 0xc8, 0x17, 0x0e, 0x67, 0xdb, 0xf0, 0x28, 0x8b, 0x65, 0xea, 0xd9,
- 0xf4, 0x4f, 0x5f, 0x88, 0xdf, 0x4a, 0xfc, 0x22, 0x5a, 0x43, 0xb2, 0x1b,
- 0x66, 0x7a, 0xb6, 0x67, 0x9d, 0x80, 0x84, 0xa7, 0x13, 0x94, 0xb8, 0x8f,
- 0xaa, 0x33, 0xc2, 0x6d, 0x34, 0xfa, 0x26, 0x79, 0xfb, 0xfa, 0x19, 0x41,
- 0x3b, 0xae, 0xb3, 0x6a, 0x61, 0xac, 0x16, 0x67, 0x98, 0x9f, 0x7d, 0xeb,
- 0x35, 0xb6, 0xef, 0x3c, 0x8a, 0x72, 0xcd, 0xe6, 0x72, 0x7a, 0xc1, 0x99,
- 0x55, 0xdc, 0x53, 0x4e, 0xe2, 0x75, 0x5f, 0xf2, 0x8b, 0xd9, 0x27, 0x46,
- 0x13, 0xe9, 0xd5, 0x52, 0x4e, 0x02, 0xae, 0xa5, 0x8e, 0x00, 0x7b, 0xf6,
- 0xc4, 0x09, 0x30, 0x2a, 0x97, 0x4e, 0x6c, 0x7f, 0xd7, 0x64, 0x1d, 0x44,
- 0x4e, 0xd4, 0x33, 0x16, 0x9a, 0x47, 0x7c, 0xee, 0x49, 0x95, 0x0d, 0x5f,
- 0x83, 0x92, 0x8e, 0x70, 0xa7, 0xf7, 0xde, 0x33, 0xdf, 0xb7, 0x40, 0xbc,
- 0x83, 0x80, 0xcc, 0x30, 0xdb, 0x38, 0xf4, 0x14, 0xef, 0xd9, 0xe7, 0xf6,
- 0x59, 0xf2, 0x24, 0xe5, 0x85, 0x57, 0x1d, 0x62, 0xc5, 0x1b, 0xa2, 0x00,
- 0xab, 0x99, 0xa0, 0xa4, 0x29, 0xac, 0xf5, 0x78, 0x73, 0xef, 0xbd, 0xf2,
- 0xa2, 0xed, 0x3a, 0x01, 0x35, 0xb3, 0xdd, 0x9a, 0x18, 0x54, 0xbe, 0xb8,
- 0xf1, 0x0f, 0xe7, 0x73, 0xbe, 0xa5, 0xcf, 0x09, 0x24, 0xd9, 0x5a, 0x4f,
- 0x15, 0x82, 0x99, 0x9f, 0x89, 0xaf, 0x67, 0x9d, 0xf7, 0xfe, 0xd1, 0xe1,
- 0xaa, 0x14, 0x01, 0xec, 0x76, 0xef, 0x23, 0x7b, 0x72, 0x66, 0xa8, 0xb8,
- 0xd9, 0x75, 0x91, 0xff, 0x3d, 0xf3, 0x50, 0x41, 0x5a, 0xd9, 0xc3, 0x7b,
- 0x7c, 0x5f, 0x04, 0xc6, 0x6d, 0x3a, 0xcb, 0x45, 0x28, 0x52, 0x10, 0xcd,
- 0x3d, 0xf0, 0x44, 0x76, 0x2d, 0x97, 0x73, 0xe3, 0x18, 0x38, 0x15, 0x64,
- 0xa4, 0x10, 0x6e, 0xd6, 0x02, 0xdd, 0x3e, 0x7f, 0x2a, 0x7a, 0x97, 0x2a,
- 0xc8, 0x74, 0xf3, 0xd2, 0x44, 0xcc, 0xc0, 0x6b, 0xd6, 0x15, 0xd3, 0xcf,
- 0xe5, 0xda, 0x93, 0xa5, 0x94, 0x7a, 0x7c, 0xa9, 0xab, 0x93, 0x42, 0x7f,
- 0xbd, 0xcb, 0x0b, 0x01, 0xc2, 0x06, 0xaf, 0x3f, 0x5f, 0xe1, 0x8f, 0x94,
- 0x1a, 0xe5, 0xc7, 0xd8, 0x4b, 0xde, 0xf3, 0x9f, 0xd9, 0x93, 0xe0, 0x91,
- 0xc2, 0x29, 0x1b, 0x58, 0xdf, 0xf3, 0x40, 0xd8, 0x83, 0x24, 0x5e, 0x94,
- 0x4c, 0x29, 0xa4, 0x23, 0x94, 0xbd, 0x57, 0xf6, 0xf3, 0xb3, 0xf2, 0x3a,
- 0xf1, 0xa9, 0x0d, 0x9e, 0xf3, 0x96, 0x7a, 0x03, 0x26, 0x70, 0x3d, 0x07,
- 0x24, 0x4d, 0xfc, 0x8a, 0xa4, 0xee, 0xe9, 0x17, 0xb2, 0x37, 0xf4, 0xbe,
- 0xb4, 0x26, 0xeb, 0xaa, 0x37, 0x3e, 0xdb, 0xf5, 0x15, 0xd6, 0x29, 0x85,
- 0xe9, 0x38, 0xc9, 0x76, 0xe5, 0x0b, 0xbc, 0x33, 0x4e, 0x66, 0x54, 0xdc,
- 0x73, 0xa6, 0x25, 0x43, 0x95, 0x14, 0xcc, 0x3d, 0xb6, 0xdf, 0x12, 0xba,
- 0x97, 0xbe, 0xfa, 0x94, 0x9c, 0xbc, 0xf6, 0x1e, 0x7c, 0xe2, 0x06, 0x98,
- 0xce, 0x48, 0x1b, 0xb8, 0x67, 0x77, 0x55, 0x2d, 0xc5, 0x4a, 0xbd, 0x47,
- 0x79, 0x67, 0xbc, 0x2b, 0x99, 0xbc, 0x06, 0xf3, 0x1f, 0x3c, 0xc3, 0xdb,
- 0xe1, 0xe8, 0xc6, 0xdc, 0x6a, 0x93, 0x06, 0xe8, 0xc0, 0x42, 0x83, 0x47,
- 0xdd, 0xb5, 0xff, 0xec, 0xf9, 0x9a, 0x67, 0xe5, 0xd2, 0xac, 0xed, 0x55,
- 0xef, 0xbd, 0xf7, 0x59, 0x78, 0xcc, 0xd5, 0x24, 0x50, 0x0c, 0xb3, 0x9c,
- 0xb4, 0x64, 0x8b, 0xf2, 0x28, 0xff, 0x5d, 0xfd, 0x83, 0x15, 0xd1, 0x72,
- 0xd5, 0xff, 0xee, 0xf7, 0xf7, 0x73, 0x3f, 0xc3, 0x87, 0x3d, 0x83, 0x55,
- 0x86, 0xc0, 0xc1, 0xa4, 0xc5, 0xc3, 0xed, 0xb0, 0x22, 0x98, 0x1d, 0xaf,
- 0x05, 0x5e, 0x73, 0xa3, 0x47, 0x2c, 0x0b, 0x27, 0x39, 0xd8, 0x08, 0x94,
- 0xb4, 0xe5, 0xa9, 0xcf, 0xe0, 0x46, 0x32, 0x5f, 0x7c, 0x51, 0x9e, 0x27,
- 0x75, 0xb7, 0x73, 0x0c, 0xea, 0x9b, 0x25, 0x5b, 0xdd, 0x76, 0x44, 0xce,
- 0xcd, 0xe6, 0xbd, 0xb6, 0xef, 0xa4, 0x97, 0x5c, 0xfb, 0x0c, 0x47, 0x3f,
- 0xa2, 0x28, 0x25, 0x9b, 0xe6, 0x96, 0x9d, 0x19, 0xae, 0xf2, 0xaa, 0x64,
- 0xcf, 0x21, 0x25, 0xc3, 0x6f, 0xa5, 0xf1, 0xd4, 0x11, 0xc1, 0x15, 0x7b,
- 0x9f, 0x11, 0xd5, 0x86, 0xa0, 0x2e, 0x66, 0x95, 0x6e, 0xb2, 0xc9, 0x47,
- 0x3d, 0x32, 0xb6, 0x8d, 0xc8, 0x5b, 0x4f, 0xed, 0xd4, 0xd2, 0xee, 0x3b,
- 0xbf, 0x38, 0xee, 0x1a, 0x01, 0xee, 0x51, 0xde, 0x35, 0x17, 0x97, 0xa3,
- 0xf3, 0x03, 0xea, 0x2f, 0x07, 0xe4, 0xcc, 0x81, 0x38, 0x1a, 0x65, 0x7f,
- 0x93, 0x24, 0x94, 0xda, 0x3d, 0xfd, 0x7c, 0xc5, 0xd3, 0x23, 0x71, 0xf1,
- 0x9d, 0x4c, 0x49, 0xfa, 0x9a, 0x75, 0xf0, 0x5f, 0xfa, 0x4c, 0xb0, 0x7d,
- 0xea, 0xea, 0x67, 0x47, 0x18, 0xf5, 0x0c, 0xd2, 0x90, 0x22, 0xef, 0xee,
- 0xe1, 0xcf, 0x9d, 0xbf, 0xe6, 0x66, 0x59, 0x7c, 0xb4, 0xfa, 0xa2, 0xd0,
- 0x51, 0xe9, 0x02, 0xbb, 0x17, 0x5e, 0xe8, 0xd1, 0xf0, 0xbc, 0xa1, 0x16,
- 0xff, 0xd2, 0x17, 0x2f, 0x85, 0x96, 0x27, 0xe5, 0x60, 0xa2, 0x91, 0xaf,
- 0x4b, 0x6f, 0x0e, 0x5e, 0xec, 0xda, 0xeb, 0x57, 0x98, 0x2d, 0x3e, 0x66,
- 0xf7, 0x6e, 0xd7, 0x71, 0xbc, 0xde, 0xa8, 0x8b, 0x79, 0x41, 0x4e, 0x08,
- 0xf7, 0x88, 0x6d, 0xe0, 0x87, 0x1f, 0x58, 0xc6, 0x97, 0xca, 0xfd, 0x21,
- 0x71, 0x26, 0x5b, 0xf3, 0xc2, 0xc8, 0x44, 0x66, 0xc9, 0xa4, 0xe3, 0x85,
- 0xe8, 0x4c, 0x95, 0xcd, 0x32, 0x62, 0xd3, 0x63, 0x1b, 0x05, 0x1b, 0x7b,
- 0x10, 0xd8, 0x7b, 0x28, 0xfb, 0xc4, 0x81, 0x4a, 0x2e, 0x43, 0x6f, 0x26,
- 0xaf, 0x20, 0xdf, 0x98, 0xf8, 0xaa, 0xcc, 0x8a, 0x1f, 0xbe, 0xbf, 0xfc,
- 0xe6, 0xec, 0x62, 0x94, 0xec, 0x50, 0x5a, 0xea, 0xe5, 0xc5, 0xc9, 0x57,
- 0xef, 0x8d, 0xe9, 0x6f, 0x63, 0x74, 0xaf, 0xd3, 0x22, 0x37, 0x37, 0x47,
- 0x32, 0x6a, 0xb2, 0xc2, 0x2c, 0xe4, 0xb5, 0xd6, 0xa6, 0x00, 0xe3, 0x0e,
- 0xdd, 0x95, 0x65, 0xc5, 0xf5, 0x89, 0x40, 0x0b, 0x70, 0x53, 0xca, 0x6a,
- 0x30, 0x6f, 0x55, 0xc1, 0x38, 0xac, 0xd2, 0xd9, 0xb5, 0x79, 0x3b, 0xd5,
- 0x38, 0x51, 0x68, 0x45, 0x72, 0xf9, 0xcd, 0xe1, 0xbb, 0x6f, 0x47, 0x4a,
- 0x5b, 0xfe, 0xfd, 0xf7, 0xdf, 0xfb, 0x90, 0x9f, 0xfa, 0x60, 0x67, 0x07,
- 0x3a, 0xe6, 0x4d, 0xfa, 0xe9, 0xd3, 0xb0, 0xce, 0x36, 0x36, 0x46, 0xc7,
- 0xc7, 0xc9, 0xe1, 0xe9, 0xe8, 0x6c, 0xc3, 0x25, 0x63, 0x6f, 0xed, 0x6d,
- 0x1b, 0x1d, 0xea, 0x3a, 0x6b, 0xcc, 0x5f, 0x36, 0x36, 0x4e, 0x0f, 0x2f,
- 0xc9, 0x70, 0x95, 0xa2, 0xa8, 0x34, 0xcf, 0xc4, 0xab, 0x90, 0xce, 0xee,
- 0x88, 0x47, 0xee, 0x2a, 0x07, 0xda, 0xf9, 0x4e, 0xeb, 0xa9, 0x0b, 0xb5,
- 0x22, 0xeb, 0xe4, 0x8c, 0x88, 0xba, 0x23, 0xb2, 0x0b, 0x41, 0x2c, 0x11,
- 0x1a, 0xd3, 0x0c, 0x49, 0x29, 0xc2, 0x36, 0x12, 0xe7, 0xbd, 0xe2, 0x5c,
- 0xfc, 0x6c, 0xcc, 0x35, 0x71, 0xfb, 0x0c, 0x3d, 0x44, 0xf8, 0xca, 0x23,
- 0x20, 0x58, 0x31, 0x84, 0x13, 0xe2, 0x05, 0x4d, 0xde, 0x8f, 0x0e, 0xbf,
- 0x3e, 0xa6, 0x67, 0xbf, 0xce, 0x1a, 0x37, 0xb3, 0x5c, 0xf8, 0x9d, 0xbe,
- 0xf2, 0x2e, 0x6b, 0xea, 0x49, 0xba, 0xc8, 0x36, 0xa9, 0x4f, 0xe3, 0x81,
- 0x70, 0xee, 0xbb, 0xc6, 0x59, 0xad, 0x77, 0x85, 0x02, 0x0a, 0x79, 0x1e,
- 0x94, 0xfe, 0x7e, 0xbb, 0x17, 0xc7, 0x87, 0xaf, 0xdf, 0x1e, 0x6b, 0x59,
- 0x65, 0xbe, 0x82, 0x4d, 0xa3, 0x37, 0x54, 0x6c, 0xda, 0xc5, 0x3e, 0xe8,
- 0x9a, 0x5f, 0x9a, 0x36, 0xcc, 0x6f, 0xa8, 0xf6, 0x73, 0xfc, 0x73, 0xae,
- 0x7e, 0x00, 0x9e, 0x1d, 0x5e, 0xe5, 0x3b, 0xdc, 0xba, 0x7e, 0x2f, 0xb5,
- 0x73, 0xc2, 0x83, 0x48, 0x55, 0xf5, 0x65, 0xdf, 0x04, 0x7c, 0x1a, 0x9f,
- 0xef, 0xee, 0xee, 0xae, 0x19, 0x07, 0x2c, 0x03, 0xb9, 0x40, 0xcd, 0x50,
- 0x0e, 0xe8, 0xf1, 0x1d, 0xd7, 0xbe, 0xeb, 0x31, 0x6d, 0x37, 0xac, 0xdb,
- 0x15, 0x99, 0xd6, 0xb8, 0x76, 0xf3, 0x26, 0x8b, 0x77, 0x79, 0x52, 0x96,
- 0x76, 0x05, 0x5a, 0x93, 0x83, 0x8a, 0xb7, 0x79, 0xe3, 0x51, 0xfe, 0x69,
- 0xc7, 0x8d, 0x31, 0x03, 0x9a, 0xa9, 0xea, 0xbe, 0xdb, 0x24, 0xfd, 0x06,
- 0xc0, 0x94, 0x49, 0x33, 0x2c, 0xab, 0xeb, 0x9d, 0xf9, 0x01, 0xb4, 0x13,
- 0xf3, 0xd0, 0x1b, 0x82, 0xb9, 0x26, 0x46, 0xcb, 0xb5, 0x14, 0x12, 0x35,
- 0x4d, 0x6c, 0x69, 0xae, 0xa5, 0x47, 0xf4, 0xeb, 0x17, 0xcc, 0x02, 0xb3,
- 0xff, 0x5c, 0xe9, 0xc8, 0xb5, 0x9e, 0x5e, 0xe4, 0x23, 0xb4, 0xff, 0xe0,
- 0x39, 0x1c, 0x1a, 0x59, 0x60, 0xbe, 0x42, 0x34, 0x54, 0xd8, 0x22, 0xe6,
- 0xaf, 0x95, 0xd9, 0x32, 0xc3, 0xe6, 0x13, 0x44, 0xa8, 0x14, 0xf9, 0xe4,
- 0x8c, 0x41, 0x82, 0x37, 0x2c, 0xa8, 0xa0, 0x78, 0x45, 0xd4, 0xb0, 0xfc,
- 0x05, 0x73, 0x80, 0x48, 0x88, 0x5c, 0xcb, 0xc4, 0x01, 0xcd, 0x47, 0x0d,
- 0x77, 0xbf, 0x39, 0x18, 0x60, 0xff, 0xd4, 0x76, 0xb7, 0x3c, 0xe2, 0xe3,
- 0xde, 0xa0, 0x78, 0xf6, 0x0b, 0xb9, 0x71, 0xbd, 0xbd, 0x33, 0x32, 0xbd,
- 0x08, 0xbe, 0xb5, 0x74, 0x75, 0x4a, 0x6b, 0xfe, 0x9c, 0x5f, 0xd8, 0xc2,
- 0xac, 0xc6, 0x0e, 0xa0, 0x9e, 0x8f, 0xfe, 0xc6, 0xd1, 0xb9, 0x65, 0x8c,
- 0x37, 0x63, 0xbf, 0xa5, 0xc1, 0x93, 0xb4, 0x4e, 0x92, 0x2d, 0x12, 0xe7,
- 0xaa, 0xb1, 0x02, 0x63, 0x07, 0xcb, 0x13, 0x45, 0x6b, 0x7c, 0xcb, 0x61,
- 0x4d, 0x0f, 0x0f, 0xcc, 0xd4, 0xd0, 0xed, 0xf0, 0xbf, 0x77, 0x86, 0x75,
- 0x7d, 0xb3, 0x93, 0x4f, 0x3f, 0x54, 0x75, 0x9a, 0xfc, 0xb4, 0xd1, 0xc9,
- 0xa8, 0xec, 0x0e, 0xe2, 0x7f, 0x63, 0x06, 0x7f, 0xd1, 0x4c, 0xad, 0x1e,
- 0xc5, 0xef, 0x31, 0x82, 0xc1, 0x80, 0x5a, 0xd5, 0x2f, 0x7d, 0x30, 0x0f,
- 0x7c, 0xb0, 0x44, 0xbf, 0xbf, 0x62, 0x74, 0x11, 0x51, 0x68, 0x06, 0xc9,
- 0x0c, 0x90, 0x46, 0xb6, 0xc4, 0x37, 0xba, 0x56, 0xab, 0xf8, 0x71, 0x7f,
- 0x77, 0x77, 0xef, 0x60, 0xef, 0xf3, 0x17, 0xbb, 0x07, 0x7b, 0x7b, 0x7b,
- 0xfb, 0x07, 0x7b, 0x07, 0x07, 0xfb, 0xbb, 0x3f, 0xef, 0xf4, 0x56, 0x4d,
- 0xdd, 0xdb, 0xaf, 0x56, 0x34, 0x68, 0x46, 0xdd, 0x63, 0x7a, 0xb9, 0x9f,
- 0xec, 0xe8, 0x31, 0xaa, 0x69, 0x2f, 0xa9, 0xe7, 0x63, 0xc2, 0x75, 0xf1,
- 0xe1, 0xf4, 0x07, 0x53, 0x1b, 0xa5, 0x38, 0xf3, 0x06, 0xf4, 0xfa, 0xec,
- 0xfb, 0x77, 0xa7, 0x67, 0x87, 0xaf, 0x93, 0xcb, 0xb3, 0xe4, 0x10, 0x2e,
- 0xbc, 0x88, 0x9c, 0x04, 0x45, 0x24, 0xc1, 0xa2, 0xb9, 0x8c, 0x87, 0x57,
- 0xce, 0x4a, 0xfc, 0x4d, 0x16, 0xc4, 0x88, 0x4e, 0x74, 0xfb, 0x59, 0xc2,
- 0x44, 0xa3, 0x96, 0x86, 0x37, 0xcd, 0xfc, 0xe1, 0x1b, 0xe1, 0x31, 0x5f,
- 0xee, 0x33, 0xc8, 0xc2, 0x59, 0xe1, 0xe8, 0x8e, 0x9e, 0x7c, 0x29, 0x46,
- 0x2f, 0x71, 0x29, 0x81, 0x27, 0xd8, 0xd2, 0xe9, 0x5b, 0x8c, 0xc1, 0x74,
- 0x55, 0x98, 0xb8, 0xba, 0x57, 0x07, 0x3c, 0x6a, 0xeb, 0xe4, 0x08, 0xfe,
- 0x05, 0xea, 0x0e, 0xe9, 0x97, 0xdb, 0xc1, 0x00, 0xcf, 0x56, 0x0e, 0xc9,
- 0x5c, 0xe6, 0xd9, 0x27, 0x8c, 0xba, 0x2d, 0x7b, 0x99, 0x7f, 0xd0, 0x8d,
- 0x0e, 0x24, 0x4b, 0xea, 0x57, 0xc8, 0x2b, 0xed, 0x32, 0x70, 0x9a, 0x91,
- 0xcf, 0xd1, 0x77, 0x54, 0x24, 0xbb, 0x4f, 0xd0, 0x6f, 0xfc, 0x7b, 0x7c,
- 0xc7, 0x66, 0x9d, 0x72, 0x07, 0xde, 0x8f, 0x4e, 0xde, 0x7d, 0x8d, 0x08,
- 0xf7, 0xf7, 0x67, 0x17, 0xaf, 0x47, 0xa6, 0x59, 0x23, 0xaf, 0xd0, 0xf8,
- 0x65, 0x49, 0x92, 0x50, 0x7a, 0xc5, 0xe7, 0x92, 0x3e, 0xfd, 0x27, 0xde,
- 0x4e, 0x7d, 0xcb, 0x2e, 0x8f, 0x6e, 0x7a, 0xb6, 0x0b, 0x95, 0x10, 0x8a,
- 0xdf, 0x1a, 0xde, 0x6e, 0xfc, 0x72, 0x9e, 0x4e, 0x6e, 0xc8, 0xd8, 0xe6,
- 0xcd, 0x0a, 0xc8, 0xec, 0x0e, 0xa5, 0x74, 0xec, 0x90, 0x0d, 0xb5, 0xd3,
- 0x94, 0xd8, 0x8e, 0x68, 0xa5, 0xac, 0x2c, 0x6e, 0xaf, 0x35, 0x23, 0xb4,
- 0xd7, 0xaf, 0x66, 0xe9, 0x35, 0x3e, 0x18, 0x1e, 0x03, 0xef, 0x63, 0xf2,
- 0xf9, 0xc7, 0x7e, 0x92, 0xae, 0x0d, 0xb4, 0x77, 0x82, 0x0d, 0x80, 0x44,
- 0x1c, 0xd4, 0x45, 0xba, 0xd2, 0x42, 0x1e, 0xa4, 0x3f, 0xa2, 0x48, 0x1b,
- 0xa1, 0xb5, 0x88, 0x6a, 0xb8, 0x5b, 0xe0, 0x06, 0x85, 0x48, 0x99, 0x6d,
- 0xdb, 0xe8, 0xd8, 0x0e, 0xcf, 0x2b, 0x05, 0x46, 0xd0, 0x92, 0xe7, 0xce,
- 0xa9, 0x1d, 0xbc, 0xd8, 0x95, 0xe2, 0xe5, 0x29, 0xa7, 0xce, 0x10, 0x88,
- 0x91, 0xe1, 0xf1, 0x84, 0x63, 0x14, 0x85, 0xb6, 0x47, 0x14, 0xf6, 0x84,
- 0x42, 0xea, 0xe1, 0x8a, 0x6b, 0x71, 0x83, 0xb9, 0xc8, 0x77, 0xdd, 0x98,
- 0xae, 0xa4, 0x54, 0x12, 0x81, 0xa1, 0x08, 0x42, 0xb8, 0x61, 0x6b, 0xd8,
- 0xf7, 0x14, 0xcb, 0xc4, 0xad, 0xe4, 0x35, 0xd3, 0x96, 0xd8, 0x0a, 0x24,
- 0x74, 0x79, 0xd1, 0xd7, 0xd9, 0x87, 0x89, 0x59, 0xb7, 0xf7, 0xa4, 0xf3,
- 0x42, 0xd2, 0x1d, 0x67, 0xf4, 0x71, 0x23, 0xc0, 0x79, 0xe7, 0x68, 0xec,
- 0xdb, 0x95, 0x06, 0x6d, 0x4d, 0x9b, 0xd2, 0xe3, 0x72, 0x73, 0x24, 0x99,
- 0x9d, 0x43, 0xd5, 0xce, 0xe0, 0x06, 0x20, 0x65, 0xf6, 0x16, 0xb0, 0x50,
- 0x69, 0xaf, 0xbe, 0x9a, 0xab, 0x0d, 0xe1, 0x4d, 0x1b, 0x03, 0x29, 0xdd,
- 0x7b, 0x66, 0x8d, 0xa8, 0xa9, 0xbc, 0xa9, 0xb3, 0xd9, 0x15, 0x99, 0x42,
- 0xf6, 0x0a, 0xe1, 0x92, 0xc6, 0xae, 0x48, 0x86, 0x00, 0x82, 0x97, 0x85,
- 0xb1, 0x54, 0x52, 0x41, 0xe7, 0xb0, 0x2c, 0xb9, 0x86, 0x58, 0x77, 0x75,
- 0xd4, 0xdb, 0x32, 0x84, 0x83, 0x9b, 0x7f, 0x66, 0x00, 0x9e, 0x6d, 0xae,
- 0x25, 0x3a, 0xbc, 0x6c, 0x01, 0xbe, 0x75, 0x74, 0xee, 0x68, 0xb6, 0xee,
- 0x17, 0xc4, 0xe7, 0x43, 0x58, 0x0d, 0xaf, 0x6c, 0xa0, 0xf2, 0xeb, 0x82,
- 0xe8, 0x3a, 0xfb, 0x44, 0x64, 0xb3, 0x32, 0x36, 0x67, 0xaf, 0x59, 0xad,
- 0x5e, 0xc6, 0x4b, 0xad, 0xe1, 0xe7, 0x90, 0x85, 0x34, 0xdb, 0xa6, 0xdf,
- 0x60, 0x30, 0x17, 0x48, 0x3d, 0xab, 0x81, 0x6a, 0xe5, 0xd9, 0x5a, 0x95,
- 0xa4, 0x31, 0x99, 0x5b, 0x98, 0x89, 0xa0, 0x6d, 0xcd, 0x67, 0xc4, 0x50,
- 0x53, 0xb6, 0x05, 0xa1, 0x04, 0x7b, 0x1f, 0xa6, 0xad, 0x04, 0x4a, 0xb4,
- 0x56, 0xfa, 0x47, 0x6b, 0x94, 0xcb, 0xb1, 0x5b, 0x58, 0xda, 0x23, 0x00,
- 0xaf, 0x52, 0x93, 0x47, 0x61, 0x29, 0x35, 0xad, 0x35, 0xe0, 0xcd, 0x9e,
- 0xb0, 0x82, 0x18, 0x81, 0x82, 0xdc, 0xa5, 0x65, 0x6d, 0x77, 0x8e, 0x99,
- 0xad, 0x8f, 0x72, 0x21, 0x6e, 0x00, 0xc5, 0x1e, 0x8a, 0x1b, 0x91, 0xbc,
- 0xab, 0xe5, 0xcd, 0xc3, 0xa2, 0x26, 0xec, 0x92, 0x9a, 0x7e, 0xb3, 0x7b,
- 0x96, 0x06, 0x79, 0xb1, 0x5e, 0xe8, 0x48, 0x27, 0x1e, 0xf5, 0x61, 0x8c,
- 0x15, 0x94, 0xd3, 0x35, 0x47, 0x48, 0x1c, 0xa0, 0x94, 0x11, 0x19, 0x20,
- 0x6a, 0xe8, 0x90, 0xae, 0x02, 0x49, 0xe2, 0xe7, 0x3b, 0xe0, 0xc0, 0x33,
- 0x90, 0xe4, 0x20, 0xf9, 0x2a, 0xad, 0xf3, 0x49, 0x5f, 0xaa, 0x22, 0x48,
- 0x95, 0x04, 0xd4, 0xd9, 0xd6, 0xca, 0x09, 0xc9, 0x16, 0xf3, 0xed, 0x6e,
- 0x0f, 0x93, 0xef, 0xb5, 0xce, 0x85, 0x31, 0x22, 0x91, 0x6e, 0x4c, 0x9e,
- 0xfd, 0x8d, 0xc4, 0xc2, 0x41, 0xf8, 0xec, 0xc9, 0xfe, 0x14, 0x3f, 0x3b,
- 0x58, 0xb2, 0xf1, 0x11, 0x47, 0x01, 0x88, 0x55, 0x4d, 0xeb, 0x8f, 0x36,
- 0xa8, 0x85, 0xb5, 0x12, 0x51, 0xc4, 0x55, 0xb2, 0x98, 0x4f, 0x16, 0x46,
- 0xbe, 0x40, 0x5f, 0x10, 0xf2, 0x2a, 0xbc, 0x22, 0xd7, 0xb6, 0x46, 0x0d,
- 0x5c, 0xa9, 0xb5, 0xc5, 0x9e, 0xd9, 0x32, 0x60, 0xd8, 0x99, 0x56, 0x44,
- 0x0d, 0x06, 0x66, 0xc2, 0x68, 0x6a, 0x44, 0x80, 0x9e, 0x5d, 0x1e, 0xff,
- 0x4b, 0x72, 0xd8, 0x8d, 0x81, 0x83, 0xdf, 0x43, 0xc4, 0xb0, 0x94, 0x8c,
- 0xb5, 0x1b, 0x0c, 0x7d, 0x67, 0x88, 0x29, 0x13, 0x63, 0xa6, 0x58, 0xfe,
- 0x0d, 0xc9, 0x90, 0x75, 0x0e, 0xdf, 0xba, 0x94, 0xfc, 0x08, 0x54, 0xd4,
- 0xb3, 0xb5, 0xd7, 0x10, 0x1d, 0xf0, 0x08, 0x01, 0x19, 0xc5, 0x9e, 0xa7,
- 0xd0, 0x63, 0xcb, 0x4f, 0xe6, 0x60, 0x6b, 0x8a, 0x02, 0x4d, 0xf3, 0xf5,
- 0x8d, 0x56, 0x13, 0x24, 0x10, 0x36, 0xc1, 0x91, 0xc9, 0xd4, 0x62, 0x66,
- 0x65, 0xae, 0x7c, 0xe5, 0x95, 0x81, 0xb1, 0x2d, 0xd0, 0xee, 0xff, 0x40,
- 0x47, 0xee, 0x83, 0x5e, 0x2c, 0x72, 0x05, 0x72, 0x5f, 0xae, 0xd8, 0x0e,
- 0x6a, 0x6f, 0x59, 0x3d, 0x76, 0x7c, 0x9b, 0x9d, 0x2b, 0xc0, 0x14, 0x0b,
- 0x41, 0x57, 0x00, 0xe0, 0x1f, 0x08, 0x7e, 0xe3, 0x4e, 0x55, 0xa9, 0xe9,
- 0x5f, 0x4c, 0x20, 0x9d, 0xa4, 0x3b, 0x82, 0x0b, 0x26, 0x0b, 0xe9, 0x24,
- 0x83, 0xf9, 0x4d, 0xab, 0xed, 0x74, 0x1b, 0x70, 0xd5, 0x62, 0x56, 0xa9,
- 0x17, 0xa3, 0xb3, 0xa3, 0x6f, 0x47, 0xad, 0x74, 0x97, 0x9a, 0x2b, 0xaa,
- 0x24, 0x5a, 0x3a, 0xa8, 0xb3, 0xa1, 0x8d, 0x34, 0x3c, 0x69, 0x3a, 0xe2,
- 0xc9, 0xd2, 0x39, 0x7a, 0xd8, 0x63, 0xba, 0x6c, 0x5a, 0xcd, 0x52, 0x85,
- 0x8d, 0x49, 0xe6, 0xb1, 0xd1, 0x16, 0xe5, 0x86, 0x77, 0xf3, 0xf1, 0xfe,
- 0x29, 0x6b, 0x95, 0x89, 0xcc, 0x55, 0xca, 0x65, 0x0d, 0xc6, 0x19, 0x93,
- 0x0d, 0x99, 0x5d, 0xc2, 0xab, 0x48, 0xfd, 0xc3, 0x09, 0xe4, 0x9d, 0x39,
- 0xc7, 0xe6, 0xde, 0x70, 0xbb, 0x9b, 0xee, 0xa0, 0x55, 0xe3, 0x24, 0x0e,
- 0x7d, 0xda, 0x6e, 0xea, 0xfa, 0x66, 0xd5, 0x09, 0x05, 0x08, 0xa5, 0x76,
- 0x08, 0xe9, 0x56, 0xda, 0x6b, 0x5a, 0x1d, 0x68, 0xb6, 0x85, 0xd5, 0xb3,
- 0x74, 0xd1, 0x45, 0xf8, 0xf1, 0x20, 0x49, 0xa6, 0x4c, 0x93, 0xf9, 0xbd,
- 0x24, 0xb0, 0x88, 0x6e, 0x40, 0xdc, 0x1c, 0xf0, 0x4a, 0x7c, 0xfe, 0x79,
- 0xa0, 0x0b, 0x7e, 0xb2, 0x4f, 0x1f, 0x98, 0x5f, 0x7b, 0xde, 0x8f, 0x19,
- 0xe1, 0x45, 0xc8, 0xdb, 0x00, 0x3d, 0xd4, 0xba, 0x40, 0x22, 0x16, 0x86,
- 0x57, 0x99, 0x8b, 0xbf, 0x68, 0x43, 0x2c, 0xc1, 0x2e, 0xeb, 0x3b, 0xb9,
- 0xbf, 0xc1, 0xe6, 0x35, 0x77, 0x34, 0xad, 0x19, 0x77, 0xb4, 0xc2, 0x30,
- 0x53, 0x31, 0xd9, 0xed, 0xad, 0xa7, 0x35, 0x1b, 0xcd, 0x7d, 0x48, 0x97,
- 0x2a, 0x19, 0x01, 0xa3, 0x52, 0x1a, 0xa6, 0x49, 0x96, 0xce, 0xd8, 0xdd,
- 0xd1, 0xd9, 0x47, 0xb6, 0x24, 0x96, 0x93, 0x11, 0xef, 0x57, 0x77, 0xe7,
- 0xfd, 0xaf, 0xe9, 0xce, 0x61, 0xb2, 0x36, 0xd5, 0x0a, 0x13, 0xc4, 0x12,
- 0xbf, 0x96, 0x38, 0xe9, 0xb4, 0xc4, 0xae, 0x56, 0xbd, 0x87, 0xe7, 0x08,
- 0x35, 0x69, 0x3a, 0xac, 0xb9, 0xa1, 0x63, 0xa2, 0x28, 0xf9, 0x69, 0x18,
- 0x35, 0xd4, 0x7e, 0x5f, 0xbb, 0xf2, 0xd8, 0xee, 0x4a, 0x21, 0x45, 0x9b,
- 0x4f, 0xe9, 0xbe, 0x87, 0x0d, 0x2f, 0xc9, 0x51, 0x7b, 0xc3, 0x5d, 0x5f,
- 0xbf, 0xb2, 0x49, 0x8d, 0x15, 0x52, 0xa8, 0x68, 0x8a, 0x37, 0x3c, 0x15,
- 0x65, 0x29, 0x75, 0x07, 0x77, 0x3a, 0xaf, 0xc9, 0xcf, 0xf6, 0x98, 0xdd,
- 0xc0, 0x9c, 0x24, 0x61, 0x0f, 0xa4, 0x34, 0xd7, 0x6c, 0xbe, 0xe0, 0xe4,
- 0xaf, 0x48, 0x3d, 0x55, 0x9c, 0xa3, 0xa7, 0xee, 0x48, 0x3d, 0xb3, 0xcb,
- 0x2d, 0x7d, 0xe4, 0x5c, 0x11, 0x29, 0x42, 0xc6, 0xe9, 0x1a, 0x50, 0x3e,
- 0xb5, 0xde, 0x47, 0xb3, 0x32, 0x51, 0xf5, 0xa8, 0xcd, 0x00, 0x4f, 0xfb,
- 0x19, 0x97, 0xad, 0xad, 0x8e, 0x29, 0xac, 0xdf, 0x82, 0x32, 0xa6, 0x56,
- 0x09, 0x8f, 0x1d, 0x91, 0x34, 0x60, 0x90, 0xc8, 0x50, 0x56, 0x8c, 0xce,
- 0x35, 0x3b, 0xba, 0x69, 0x6b, 0x29, 0x57, 0xae, 0x0b, 0xa3, 0x59, 0xf5,
- 0xcc, 0xb4, 0x3b, 0xcb, 0x4d, 0x87, 0x36, 0x41, 0xa7, 0xa3, 0xd5, 0x92,
- 0x44, 0x16, 0xea, 0x16, 0xb6, 0xc4, 0x16, 0xed, 0x42, 0x44, 0x21, 0x9f,
- 0x66, 0x57, 0xe8, 0xf2, 0x35, 0xd0, 0x4f, 0x06, 0xff, 0x43, 0x66, 0x86,
- 0xd4, 0x73, 0x82, 0x80, 0x81, 0xf9, 0x68, 0xe1, 0xb1, 0x5f, 0x08, 0xea,
- 0x14, 0x02, 0x9f, 0xf0, 0x9d, 0x3a, 0x0e, 0xaf, 0x42, 0x36, 0x67, 0xfa,
- 0x41, 0xfe, 0xe9, 0xd8, 0xf3, 0xac, 0x5b, 0x21, 0x4a, 0x44, 0x05, 0x37,
- 0xb7, 0xe1, 0x2a, 0xa9, 0x02, 0xf4, 0x17, 0x74, 0xd8, 0x5e, 0x64, 0x5f,
- 0x11, 0xc1, 0xf1, 0x51, 0x99, 0xfa, 0xd3, 0xaa, 0xb6, 0xdc, 0x86, 0xf6,
- 0x94, 0x37, 0xbf, 0x75, 0x65, 0x30, 0xef, 0xfc, 0xc0, 0xbc, 0x30, 0x78,
- 0x2f, 0xee, 0x8c, 0x2f, 0xf9, 0x0b, 0x43, 0x92, 0x67, 0xf2, 0x85, 0x73,
- 0x6a, 0xcb, 0x3e, 0x70, 0x20, 0x2f, 0x11, 0x59, 0x7d, 0x4f, 0x3c, 0x39,
- 0xed, 0x59, 0xe1, 0xe7, 0x95, 0xcc, 0xbe, 0x53, 0xd3, 0x16, 0x87, 0x8c,
- 0xff, 0xca, 0xef, 0x8a, 0xf1, 0x78, 0x4f, 0x4d, 0x0c, 0x39, 0x97, 0x42,
- 0x7c, 0x2f, 0xfb, 0x7b, 0x3b, 0xdc, 0x19, 0x2d, 0x45, 0x0b, 0xbd, 0x4e,
- 0xb6, 0xa4, 0xc3, 0x73, 0xe0, 0x20, 0xa0, 0x6a, 0x94, 0x1b, 0x38, 0xa5,
- 0x7f, 0x10, 0x0e, 0x67, 0x4e, 0xe0, 0x05, 0xa5, 0xa5, 0xa6, 0xab, 0xc9,
- 0xdc, 0xb5, 0xa0, 0xac, 0x93, 0x74, 0x64, 0x22, 0xa0, 0xb1, 0x0b, 0xd4,
- 0xb7, 0x2a, 0xdf, 0x26, 0x15, 0x75, 0xf7, 0xad, 0xa6, 0x8c, 0x22, 0x2a,
- 0x29, 0xea, 0xc6, 0xde, 0xd9, 0x3c, 0xd8, 0xbc, 0x56, 0xd4, 0x83, 0xd9,
- 0xd1, 0x17, 0x87, 0xef, 0xbe, 0x3e, 0x86, 0x26, 0x00, 0xd9, 0x4e, 0x07,
- 0x34, 0xa7, 0xdd, 0x3e, 0x5d, 0x72, 0xc9, 0x49, 0x33, 0x63, 0x80, 0xb0,
- 0x99, 0xd5, 0x7e, 0x6f, 0x69, 0x8d, 0xc1, 0xd4, 0x8c, 0xcd, 0x8b, 0xe5,
- 0x16, 0x60, 0xda, 0x46, 0xa2, 0x1e, 0x55, 0x68, 0x10, 0x80, 0x31, 0x57,
- 0xec, 0x7e, 0xad, 0x97, 0xe3, 0x05, 0x4a, 0xb1, 0xc0, 0x3e, 0x73, 0x62,
- 0x46, 0xfd, 0x2c, 0xc3, 0xf6, 0x59, 0xdc, 0xd0, 0xb4, 0x25, 0x6b, 0xd3,
- 0x57, 0xb0, 0xe9, 0x87, 0xbe, 0x57, 0x8d, 0x89, 0x31, 0xf6, 0x76, 0x77,
- 0x1d, 0x65, 0x59, 0x6a, 0x1b, 0x0c, 0xa4, 0x65, 0x95, 0xec, 0x0e, 0x5e,
- 0xbc, 0x58, 0x25, 0x08, 0x6d, 0xa3, 0xa0, 0x42, 0x78, 0xf6, 0xe8, 0x36,
- 0x07, 0xf4, 0xe8, 0xaa, 0x36, 0x23, 0x16, 0x0d, 0x0a, 0xcc, 0x09, 0x28,
- 0xb0, 0xb6, 0x5a, 0x8b, 0x78, 0x78, 0x38, 0x5a, 0x83, 0x38, 0x58, 0x61,
- 0xcd, 0x1a, 0x9a, 0xca, 0x0d, 0x97, 0xb5, 0x0a, 0xea, 0x10, 0x75, 0x06,
- 0x2d, 0x08, 0x17, 0x98, 0xdb, 0x70, 0xec, 0xa3, 0x26, 0xc6, 0x33, 0xe0,
- 0x57, 0x4c, 0xd1, 0x55, 0x38, 0x1a, 0x55, 0x09, 0xde, 0x9f, 0x93, 0xff,
- 0xef, 0xe4, 0xdd, 0xd7, 0xec, 0x0e, 0x31, 0xb6, 0x3d, 0x7c, 0xe9, 0x3b,
- 0x1d, 0x4b, 0xff, 0x3d, 0x73, 0x8f, 0x11, 0x26, 0x14, 0x38, 0x0c, 0xa6,
- 0xab, 0xcf, 0x0b, 0xa9, 0x50, 0xed, 0xca, 0xed, 0xc5, 0x7d, 0x95, 0x97,
- 0xc9, 0xc0, 0x53, 0x4e, 0x84, 0x78, 0x8c, 0x34, 0x93, 0xf9, 0xbd, 0x5a,
- 0x46, 0xf2, 0x05, 0xb4, 0xae, 0x91, 0x19, 0xdb, 0x2c, 0xdb, 0xb9, 0x6c,
- 0x9e, 0x63, 0x07, 0x05, 0xba, 0x49, 0xe4, 0x93, 0xfc, 0x19, 0x9c, 0xef,
- 0x8e, 0x26, 0xf2, 0xb8, 0xae, 0xb4, 0x5c, 0x9d, 0x6d, 0xd6, 0x63, 0xd2,
- 0xac, 0xfa, 0xea, 0xfb, 0xe9, 0xba, 0x21, 0xb9, 0x9a, 0x9c, 0x2f, 0xd5,
- 0x69, 0xb5, 0x41, 0xa6, 0x5e, 0x96, 0xff, 0x78, 0x3f, 0xd7, 0xf4, 0x90,
- 0x0e, 0x2a, 0xdd, 0x54, 0xc5, 0xd4, 0xf9, 0x34, 0xa4, 0xc7, 0xd1, 0x40,
- 0xc8, 0x25, 0xbf, 0xcf, 0x9f, 0x4e, 0xe3, 0x9f, 0xe3, 0xf7, 0x75, 0x6a,
- 0x22, 0x07, 0x80, 0x54, 0x5a, 0xa1, 0xa6, 0xb3, 0x09, 0xe4, 0x6a, 0xcb,
- 0x90, 0x16, 0x0e, 0xc9, 0x91, 0xb7, 0xd5, 0x92, 0x8d, 0x44, 0xb8, 0x2a,
- 0xc0, 0x5b, 0x47, 0x7b, 0x08, 0xf4, 0x28, 0xb8, 0xbc, 0x3e, 0xe6, 0x42,
- 0xc2, 0xbb, 0x2c, 0x8a, 0x8c, 0x8c, 0x54, 0x64, 0xa1, 0xe7, 0x6c, 0x2f,
- 0xf4, 0xed, 0x29, 0xaa, 0x96, 0x52, 0xd2, 0x19, 0x40, 0x03, 0xd3, 0xf9,
- 0xb4, 0xbe, 0x01, 0x02, 0xd0, 0xba, 0xa2, 0x42, 0xf5, 0x0a, 0x9f, 0xe7,
- 0x76, 0x49, 0x9f, 0x62, 0x65, 0x0a, 0xca, 0x75, 0x6b, 0x2a, 0xda, 0x33,
- 0xb0, 0xb1, 0x41, 0x4e, 0xf8, 0x1d, 0x72, 0xc5, 0x8f, 0xc2, 0x09, 0x54,
- 0x5f, 0xfa, 0x5a, 0x7f, 0xbc, 0x8b, 0x31, 0x3c, 0xe0, 0x99, 0xf7, 0xbc,
- 0x27, 0x8f, 0x3d, 0x71, 0xac, 0xbf, 0x47, 0xe2, 0x8a, 0x38, 0x74, 0x9e,
- 0x20, 0x8b, 0x6e, 0xf5, 0xb6, 0x37, 0xcd, 0xb7, 0x05, 0xe0, 0xf4, 0x81,
- 0x65, 0x86, 0xaa, 0x19, 0x9d, 0xe5, 0xe2, 0x0c, 0xb2, 0xf3, 0xf7, 0x97,
- 0x42, 0x26, 0xa5, 0xe2, 0xdd, 0x2f, 0x25, 0xe4, 0xd7, 0x0d, 0x85, 0x34,
- 0x23, 0xdd, 0x82, 0xcd, 0x5f, 0xc4, 0xba, 0x39, 0x31, 0x12, 0xdf, 0xc4,
- 0x08, 0xb9, 0x83, 0x7d, 0x9b, 0x01, 0x73, 0x7e, 0x36, 0xba, 0x24, 0x37,
- 0x02, 0xae, 0x3e, 0xb5, 0x47, 0xbf, 0x3b, 0xbe, 0xf8, 0xea, 0x6c, 0x74,
- 0x6c, 0xd6, 0xe3, 0xf5, 0xf1, 0x57, 0xef, 0x49, 0x6a, 0xd1, 0xee, 0x60,
- 0xd7, 0x33, 0x65, 0xc7, 0x88, 0xff, 0x8b, 0xaa, 0xba, 0x22, 0x49, 0x0e,
- 0xdb, 0x94, 0xf5, 0xa0, 0xbe, 0x4d, 0xd7, 0x16, 0x15, 0x8f, 0xeb, 0x92,
- 0xce, 0x32, 0xf6, 0x55, 0xe6, 0xc8, 0x25, 0xc8, 0xaf, 0x74, 0x87, 0x11,
- 0x6c, 0x8f, 0xaa, 0x18, 0xc2, 0xbc, 0x94, 0xa3, 0xc4, 0x34, 0xda, 0xf5,
- 0x81, 0x73, 0x6a, 0xde, 0xb2, 0x67, 0x5a, 0x0e, 0x9f, 0xab, 0xbd, 0x08,
- 0x3e, 0x21, 0x6c, 0xde, 0x23, 0xab, 0x47, 0x0b, 0xa7, 0xce, 0xac, 0xe4,
- 0x5b, 0x13, 0xe5, 0x02, 0xa9, 0x6d, 0xdc, 0xe3, 0x79, 0x83, 0x2b, 0x9c,
- 0x0d, 0x0a, 0xa9, 0x5c, 0x58, 0xf3, 0xe6, 0xe6, 0x32, 0xad, 0x04, 0x23,
- 0xcb, 0xbc, 0xa2, 0x95, 0x35, 0xb4, 0xe1, 0x99, 0xdc, 0xda, 0x12, 0x0f,
- 0x67, 0xd8, 0xae, 0xf0, 0x78, 0x6d, 0x89, 0x11, 0x7c, 0x87, 0x71, 0x0a,
- 0x45, 0x39, 0x97, 0xfe, 0xcb, 0x94, 0xd1, 0x96, 0x66, 0xde, 0xaf, 0xc3,
- 0xc2, 0x5b, 0xe7, 0x76, 0xb5, 0xe8, 0xb9, 0xe4, 0x91, 0x92, 0x9f, 0x83,
- 0x15, 0x01, 0x49, 0x4b, 0x42, 0xbf, 0x3b, 0x15, 0x4d, 0x9c, 0x82, 0xc2,
- 0x67, 0x97, 0x12, 0x03, 0x3c, 0x13, 0x72, 0x75, 0xb1, 0x40, 0xd5, 0x66,
- 0x25, 0xc0, 0xe4, 0x72, 0x82, 0x58, 0xb8, 0x0a, 0xa2, 0x8e, 0x96, 0x14,
- 0x21, 0x01, 0xde, 0x7c, 0xe1, 0x79, 0xe7, 0xd6, 0xf1, 0x5f, 0x9c, 0x51,
- 0x2f, 0x70, 0xb2, 0xb1, 0xb1, 0xf1, 0xfa, 0xf8, 0xf2, 0xf0, 0xe4, 0xf4,
- 0xf8, 0x75, 0x72, 0xf2, 0xee, 0xcd, 0xd9, 0xc5, 0xdb, 0xc3, 0x4b, 0x81,
- 0x63, 0xbc, 0xb6, 0x1e, 0x39, 0x57, 0x66, 0x4d, 0x6a, 0x09, 0x79, 0xde,
- 0x3a, 0x6c, 0x61, 0xb3, 0x8a, 0xd7, 0x52, 0x46, 0x9d, 0xa7, 0x21, 0x6b,
- 0xcd, 0xc1, 0x86, 0x96, 0x95, 0x71, 0x65, 0xe9, 0x48, 0x2f, 0xd8, 0xb1,
- 0xb1, 0xf7, 0xa1, 0x4e, 0xa7, 0xba, 0xd1, 0xc0, 0x38, 0xbc, 0xb6, 0x29,
- 0x5b, 0x65, 0x94, 0xef, 0x44, 0x5a, 0x4e, 0x26, 0xf1, 0xc0, 0x9e, 0x1c,
- 0x9c, 0xec, 0x70, 0x3d, 0x6b, 0xaf, 0x66, 0x81, 0xd6, 0x9b, 0x01, 0x2b,
- 0x07, 0xb5, 0xe3, 0x11, 0xe8, 0x5c, 0x95, 0x40, 0x95, 0xf8, 0x6d, 0x5a,
- 0x5a, 0x18, 0xac, 0xa8, 0xd1, 0x02, 0x18, 0xc6, 0xc3, 0x55, 0xdd, 0xbc,
- 0xf5, 0xcd, 0xb9, 0xea, 0xcb, 0x8c, 0x50, 0x44, 0x00, 0x07, 0x11, 0xc9,
- 0x51, 0x6d, 0x56, 0xca, 0x9e, 0x75, 0xd0, 0x2e, 0x59, 0x81, 0xad, 0xd1,
- 0x39, 0xe1, 0xaa, 0xf5, 0x9b, 0xda, 0xb2, 0xf1, 0x7a, 0xa3, 0x31, 0x0d,
- 0x4e, 0x84, 0x38, 0x99, 0xe6, 0x62, 0x7b, 0x03, 0x45, 0x80, 0xee, 0x0a,
- 0x25, 0xad, 0xb3, 0x48, 0x50, 0x67, 0xf1, 0xe7, 0x3b, 0x5e, 0xe5, 0x47,
- 0x9c, 0x36, 0x77, 0x6e, 0x95, 0xe8, 0x7a, 0xf0, 0xda, 0x3c, 0x34, 0x5d,
- 0xce, 0x17, 0xed, 0x62, 0xdf, 0xec, 0xcb, 0xd3, 0x25, 0x64, 0xa5, 0x0d,
- 0xca, 0x07, 0x1c, 0x3f, 0x6f, 0x64, 0x0e, 0x78, 0x1c, 0xd8, 0xdf, 0x8d,
- 0x86, 0x02, 0x51, 0x6d, 0xd6, 0x46, 0xef, 0xba, 0xe5, 0x3b, 0xdb, 0x9a,
- 0x0b, 0x26, 0x64, 0x64, 0x9f, 0xed, 0xd6, 0xfb, 0x4c, 0x1d, 0xd6, 0x08,
- 0xf3, 0xbf, 0xa5, 0xf4, 0x5f, 0xb4, 0x65, 0xa5, 0x41, 0xb9, 0x2a, 0xc2,
- 0xe0, 0x63, 0x6b, 0x50, 0xfe, 0x8b, 0x6d, 0x48, 0x8f, 0x2f, 0xe9, 0xf5,
- 0xd3, 0x8e, 0xea, 0xaa, 0xdb, 0x03, 0x91, 0xe2, 0x46, 0x9e, 0xdc, 0x6b,
- 0xa5, 0x0b, 0xe2, 0x54, 0x04, 0xdc, 0x88, 0x9c, 0xa5, 0x20, 0x24, 0x10,
- 0x49, 0x89, 0x80, 0x98, 0x6e, 0xdf, 0x25, 0xca, 0x37, 0x94, 0x1f, 0xc9,
- 0x96, 0xd7, 0xb2, 0xad, 0x5e, 0x2a, 0x1d, 0xa3, 0xc8, 0x84, 0xea, 0x0e,
- 0x42, 0xaf, 0xd8, 0xd0, 0xac, 0x5f, 0x7d, 0x49, 0xb1, 0x88, 0x90, 0xfe,
- 0x5c, 0x6a, 0x1e, 0x42, 0x9e, 0x8c, 0xea, 0x2c, 0xad, 0x61, 0x50, 0x21,
- 0xa1, 0x86, 0xef, 0x0c, 0xeb, 0x86, 0x75, 0xa4, 0x6d, 0x5e, 0x1d, 0x3b,
- 0x88, 0xe8, 0x69, 0xf2, 0x92, 0x9e, 0x25, 0x52, 0x1c, 0x3d, 0x14, 0x0c,
- 0xa0, 0xb7, 0xad, 0x68, 0x80, 0xc3, 0x34, 0xc3, 0xa5, 0xe8, 0x19, 0x16,
- 0x7a, 0x4e, 0x0f, 0xa4, 0xaa, 0xe1, 0xf7, 0x5c, 0xc9, 0xa1, 0xde, 0xe2,
- 0xc6, 0x7c, 0xa3, 0x97, 0x5c, 0x93, 0x8d, 0x34, 0x36, 0x5d, 0x0f, 0x04,
- 0xe8, 0x94, 0x1f, 0x7f, 0x75, 0x91, 0x5e, 0xa5, 0xd9, 0xec, 0x8f, 0xfb,
- 0xbb, 0xa3, 0xf4, 0x7a, 0x39, 0x4b, 0xff, 0x15, 0x2f, 0xbe, 0x7a, 0xf2,
- 0x64, 0x7f, 0xf7, 0xb3, 0xcf, 0x77, 0x7b, 0x5d, 0xf4, 0x81, 0xe3, 0x64,
- 0x01, 0xc2, 0x06, 0x9c, 0x2c, 0x24, 0x77, 0xf1, 0x9d, 0xe1, 0xe4, 0x3a,
- 0x87, 0x51, 0x47, 0x8a, 0x92, 0xcc, 0x41, 0xca, 0xd6, 0x24, 0xc4, 0xa4,
- 0x54, 0x03, 0x35, 0x37, 0xae, 0xd9, 0xd7, 0x7f, 0xd8, 0x3b, 0x60, 0x51,
- 0x06, 0x26, 0x37, 0xdc, 0x13, 0x34, 0x17, 0x2f, 0xf3, 0xc2, 0xdc, 0x40,
- 0x5f, 0x24, 0x4d, 0x7a, 0x6d, 0xf7, 0x2a, 0x5a, 0xc0, 0x6a, 0xd8, 0xe5,
- 0x6c, 0x10, 0xa2, 0x26, 0xd5, 0x6a, 0x98, 0x6c, 0x81, 0x0b, 0x63, 0xb3,
- 0x86, 0x92, 0xb5, 0xc8, 0x2a, 0x64, 0xae, 0x5e, 0x57, 0xe9, 0x5c, 0x93,
- 0x4e, 0xe8, 0x7d, 0x82, 0xad, 0x0d, 0x17, 0xb3, 0x84, 0xcb, 0x30, 0x8b,
- 0xdf, 0x22, 0x77, 0x1b, 0x6e, 0xb6, 0xa8, 0x5d, 0x75, 0x4c, 0xbe, 0x6e,
- 0x4e, 0xa4, 0xa8, 0xd8, 0x26, 0xb9, 0x54, 0x7a, 0xec, 0x53, 0xe9, 0x61,
- 0x54, 0x2c, 0x32, 0x20, 0xcd, 0xa6, 0x3a, 0xd2, 0x21, 0xfe, 0x0e, 0x56,
- 0x8f, 0x94, 0x09, 0x01, 0x7b, 0x0b, 0xce, 0xa3, 0xb7, 0x05, 0xa6, 0xd8,
- 0xf9, 0x96, 0xb7, 0xc6, 0x95, 0x3a, 0xf0, 0x65, 0xf2, 0x52, 0xbd, 0x44,
- 0x7b, 0x5f, 0xbc, 0xc2, 0x86, 0xd8, 0xfb, 0xe2, 0x5f, 0xed, 0xcf, 0xf6,
- 0xe5, 0x67, 0xfb, 0x5f, 0xfc, 0xeb, 0x70, 0x88, 0xfe, 0xd1, 0x0e, 0xd9,
- 0xd4, 0x5f, 0x6f, 0x0a, 0x67, 0x52, 0x2a, 0x47, 0x98, 0xff, 0x45, 0x66,
- 0x3b, 0x17, 0x22, 0xc5, 0x5a, 0xf7, 0xf4, 0xcb, 0xfe, 0x2c, 0xf7, 0x25,
- 0xa2, 0x6a, 0xe5, 0x56, 0x5e, 0xdb, 0x34, 0x77, 0xa0, 0xaf, 0x22, 0x93,
- 0x6e, 0xe3, 0x20, 0x68, 0x47, 0x60, 0x94, 0x78, 0xf9, 0xdf, 0x68, 0xa7,
- 0xfe, 0xdb, 0x46, 0x22, 0xd1, 0x4d, 0x5a, 0x8e, 0x7b, 0x04, 0x3c, 0x74,
- 0xdb, 0x32, 0xd9, 0x11, 0xf3, 0x22, 0x53, 0xcb, 0x94, 0xc9, 0x41, 0x77,
- 0xa0, 0x57, 0x62, 0xe9, 0x4f, 0xc2, 0x56, 0xc2, 0x0b, 0xbe, 0x91, 0xd8,
- 0x67, 0x38, 0xe3, 0xc5, 0xe8, 0x18, 0x0d, 0x49, 0x07, 0x3c, 0xfb, 0xc7,
- 0x1f, 0x7e, 0x10, 0x85, 0xca, 0xfc, 0x45, 0x7a, 0x7e, 0x63, 0x64, 0xd1,
- 0xd4, 0x88, 0xb7, 0x39, 0x6a, 0xb6, 0x48, 0x5d, 0x2c, 0xb9, 0xf2, 0xaf,
- 0x64, 0xa4, 0xdc, 0x88, 0x59, 0xda, 0xc3, 0xd1, 0xd1, 0xc9, 0x09, 0x10,
- 0xa3, 0x98, 0xd4, 0x63, 0x16, 0x63, 0xd8, 0x9b, 0x5b, 0x80, 0x78, 0x38,
- 0x58, 0xa2, 0xbf, 0xf5, 0x69, 0xed, 0xb0, 0xec, 0xd8, 0xfd, 0xa6, 0x31,
- 0x35, 0xc0, 0x65, 0x29, 0xb1, 0x67, 0x59, 0xcb, 0x79, 0xd5, 0xe3, 0x07,
- 0xaf, 0xf3, 0x9e, 0x04, 0xb1, 0xf8, 0x27, 0x3d, 0x47, 0x82, 0xc5, 0xeb,
- 0x81, 0x45, 0x7b, 0xc5, 0xaa, 0x53, 0xfe, 0xf7, 0xec, 0xd5, 0xde, 0x6e,
- 0xfc, 0x09, 0x44, 0x6d, 0x89, 0xf3, 0xef, 0x95, 0x0b, 0x08, 0xae, 0x7b,
- 0x3e, 0x9f, 0xf2, 0xd3, 0x52, 0x51, 0x1a, 0xe5, 0xbd, 0x5e, 0xf5, 0xc6,
- 0x74, 0xc3, 0xd2, 0xff, 0x5f, 0xd1, 0x0f, 0x44, 0xac, 0xe4, 0xd9, 0x7a,
- 0x39, 0x9e, 0xe7, 0xad, 0x0e, 0xef, 0xd0, 0x00, 0xbf, 0xa0, 0x01, 0x7f,
- 0x9f, 0xd9, 0xdd, 0x91, 0x91, 0x6a, 0xc7, 0xba, 0xdf, 0xe6, 0x55, 0x59,
- 0x8e, 0xd3, 0x6a, 0x53, 0xc2, 0x39, 0xda, 0xcf, 0xcd, 0xbd, 0xfd, 0x27,
- 0x4f, 0x9f, 0x6d, 0x0e, 0x45, 0x4f, 0x83, 0x88, 0x68, 0x7c, 0xee, 0x11,
- 0x6e, 0xc2, 0x52, 0x66, 0x30, 0x6a, 0x1a, 0xb9, 0xfa, 0xb1, 0xe0, 0x2a,
- 0x49, 0x31, 0xfa, 0xdc, 0x2b, 0xfe, 0xda, 0xbf, 0xd2, 0x77, 0x5e, 0xe1,
- 0x13, 0xff, 0x9a, 0x4f, 0x5f, 0xd9, 0x11, 0xfe, 0x2b, 0x8d, 0xe5, 0x95,
- 0x0c, 0xc2, 0xac, 0xab, 0xe6, 0x13, 0xd6, 0xdb, 0x1b, 0x51, 0xb9, 0x16,
- 0x5d, 0x5c, 0x5d, 0xc4, 0x0d, 0x0c, 0x1a, 0x08, 0x86, 0xc1, 0x94, 0xa3,
- 0x1f, 0xd0, 0x56, 0x5d, 0x32, 0xdd, 0xce, 0xa7, 0x81, 0x69, 0x65, 0x40,
- 0xad, 0x0c, 0x9c, 0xc0, 0x06, 0x55, 0xe3, 0x80, 0x16, 0xa2, 0x2f, 0xd9,
- 0x94, 0x33, 0x78, 0x59, 0x44, 0x15, 0x28, 0x4b, 0x80, 0x00, 0x8e, 0xbe,
- 0x3e, 0xd9, 0x14, 0xe0, 0x0d, 0x9b, 0x89, 0xfd, 0x98, 0x7f, 0xda, 0x42,
- 0x0c, 0x27, 0xe9, 0x82, 0x4e, 0xff, 0x46, 0x22, 0x9c, 0xb4, 0x29, 0xe1,
- 0x48, 0xe8, 0xbb, 0x9c, 0xfa, 0x6c, 0x3e, 0x26, 0xb7, 0xce, 0x8c, 0x3c,
- 0xde, 0x15, 0xb3, 0x48, 0x7a, 0xcd, 0x98, 0x79, 0xa9, 0x05, 0x50, 0x82,
- 0x98, 0xcf, 0xc2, 0x66, 0x4e, 0x0e, 0xde, 0xd8, 0xa0, 0xa7, 0xcd, 0xd4,
- 0x93, 0x47, 0xcd, 0xaf, 0x58, 0x9e, 0xa8, 0x88, 0xe8, 0x0d, 0xb5, 0x66,
- 0x38, 0xef, 0x04, 0x5f, 0x7a, 0x20, 0x7b, 0x7f, 0x9c, 0x49, 0xbe, 0x25,
- 0xbb, 0x4d, 0x58, 0x31, 0x24, 0xf9, 0xf9, 0xd2, 0x96, 0xca, 0xfb, 0x22,
- 0x01, 0xaf, 0x34, 0xbf, 0x25, 0x71, 0xc7, 0x56, 0xe9, 0x7a, 0xbc, 0x24,
- 0xe6, 0x81, 0x0d, 0x81, 0x79, 0x68, 0x1c, 0x51, 0x0c, 0x84, 0x2f, 0x13,
- 0x03, 0x1d, 0xdf, 0x8b, 0xb3, 0x81, 0x5a, 0xd8, 0xfc, 0x33, 0x0e, 0xc1,
- 0x4b, 0x5a, 0x06, 0xfc, 0xfa, 0x8b, 0xcd, 0x0d, 0x5b, 0x2b, 0xca, 0x6a,
- 0xee, 0x9d, 0x00, 0x32, 0x6f, 0x50, 0x7f, 0x3c, 0x1e, 0x41, 0x02, 0x6b,
- 0x63, 0x44, 0xc8, 0x82, 0x82, 0x10, 0x46, 0x9b, 0x9a, 0x51, 0xce, 0x72,
- 0xcb, 0x41, 0xcd, 0x8d, 0x67, 0xc4, 0x69, 0x43, 0xda, 0xe3, 0x26, 0xa1,
- 0x55, 0xf1, 0xde, 0xa6, 0x25, 0x47, 0x85, 0xcf, 0x14, 0x02, 0xaf, 0xca,
- 0xb4, 0x00, 0xec, 0x86, 0x64, 0xd7, 0x3b, 0x6d, 0xde, 0x1f, 0x58, 0xed,
- 0x29, 0x0f, 0x2e, 0x5f, 0x91, 0x39, 0x8a, 0x82, 0x23, 0xf2, 0x86, 0x12,
- 0x81, 0xe5, 0xa3, 0xaf, 0x68, 0xba, 0xf7, 0x86, 0xd7, 0xf9, 0x15, 0x4f,
- 0x86, 0x11, 0x91, 0xd7, 0xd9, 0x8e, 0xf9, 0x67, 0xdf, 0xfc, 0x7c, 0x9f,
- 0xb4, 0x32, 0xfa, 0xcb, 0x13, 0xe0, 0xb1, 0xfc, 0xbb, 0xdf, 0x3b, 0x1b,
- 0xf6, 0x5c, 0xd0, 0x5f, 0x72, 0x7b, 0xe7, 0x4b, 0x54, 0x47, 0x7a, 0x89,
- 0x6d, 0x4e, 0x03, 0x44, 0x96, 0x9c, 0xaa, 0x9a, 0x3e, 0xa8, 0x84, 0x0c,
- 0x2d, 0x32, 0x49, 0x97, 0x94, 0x9e, 0x62, 0xc1, 0x23, 0x02, 0xa4, 0x10,
- 0x45, 0x9d, 0xf4, 0xee, 0x5c, 0xdc, 0x33, 0x94, 0xce, 0x83, 0x9b, 0x35,
- 0xbb, 0xdb, 0xee, 0xfb, 0x48, 0x5b, 0x23, 0xde, 0x6f, 0x29, 0x39, 0x9e,
- 0x08, 0x44, 0x5c, 0x6a, 0x25, 0x7d, 0x7e, 0x4b, 0xea, 0x2a, 0x7a, 0x49,
- 0xc3, 0x58, 0xe6, 0xbc, 0xbb, 0x82, 0xed, 0xda, 0x84, 0x0c, 0xe4, 0xcb,
- 0xeb, 0x66, 0x9b, 0x3e, 0x93, 0xcd, 0x6a, 0xd8, 0xea, 0x52, 0x94, 0x54,
- 0xbf, 0x2a, 0xc0, 0x03, 0xfe, 0xd0, 0xa6, 0x7f, 0xf6, 0xcb, 0x49, 0x93,
- 0x19, 0x5b, 0x97, 0x08, 0xd3, 0xe6, 0x2c, 0xe7, 0x8e, 0xe7, 0xcc, 0x49,
- 0x8c, 0x2d, 0x3c, 0x1b, 0xf0, 0xed, 0x29, 0x2a, 0xd1, 0xe0, 0xcd, 0x30,
- 0x39, 0x05, 0x62, 0xbc, 0x4e, 0x99, 0x8d, 0x47, 0x6f, 0x58, 0xdd, 0x0d,
- 0x66, 0xeb, 0xd4, 0xca, 0x15, 0x49, 0xef, 0x11, 0xb3, 0x85, 0x6e, 0x29,
- 0x54, 0x19, 0x74, 0x46, 0x27, 0xeb, 0x17, 0xa2, 0x8f, 0xf4, 0xe1, 0x0b,
- 0xb7, 0xcf, 0xc1, 0xe7, 0xcf, 0x7e, 0x3f, 0xe4, 0x71, 0xd9, 0x0d, 0xeb,
- 0x35, 0xc2, 0xa0, 0x2d, 0x51, 0x40, 0x3d, 0xb1, 0x6e, 0x0f, 0x01, 0x43,
- 0x2a, 0x33, 0x76, 0xba, 0x10, 0xc5, 0x02, 0x91, 0x02, 0x21, 0x26, 0x6c,
- 0x5a, 0xc3, 0x2e, 0xa3, 0x8a, 0x91, 0xb4, 0x8d, 0x7a, 0xb0, 0x1b, 0x67,
- 0x99, 0x35, 0xae, 0x79, 0xad, 0x4a, 0x0b, 0x37, 0x87, 0x2f, 0x86, 0xd5,
- 0x0d, 0x17, 0xae, 0xa3, 0x4e, 0x52, 0xbf, 0xd2, 0x5b, 0xf3, 0x17, 0x52,
- 0xce, 0xc6, 0x95, 0x59, 0xf5, 0xac, 0xe2, 0xab, 0x81, 0x31, 0x42, 0x5e,
- 0xf9, 0xcc, 0x6f, 0x2e, 0xdf, 0x9e, 0x26, 0xca, 0x6a, 0x74, 0xe5, 0x54,
- 0x45, 0x45, 0x66, 0x62, 0x88, 0xe2, 0x19, 0x61, 0x7d, 0x48, 0x9e, 0xe2,
- 0x5b, 0x8e, 0xe7, 0x96, 0x12, 0xde, 0x13, 0x9a, 0x9c, 0xd6, 0x91, 0xf5,
- 0x9e, 0xe0, 0x57, 0x37, 0x98, 0x6b, 0x6d, 0x93, 0xa6, 0x60, 0xb3, 0x9f,
- 0x6c, 0x52, 0x57, 0xe9, 0x17, 0x9b, 0x98, 0x4f, 0xfc, 0xd8, 0x9b, 0xbe,
- 0xcd, 0x61, 0xe4, 0x14, 0xd2, 0x33, 0xaf, 0xbe, 0x6c, 0xcd, 0x12, 0x7e,
- 0xae, 0x4d, 0xbd, 0xe2, 0x7c, 0x91, 0x40, 0xe7, 0xd6, 0x77, 0xbd, 0xf6,
- 0x5f, 0x1d, 0x99, 0x56, 0xb8, 0x3c, 0xa7, 0x83, 0xb9, 0x4e, 0xec, 0xcf,
- 0x72, 0x24, 0xbf, 0x06, 0x0d, 0x3d, 0x7c, 0x8a, 0x2f, 0x55, 0x14, 0x59,
- 0x08, 0x28, 0x4b, 0x37, 0xde, 0x02, 0x2a, 0x79, 0xcd, 0x6a, 0xe6, 0x6c,
- 0xf7, 0xdd, 0x95, 0xf0, 0x32, 0x40, 0xe6, 0xec, 0x0d, 0x91, 0x0c, 0xe9,
- 0xc8, 0xd1, 0x6d, 0x03, 0xd6, 0x78, 0xef, 0x61, 0x42, 0x7b, 0x16, 0x95,
- 0xab, 0x26, 0xbd, 0xce, 0x72, 0x4c, 0x76, 0x2d, 0xf2, 0x09, 0x6a, 0xdd,
- 0xbf, 0xfa, 0x72, 0x5a, 0x5e, 0x93, 0xe4, 0xea, 0x9b, 0x83, 0x46, 0x7f,
- 0x02, 0x90, 0xbc, 0x2f, 0x1f, 0xe5, 0x0e, 0xe3, 0xac, 0xb0, 0x16, 0xaf,
- 0xff, 0x5e, 0x01, 0x51, 0x7d, 0x43, 0xae, 0xd0, 0x89, 0xb4, 0x6d, 0x9b,
- 0xe6, 0xf5, 0x30, 0xed, 0xdb, 0x5f, 0xf8, 0xdf, 0xd2, 0xc9, 0x49, 0xa5,
- 0x65, 0x2e, 0x93, 0x2a, 0x75, 0x64, 0x67, 0xf7, 0xb6, 0x48, 0x14, 0x1c,
- 0x5c, 0xc4, 0x6f, 0xce, 0xf7, 0xd6, 0x4c, 0x32, 0xf4, 0x36, 0xbf, 0xdc,
- 0xe4, 0x1c, 0x81, 0xcd, 0x97, 0x9b, 0x90, 0x60, 0x24, 0x97, 0xe6, 0xe3,
- 0x0c, 0x79, 0x64, 0x72, 0x39, 0x6d, 0xf2, 0xad, 0x38, 0x60, 0xdd, 0x41,
- 0x58, 0x1c, 0xdd, 0x01, 0xc1, 0xb5, 0xec, 0xcc, 0x48, 0x1f, 0x3c, 0x09,
- 0x37, 0x01, 0xea, 0x8c, 0xa0, 0x57, 0x44, 0x45, 0x3c, 0x6e, 0x18, 0x28,
- 0x23, 0x97, 0x2e, 0xd4, 0x32, 0x90, 0x9e, 0x10, 0x0f, 0x90, 0xb8, 0x39,
- 0x97, 0xc5, 0x82, 0xd2, 0xdc, 0x27, 0x0d, 0xbc, 0x2d, 0x7c, 0x96, 0x86,
- 0xc9, 0xfb, 0x62, 0xca, 0xb5, 0xd5, 0xc9, 0x58, 0xce, 0xab, 0xc9, 0x72,
- 0x4e, 0xae, 0x8a, 0x09, 0x39, 0xc8, 0x70, 0xf1, 0xb0, 0x7a, 0xd0, 0x0a,
- 0xcf, 0xfb, 0x1d, 0x66, 0xe7, 0x08, 0x3b, 0xcc, 0xe5, 0xbb, 0x80, 0xa2,
- 0x10, 0x00, 0x4b, 0x1c, 0xe2, 0xd0, 0x0a, 0x2c, 0xf9, 0x89, 0x08, 0x20,
- 0x8a, 0x0c, 0x1e, 0xbf, 0x39, 0xbe, 0xb8, 0x38, 0xbe, 0xa0, 0xf9, 0x3e,
- 0xec, 0x54, 0xe3, 0x52, 0x12, 0x64, 0x17, 0x6a, 0x54, 0xd8, 0xaf, 0xef,
- 0xa9, 0xd1, 0xac, 0x24, 0x12, 0x85, 0x52, 0x8a, 0x0a, 0x16, 0x04, 0xd3,
- 0xfd, 0x70, 0xb9, 0x03, 0xdf, 0xbd, 0x08, 0xd8, 0xb7, 0x0d, 0x1b, 0x00,
- 0x06, 0x05, 0x07, 0x64, 0x4b, 0xb7, 0x70, 0x2d, 0x54, 0xc2, 0x80, 0xbf,
- 0xd4, 0xe4, 0xfa, 0x9b, 0xac, 0xa5, 0xa6, 0x0e, 0x05, 0xa9, 0x9b, 0x49,
- 0x30, 0x7d, 0x66, 0xfd, 0x13, 0x18, 0xf2, 0x15, 0x9d, 0x51, 0xb2, 0x9d,
- 0x30, 0x19, 0x75, 0xb3, 0x5c, 0xe4, 0x53, 0xeb, 0xed, 0x35, 0x3f, 0x37,
- 0xea, 0x5f, 0xc2, 0xa7, 0xbc, 0x56, 0xac, 0x0b, 0xa2, 0x9a, 0xea, 0x8c,
- 0xf0, 0xbd, 0x6d, 0x9d, 0x5a, 0xd5, 0x09, 0x12, 0xdf, 0x18, 0x34, 0xa6,
- 0xc4, 0xe6, 0xed, 0x34, 0x71, 0xd9, 0xfb, 0x19, 0xbc, 0x8c, 0x24, 0x2d,
- 0x14, 0x7e, 0xe3, 0x4b, 0x06, 0xf2, 0x65, 0xcd, 0x1d, 0xde, 0xdd, 0xd5,
- 0xb6, 0xbd, 0x40, 0x76, 0x68, 0x75, 0x90, 0xfc, 0x58, 0xe7, 0x93, 0x9f,
- 0xdd, 0xe5, 0x81, 0xf4, 0x9f, 0x36, 0x1f, 0x15, 0xa6, 0x4e, 0x26, 0x4a,
- 0x8c, 0x61, 0xce, 0xca, 0x7e, 0x3f, 0x3a, 0xbe, 0x48, 0x0e, 0xbf, 0x26,
- 0x46, 0xef, 0x7f, 0x70, 0x81, 0xe9, 0x39, 0xb9, 0x1d, 0x36, 0x84, 0x2c,
- 0x41, 0x28, 0x4a, 0x32, 0x75, 0x85, 0x4b, 0x69, 0xbc, 0xa3, 0x36, 0xc0,
- 0x8d, 0x7b, 0xe5, 0xf1, 0x49, 0xb4, 0xd6, 0x90, 0xdc, 0x85, 0x0f, 0xac,
- 0xe2, 0x63, 0xd6, 0x90, 0x0e, 0x99, 0xbf, 0x8a, 0x4c, 0x6e, 0xc4, 0x21,
- 0x09, 0x5d, 0x1b, 0xe9, 0x7d, 0x1d, 0x98, 0x9d, 0xbc, 0x4a, 0x87, 0xc9,
- 0xe6, 0xdb, 0xf2, 0xef, 0x46, 0x19, 0x48, 0x77, 0x9e, 0x0c, 0x77, 0x93,
- 0xad, 0xef, 0xf3, 0xe2, 0xc5, 0xb3, 0x3f, 0x27, 0x27, 0xdb, 0x9b, 0x2d,
- 0x30, 0x3f, 0x97, 0x14, 0x19, 0xa7, 0xc5, 0x47, 0xbb, 0x64, 0x67, 0x38,
- 0xd9, 0x0c, 0xaa, 0x13, 0xe7, 0x43, 0xcd, 0x74, 0xfe, 0x2b, 0x5b, 0x44,
- 0x0e, 0xa7, 0xe4, 0x05, 0x24, 0xdf, 0xd9, 0x0a, 0xef, 0x64, 0xe5, 0x9b,
- 0xa7, 0xa6, 0x34, 0x75, 0x2f, 0x9e, 0x05, 0x4d, 0x3c, 0xb5, 0x6d, 0xbc,
- 0xe7, 0x36, 0x7e, 0x61, 0x13, 0xfb, 0xc3, 0xdd, 0xfd, 0x64, 0xeb, 0x6c,
- 0xb4, 0xb3, 0x6f, 0x5b, 0x08, 0x9b, 0xd8, 0x47, 0x13, 0xf4, 0x50, 0xfb,
- 0xe5, 0xa7, 0xf4, 0xfd, 0x1f, 0xb3, 0xe2, 0xe7, 0x64, 0xeb, 0x87, 0xbd,
- 0x3d, 0xd3, 0xc0, 0x9f, 0x93, 0xc3, 0x93, 0x1f, 0x92, 0xa7, 0x43, 0xd3,
- 0xd8, 0xbb, 0xf4, 0x56, 0x9a, 0x13, 0x56, 0xe2, 0x11, 0x1a, 0x31, 0xbf,
- 0x0f, 0xda, 0x78, 0xd6, 0x69, 0xe3, 0xd4, 0xd8, 0x85, 0x9f, 0xcc, 0xb5,
- 0xb2, 0x3b, 0x7c, 0xb2, 0x9f, 0xe4, 0xcf, 0x3e, 0x7f, 0xae, 0x0d, 0x49,
- 0x1b, 0xf8, 0x7d, 0xdb, 0x5b, 0xc9, 0xcc, 0x27, 0x46, 0xd5, 0x39, 0xfe,
- 0x64, 0x04, 0x1a, 0x44, 0x44, 0x45, 0x9e, 0xc2, 0x9b, 0xb4, 0x9a, 0xca,
- 0x76, 0xa3, 0x5a, 0x23, 0x66, 0xa5, 0x84, 0x12, 0x3e, 0x83, 0xdb, 0xd2,
- 0x5c, 0x9c, 0x07, 0x41, 0x77, 0xc8, 0x36, 0xd5, 0x47, 0xff, 0x9c, 0xbc,
- 0x1d, 0x9d, 0x1c, 0x9b, 0x11, 0xed, 0x9a, 0xae, 0xb9, 0x39, 0xe4, 0x0e,
- 0xe1, 0x57, 0x98, 0xdc, 0x17, 0x60, 0x9b, 0x95, 0x36, 0x54, 0xe7, 0x66,
- 0x20, 0xab, 0xd9, 0x74, 0xe6, 0xe2, 0xae, 0xf1, 0x5d, 0x82, 0xa4, 0x0c,
- 0x0e, 0xaf, 0xc9, 0x84, 0xe0, 0xab, 0x16, 0x9f, 0xfe, 0xb6, 0x2c, 0xcc,
- 0x31, 0xa9, 0xca, 0x8a, 0x90, 0x53, 0x9b, 0x2d, 0x6d, 0xe1, 0xdb, 0xd7,
- 0xc7, 0x9c, 0x1d, 0xff, 0x36, 0x2d, 0x8c, 0x8c, 0x24, 0x86, 0xab, 0xfa,
- 0x23, 0xc5, 0xff, 0x39, 0x9c, 0xc3, 0xef, 0x9f, 0xde, 0x17, 0x9f, 0xcc,
- 0x3a, 0x7e, 0x36, 0xdc, 0x23, 0xc8, 0x36, 0x59, 0xbd, 0x6f, 0xde, 0x9a,
- 0x7f, 0xef, 0x3d, 0xdd, 0x4c, 0xe8, 0x57, 0x6d, 0x0b, 0x5e, 0xcf, 0xeb,
- 0xc6, 0xd1, 0xd9, 0xd9, 0xb7, 0x27, 0x0c, 0x00, 0x39, 0x12, 0xb7, 0x2a,
- 0x29, 0x57, 0xd6, 0x2a, 0x66, 0xe9, 0x6a, 0xac, 0x37, 0x97, 0xad, 0x84,
- 0x60, 0xdc, 0xc7, 0x2c, 0x5b, 0x10, 0x1a, 0xa1, 0xe9, 0x48, 0x84, 0x46,
- 0x64, 0xb4, 0xc5, 0x36, 0x91, 0xfa, 0xd3, 0xe1, 0xe2, 0x6c, 0x6a, 0xeb,
- 0xc2, 0x1d, 0xdf, 0x5b, 0x06, 0x8e, 0xd4, 0x55, 0x9e, 0x45, 0x17, 0x6d,
- 0xb6, 0x82, 0xba, 0xa0, 0xb1, 0xc2, 0x54, 0xd5, 0x46, 0x6c, 0xdf, 0xcd,
- 0x91, 0xd1, 0xee, 0xb9, 0xd3, 0x07, 0xe2, 0xb5, 0xdd, 0xf4, 0x48, 0xe2,
- 0xa1, 0xd1, 0x22, 0x5d, 0x87, 0x21, 0x6a, 0x64, 0x20, 0x08, 0x70, 0x5e,
- 0x64, 0x33, 0x0a, 0x83, 0x67, 0x80, 0xe7, 0xbd, 0x3b, 0x7c, 0x7b, 0xfc,
- 0xea, 0xbb, 0xc3, 0xd3, 0xf7, 0xc7, 0xe6, 0x95, 0xdc, 0x7c, 0x6c, 0xcb,
- 0x41, 0xf8, 0xd0, 0xc7, 0x79, 0x3e, 0x29, 0x67, 0x14, 0x65, 0xda, 0xfc,
- 0xf3, 0xe6, 0x06, 0xc3, 0xcb, 0x93, 0x1e, 0xbd, 0xb5, 0xc7, 0xaf, 0x99,
- 0x7d, 0x41, 0xff, 0xda, 0xe7, 0x7f, 0xed, 0xff, 0xb9, 0xb7, 0xdd, 0x1a,
- 0x74, 0x60, 0x25, 0x5f, 0xa1, 0xf6, 0x24, 0x6a, 0x06, 0xa2, 0xcc, 0x32,
- 0x72, 0x37, 0x78, 0x56, 0x7a, 0x1a, 0xa3, 0xd1, 0xbb, 0x8d, 0x9e, 0xdd,
- 0x1a, 0xdf, 0xfb, 0x36, 0x78, 0x8f, 0x5e, 0x7a, 0x05, 0x05, 0xa3, 0xb7,
- 0xdd, 0xb7, 0x2a, 0x07, 0x42, 0xe5, 0xd4, 0x86, 0x36, 0xc1, 0xac, 0x90,
- 0xc9, 0x56, 0x8f, 0xff, 0xf2, 0xea, 0xf5, 0xe1, 0xe5, 0x31, 0xbd, 0xa0,
- 0x9f, 0x17, 0x34, 0xa2, 0x4d, 0xa3, 0xa0, 0xfe, 0x6c, 0x49, 0x68, 0xfa,
- 0x15, 0x0d, 0xa8, 0xb7, 0xcd, 0xb1, 0x0c, 0x04, 0xd5, 0x3b, 0xfd, 0x2a,
- 0x0b, 0x05, 0x6e, 0xbb, 0x8c, 0xf3, 0x5a, 0x11, 0x2b, 0x5b, 0x3d, 0xfe,
- 0x5d, 0xcf, 0x7a, 0x70, 0xa5, 0xd6, 0x89, 0x84, 0x2b, 0xa7, 0x48, 0xb2,
- 0x08, 0x32, 0x6b, 0x19, 0x92, 0xe6, 0xd6, 0x47, 0x82, 0x15, 0xec, 0x71,
- 0xf2, 0x58, 0xf3, 0xed, 0xc2, 0x4b, 0x4a, 0x3b, 0xf9, 0x98, 0xca, 0x72,
- 0x6f, 0xff, 0xc9, 0x9f, 0x31, 0x9f, 0xaf, 0x7a, 0x3b, 0xe6, 0x6e, 0xe8,
- 0xfd, 0x99, 0x3e, 0x9d, 0x37, 0x5e, 0xed, 0x37, 0xf9, 0x0c, 0xd9, 0x53,
- 0xb2, 0xa3, 0x18, 0x2e, 0x43, 0xab, 0xee, 0x11, 0xf5, 0x60, 0x42, 0xef,
- 0x38, 0x4b, 0x4c, 0xa9, 0x6d, 0x14, 0x3c, 0x80, 0xf5, 0x42, 0xd1, 0x2a,
- 0xd4, 0xe3, 0x60, 0xa7, 0x2e, 0x3e, 0xe7, 0xdf, 0x1f, 0x7d, 0x7e, 0x97,
- 0xc7, 0x28, 0x54, 0x40, 0xf4, 0xcd, 0xf9, 0xbd, 0x26, 0x92, 0xe1, 0x5b,
- 0xd0, 0xc9, 0x79, 0xcd, 0x02, 0xcd, 0x78, 0x2c, 0xbe, 0x1d, 0x35, 0x46,
- 0xa0, 0x13, 0x18, 0xd1, 0x72, 0x0f, 0x45, 0x09, 0x68, 0x03, 0x1f, 0x64,
- 0xa1, 0x77, 0x76, 0x3a, 0xce, 0x8d, 0x26, 0x6c, 0x53, 0x63, 0x3c, 0xab,
- 0xdc, 0x4e, 0xbd, 0x1e, 0xbf, 0xdc, 0x23, 0x59, 0xa2, 0x8b, 0x92, 0xe7,
- 0xb2, 0xb6, 0x3e, 0x24, 0x44, 0x1b, 0xe5, 0xd9, 0xf6, 0x3a, 0x75, 0xf2,
- 0xd1, 0x30, 0x0c, 0x36, 0xe9, 0xd9, 0x3e, 0x36, 0xa2, 0xa6, 0xc8, 0xaa,
- 0xb5, 0x00, 0x8b, 0x48, 0x30, 0x0a, 0x43, 0xf4, 0x39, 0xe8, 0xcd, 0x3b,
- 0xc3, 0xe1, 0xd0, 0x9a, 0x3b, 0x08, 0xa4, 0x49, 0x0c, 0x8a, 0xe8, 0xeb,
- 0x7c, 0x5e, 0x60, 0xcc, 0xf1, 0x16, 0x94, 0x79, 0x28, 0xd4, 0xdb, 0x02,
- 0xbc, 0x11, 0x3f, 0x81, 0x3d, 0x1a, 0x9e, 0x8f, 0x63, 0x53, 0x3e, 0xbb,
- 0xa9, 0xfc, 0x0b, 0x1f, 0x63, 0x8b, 0xb0, 0xa6, 0x6f, 0xec, 0x7b, 0x94,
- 0x2a, 0x38, 0x56, 0x4e, 0x95, 0x76, 0x2e, 0x68, 0x07, 0x13, 0x80, 0x9c,
- 0x8b, 0xb5, 0x61, 0x49, 0x78, 0xd2, 0xa4, 0x2b, 0x7d, 0xc6, 0x1e, 0x90,
- 0x90, 0x2b, 0xef, 0xc0, 0x67, 0x00, 0xd6, 0x04, 0xc2, 0x9e, 0x14, 0xec,
- 0x1e, 0xd0, 0x1b, 0x64, 0x61, 0xd5, 0x66, 0x69, 0x47, 0x68, 0xa2, 0xc9,
- 0x66, 0x86, 0xee, 0xdf, 0x77, 0x54, 0xd2, 0xb4, 0x92, 0x9a, 0xc4, 0x63,
- 0xd4, 0xb6, 0x12, 0x74, 0xa4, 0x3a, 0x78, 0xe7, 0xae, 0x22, 0xb4, 0xd9,
- 0x80, 0xb9, 0x59, 0x34, 0x11, 0x51, 0xa5, 0x87, 0xb0, 0x73, 0xac, 0x8b,
- 0x97, 0x4f, 0xb4, 0x45, 0x1b, 0x2c, 0xef, 0xcc, 0x8d, 0xbb, 0x95, 0xdb,
- 0xa2, 0xcb, 0xcc, 0x28, 0x7b, 0x97, 0x6d, 0xc5, 0x06, 0x91, 0x7b, 0x49,
- 0x7a, 0x67, 0xae, 0x9e, 0x22, 0x23, 0x7c, 0x26, 0x90, 0x0e, 0xf0, 0xca,
- 0x9c, 0x7a, 0x7e, 0x46, 0x47, 0x96, 0x2d, 0x25, 0x92, 0x52, 0x57, 0x24,
- 0x29, 0xd9, 0x62, 0x43, 0x83, 0xe9, 0x91, 0xd5, 0xa1, 0x47, 0x0a, 0x78,
- 0x39, 0x27, 0x96, 0x52, 0xd1, 0xd4, 0xd5, 0x3c, 0xa7, 0x9e, 0x1b, 0x11,
- 0x3d, 0x92, 0x7d, 0x93, 0x03, 0x97, 0x48, 0x7e, 0x0e, 0xc6, 0x55, 0xe8,
- 0x6c, 0xa1, 0x54, 0x88, 0xfd, 0x88, 0x8d, 0x4f, 0x8b, 0xfb, 0x89, 0xe0,
- 0xbd, 0xc5, 0x00, 0x9c, 0x15, 0x1a, 0x12, 0x16, 0xf3, 0xea, 0xfa, 0x9a,
- 0xad, 0xb6, 0xa4, 0x3b, 0xb4, 0xf8, 0x26, 0x3b, 0xa5, 0x59, 0x21, 0x14,
- 0xf4, 0xfd, 0xaa, 0xd9, 0xbc, 0xb4, 0x85, 0xf4, 0xc4, 0xeb, 0xd2, 0xda,
- 0xcc, 0x1a, 0x93, 0xe4, 0x75, 0x6b, 0x6c, 0xd2, 0x15, 0x12, 0x34, 0xda,
- 0x31, 0xe4, 0xb3, 0x8b, 0x0d, 0x94, 0x0e, 0x28, 0x1c, 0x21, 0x83, 0x2e,
- 0x3a, 0x88, 0xf6, 0x1c, 0x02, 0xc5, 0x21, 0x51, 0xef, 0x2c, 0xd4, 0x0a,
- 0xdb, 0x35, 0x19, 0xa7, 0xce, 0xe4, 0xda, 0x48, 0x5a, 0xde, 0x5e, 0x2a,
- 0xbd, 0x76, 0x52, 0x88, 0x1c, 0x2a, 0x6f, 0x33, 0xc7, 0xf4, 0xe8, 0x1c,
- 0x8e, 0x8e, 0x6d, 0x58, 0x4e, 0xbf, 0x15, 0x26, 0x9d, 0x00, 0xaf, 0x95,
- 0x57, 0x18, 0x64, 0x67, 0x56, 0x86, 0x89, 0xd7, 0x24, 0xbb, 0x4a, 0xca,
- 0x16, 0x19, 0x35, 0xfa, 0x26, 0x71, 0x6b, 0x6d, 0x91, 0xf7, 0x08, 0xb3,
- 0xb5, 0x78, 0xa6, 0x09, 0x17, 0x0f, 0xd2, 0x0a, 0x08, 0x16, 0xa3, 0xe7,
- 0xe2, 0xbf, 0x3a, 0xca, 0x9e, 0x5d, 0xa4, 0x1e, 0xd2, 0x3c, 0xc7, 0xb2,
- 0x09, 0xb0, 0x07, 0x48, 0xa1, 0xb3, 0x21, 0xfc, 0x4b, 0x59, 0x27, 0xec,
- 0x64, 0x78, 0xd0, 0x3a, 0x82, 0x34, 0x38, 0x73, 0x16, 0xa2, 0x81, 0x3c,
- 0x14, 0xa2, 0xe6, 0x25, 0x5c, 0xc1, 0x60, 0xbc, 0xc1, 0xf9, 0x46, 0x83,
- 0x89, 0x4a, 0xf4, 0xf5, 0x84, 0x05, 0xe3, 0xd6, 0xc1, 0x7c, 0xe8, 0x9c,
- 0x9e, 0x5f, 0x9c, 0x7d, 0x7d, 0x71, 0x3c, 0x1a, 0x25, 0x6f, 0x8f, 0x2f,
- 0xd9, 0xd6, 0xbf, 0x64, 0xe8, 0xdd, 0x35, 0x2a, 0x47, 0x23, 0xd6, 0xa0,
- 0x64, 0x4c, 0x0a, 0x39, 0x51, 0x47, 0x02, 0x72, 0x9e, 0xa8, 0x28, 0x32,
- 0x6e, 0x47, 0x36, 0xe2, 0x67, 0x82, 0xd8, 0xbb, 0x81, 0xb7, 0x1f, 0x98,
- 0x26, 0x04, 0x24, 0xad, 0xf3, 0xdc, 0xb9, 0x51, 0xa1, 0x18, 0x33, 0xca,
- 0xc9, 0xe6, 0x1c, 0x3a, 0x17, 0x3a, 0x5d, 0xd9, 0xe6, 0x4f, 0x0c, 0xef,
- 0x8f, 0x66, 0x36, 0xa5, 0x0c, 0xdc, 0x1f, 0x8d, 0xf1, 0x2b, 0x9b, 0xe2,
- 0x8f, 0xc9, 0x0f, 0xa6, 0xcd, 0xa9, 0x31, 0x5e, 0xa5, 0xe6, 0xed, 0x08,
- 0xc5, 0x6e, 0x1d, 0xd7, 0x72, 0xee, 0x15, 0x73, 0x4e, 0x38, 0xc5, 0xb0,
- 0x7a, 0xa0, 0xce, 0x24, 0xb8, 0x62, 0x98, 0xbf, 0x48, 0x30, 0x75, 0xf6,
- 0xcb, 0x52, 0x6b, 0x2c, 0x49, 0x4e, 0xb3, 0x2b, 0x94, 0x61, 0xc1, 0xe7,
- 0x4c, 0x73, 0xbb, 0x44, 0x4a, 0xbd, 0xf7, 0x96, 0x7e, 0xb4, 0x9b, 0x3c,
- 0xf9, 0xfc, 0xf9, 0xee, 0xe7, 0xfc, 0x57, 0xfd, 0xef, 0x8b, 0xa7, 0xbb,
- 0xc2, 0x8e, 0x6f, 0xfe, 0xf5, 0xf4, 0xe0, 0xe9, 0xde, 0x01, 0xf1, 0x34,
- 0xee, 0x1e, 0xec, 0x9a, 0xff, 0xff, 0x54, 0x7e, 0x42, 0x64, 0x94, 0x2f,
- 0xf6, 0x3f, 0xff, 0x0c, 0x68, 0x18, 0xda, 0x1f, 0x33, 0xf3, 0x91, 0x41,
- 0x53, 0x0e, 0x40, 0x17, 0x05, 0xcd, 0xe7, 0x8f, 0x6d, 0x4f, 0x24, 0x85,
- 0xd7, 0xa9, 0x0a, 0x36, 0x0d, 0xdc, 0xd6, 0x00, 0x55, 0xaf, 0x2a, 0x33,
- 0xd8, 0xf8, 0x95, 0x0b, 0xed, 0x30, 0xe4, 0x6d, 0x2e, 0xa4, 0x07, 0xfe,
- 0xb5, 0xd6, 0x3b, 0x0c, 0x34, 0xf7, 0xa8, 0xde, 0x7e, 0xe9, 0xa7, 0x35,
- 0x91, 0x7c, 0x03, 0x04, 0x6e, 0xb2, 0x54, 0xf2, 0xde, 0x44, 0xcb, 0xb5,
- 0xf9, 0x85, 0xa5, 0x3b, 0xd5, 0x98, 0x7f, 0xe9, 0xf7, 0xd8, 0x73, 0x45,
- 0x6f, 0xc9, 0x6e, 0x48, 0xc2, 0xaf, 0xd9, 0x5c, 0x84, 0xc8, 0xb7, 0x5a,
- 0x9b, 0x67, 0xc3, 0x2d, 0xbf, 0x9b, 0x29, 0xaf, 0xaa, 0xb2, 0xcd, 0xe1,
- 0xe2, 0xba, 0xca, 0x91, 0x21, 0x07, 0xcd, 0xbd, 0x5f, 0xf8, 0xed, 0x3d,
- 0xa6, 0x39, 0x37, 0x22, 0xec, 0x60, 0xbb, 0x72, 0x03, 0x6f, 0x71, 0x72,
- 0x06, 0xb6, 0xd9, 0xc2, 0x99, 0x4a, 0x10, 0x6a, 0x6b, 0x1a, 0xe3, 0x55,
- 0xbb, 0x65, 0x07, 0xfc, 0x86, 0xe8, 0x9c, 0x36, 0x2f, 0x0e, 0xf5, 0x4a,
- 0x71, 0xc5, 0xf3, 0xf3, 0xba, 0xb3, 0x83, 0x4f, 0xd1, 0x6e, 0xf4, 0xbe,
- 0x27, 0xdf, 0xc0, 0x79, 0xb2, 0x87, 0x6e, 0xed, 0xd0, 0x1c, 0xb6, 0x5e,
- 0x6b, 0x36, 0x32, 0x8e, 0x0b, 0xca, 0x77, 0xec, 0x48, 0xba, 0xe7, 0x00,
- 0x5f, 0xb7, 0xcd, 0xf9, 0xb7, 0xcf, 0x0c, 0x34, 0xe0, 0xd4, 0x3f, 0xd0,
- 0x34, 0x2d, 0xa9, 0x96, 0xc3, 0xb6, 0x8a, 0xb0, 0xc1, 0x1f, 0x2c, 0x6c,
- 0x0b, 0x97, 0x19, 0xc3, 0xda, 0xa8, 0x29, 0x9a, 0xcf, 0x99, 0x9f, 0x4b,
- 0x6b, 0xa5, 0xdd, 0x38, 0xad, 0x5a, 0x55, 0x13, 0x36, 0xa4, 0xea, 0xc6,
- 0x9c, 0xb8, 0xe6, 0x90, 0xee, 0xc8, 0x7a, 0xc4, 0xbf, 0x6c, 0x6c, 0x8c,
- 0xce, 0x8f, 0x8f, 0x5f, 0x27, 0xa7, 0x27, 0x6f, 0x4f, 0x2e, 0x3d, 0x2d,
- 0xdc, 0xde, 0x1e, 0xea, 0x69, 0xd5, 0xda, 0x71, 0x9d, 0xe9, 0x70, 0xd4,
- 0xcb, 0x52, 0xdf, 0x45, 0xee, 0xef, 0x79, 0x26, 0x59, 0x14, 0xb3, 0xee,
- 0x7b, 0xb0, 0xb7, 0xc1, 0xec, 0x44, 0x35, 0xb8, 0x3d, 0x2d, 0xae, 0x36,
- 0x1a, 0x8d, 0xe9, 0xdd, 0x80, 0xd9, 0x05, 0x06, 0x7f, 0x11, 0x9c, 0x46,
- 0x5b, 0x5d, 0x12, 0x16, 0x59, 0x9b, 0xd2, 0x23, 0xd8, 0xd6, 0x4e, 0xaf,
- 0x68, 0x6e, 0x33, 0x86, 0x56, 0x7b, 0x6e, 0x39, 0xc0, 0xf6, 0xee, 0x32,
- 0xb0, 0x1d, 0xcc, 0x73, 0xce, 0xb5, 0xf4, 0x31, 0xc5, 0x28, 0x65, 0x22,
- 0x37, 0x1e, 0xe4, 0xb8, 0xff, 0x45, 0xef, 0x74, 0x58, 0x40, 0xad, 0x7e,
- 0xab, 0xe6, 0x7a, 0x7c, 0x66, 0x02, 0x8a, 0xe4, 0xc9, 0xae, 0x4d, 0x57,
- 0x58, 0x40, 0xe6, 0x88, 0x7e, 0x4f, 0x1f, 0xdb, 0x4b, 0x8c, 0x12, 0xb2,
- 0x24, 0x55, 0xbe, 0x5a, 0x16, 0xc1, 0x75, 0xf7, 0x17, 0x7e, 0xd7, 0x8c,
- 0xff, 0xf9, 0x2e, 0xae, 0xb7, 0xab, 0xb4, 0x1a, 0x18, 0x75, 0xeb, 0x7e,
- 0xa0, 0x2e, 0x55, 0xde, 0x11, 0x82, 0x37, 0x66, 0x7f, 0x4f, 0xe6, 0xea,
- 0x5c, 0x76, 0x54, 0x44, 0x97, 0x73, 0x52, 0x22, 0x2e, 0x39, 0x93, 0x03,
- 0x40, 0x43, 0xa7, 0x4c, 0x5f, 0xf5, 0x70, 0x3a, 0x05, 0xc7, 0x31, 0x0c,
- 0xeb, 0x2a, 0x3a, 0x19, 0x45, 0x19, 0x08, 0x10, 0xab, 0xd4, 0x6a, 0x4e,
- 0xc3, 0x94, 0xb1, 0x84, 0xfa, 0xf4, 0x3c, 0xd9, 0xfb, 0x9c, 0xc6, 0xf1,
- 0xb8, 0xf1, 0xbc, 0x29, 0xab, 0x89, 0xcd, 0x29, 0x86, 0x8d, 0xe0, 0x25,
- 0x98, 0x72, 0x5a, 0x04, 0x6a, 0xae, 0xf1, 0xec, 0x2a, 0x28, 0x16, 0xa0,
- 0x3d, 0x32, 0x4a, 0x24, 0x9e, 0x0e, 0x77, 0x14, 0x02, 0xdc, 0xac, 0x16,
- 0xd1, 0x5d, 0x23, 0xf3, 0x42, 0x0e, 0x56, 0x06, 0xed, 0x6d, 0x56, 0x36,
- 0x01, 0x95, 0xa7, 0x81, 0x5c, 0x22, 0x66, 0xaf, 0xdd, 0xe5, 0x53, 0xa8,
- 0xd2, 0x8e, 0x6b, 0xce, 0xac, 0x17, 0x6f, 0x3e, 0xc6, 0x4a, 0x23, 0x66,
- 0x89, 0x60, 0xa7, 0xed, 0x99, 0x28, 0x30, 0x34, 0xad, 0x25, 0x3c, 0x0a,
- 0x5b, 0xd0, 0x1f, 0x28, 0xbf, 0xd9, 0xc5, 0x05, 0xc8, 0x7e, 0x22, 0xd1,
- 0xdc, 0x73, 0x5f, 0xa1, 0x5c, 0x81, 0xa6, 0x99, 0xa9, 0x33, 0xe1, 0xad,
- 0xdd, 0xd8, 0xed, 0x31, 0x13, 0x53, 0x8b, 0x37, 0xec, 0xbd, 0x5d, 0xa3,
- 0xb4, 0xce, 0xca, 0x71, 0xa7, 0x64, 0x7d, 0x68, 0x89, 0x62, 0x58, 0x03,
- 0xcc, 0xce, 0xde, 0xee, 0xb7, 0xab, 0x67, 0x1d, 0x4c, 0xf5, 0x6b, 0x5f,
- 0xde, 0x7f, 0xba, 0x66, 0xd1, 0xce, 0x2a, 0x18, 0xe3, 0x99, 0x62, 0x20,
- 0xa1, 0x08, 0xba, 0xc8, 0x4b, 0xb0, 0x6c, 0x66, 0xe3, 0x67, 0xd7, 0x29,
- 0x4a, 0xff, 0xae, 0xe9, 0xbd, 0xe6, 0x84, 0x74, 0xba, 0xf2, 0x56, 0x50,
- 0xd9, 0xfc, 0xcb, 0x9a, 0xdc, 0x62, 0x0b, 0x30, 0xed, 0x39, 0xdb, 0xd5,
- 0xa6, 0x93, 0x33, 0x37, 0x83, 0xf7, 0x36, 0x4b, 0xce, 0x7e, 0x5b, 0x48,
- 0xe8, 0xee, 0xa9, 0xb2, 0xeb, 0x25, 0x33, 0x61, 0x94, 0x6c, 0xeb, 0x13,
- 0x31, 0xb5, 0x9c, 0x57, 0x23, 0x9b, 0x09, 0x3e, 0xc4, 0xfb, 0x09, 0x82,
- 0x77, 0x92, 0xaa, 0xca, 0x2a, 0xb5, 0x7b, 0x3b, 0x17, 0x03, 0x39, 0x65,
- 0x27, 0xe5, 0x5c, 0xaa, 0x7f, 0xf2, 0xf1, 0x2a, 0xbc, 0xc4, 0x7e, 0x66,
- 0x5e, 0x1c, 0x22, 0xd3, 0x97, 0x37, 0x8a, 0x15, 0xf6, 0x94, 0x56, 0x46,
- 0xd1, 0xb0, 0x86, 0xc3, 0x02, 0x68, 0xa0, 0x2f, 0xbb, 0x16, 0x2d, 0xd9,
- 0x4f, 0x91, 0xc4, 0xaf, 0x95, 0x01, 0x93, 0xb9, 0xf2, 0xc9, 0xd9, 0x7f,
- 0x74, 0xf6, 0xee, 0xcd, 0xc9, 0xd7, 0x96, 0xca, 0x88, 0x85, 0x78, 0x8b,
- 0x62, 0x83, 0xdd, 0xc7, 0x7e, 0xa4, 0x5b, 0x8a, 0xaa, 0x0a, 0xfa, 0xd6,
- 0x88, 0xa7, 0x0f, 0xfe, 0x0f, 0x20, 0x40, 0x8a, 0x27, 0xe4, 0x20, 0x67,
- 0xfe, 0x8f, 0x7a, 0xdb, 0xb9, 0x1b, 0x3a, 0x54, 0x75, 0x9c, 0xa5, 0x91,
- 0x56, 0xcd, 0x72, 0x61, 0x41, 0x84, 0x5e, 0x51, 0x56, 0x61, 0xd2, 0xd6,
- 0x54, 0xf4, 0xe5, 0x82, 0x45, 0x93, 0x24, 0x94, 0xb6, 0xbc, 0xb9, 0x7c,
- 0x07, 0x90, 0x3b, 0x41, 0xb8, 0x54, 0xe4, 0x02, 0x08, 0x70, 0x39, 0x33,
- 0xa2, 0xde, 0xf4, 0xf1, 0xf2, 0x1a, 0xbf, 0x99, 0xa6, 0xf5, 0x0d, 0x0f,
- 0x14, 0x97, 0x46, 0xce, 0x30, 0x6d, 0xc4, 0xda, 0xd2, 0x29, 0x19, 0xea,
- 0x0e, 0x8c, 0x63, 0xd1, 0xbf, 0x2e, 0x3e, 0x64, 0x6b, 0x9a, 0x39, 0x7c,
- 0x92, 0xa6, 0xb1, 0xa6, 0x08, 0x55, 0x22, 0xd6, 0x89, 0x9f, 0xbc, 0xa2,
- 0xb0, 0xcc, 0x01, 0x11, 0xca, 0xcf, 0x99, 0x50, 0xce, 0x4f, 0x3f, 0x15,
- 0x29, 0xe9, 0x58, 0xdf, 0x4f, 0xae, 0xbc, 0x8c, 0x36, 0xc6, 0x09, 0xea,
- 0xa6, 0x63, 0x1f, 0x31, 0x39, 0x58, 0x36, 0xff, 0xb0, 0x39, 0xa8, 0xef,
- 0xe7, 0xe3, 0x72, 0xa6, 0x89, 0x17, 0x96, 0x40, 0x42, 0x1f, 0xd2, 0x9a,
- 0x79, 0x48, 0xc9, 0xe5, 0x48, 0x6d, 0xe3, 0xb9, 0x25, 0x1d, 0x56, 0xca,
- 0xf5, 0x9f, 0x6b, 0x19, 0x21, 0x3c, 0xa4, 0xa3, 0x00, 0xb7, 0x0f, 0xc9,
- 0xf8, 0xac, 0x98, 0xcc, 0x4a, 0xd9, 0xd5, 0x94, 0x60, 0x8e, 0x99, 0x6a,
- 0x0f, 0x9d, 0x22, 0x7e, 0xe5, 0x92, 0x3c, 0x1c, 0xa8, 0x1f, 0x62, 0xd4,
- 0x9d, 0x9e, 0x30, 0x6a, 0x60, 0x80, 0xf4, 0x36, 0xff, 0x42, 0x50, 0xf9,
- 0x1e, 0xbf, 0x0d, 0x17, 0x1c, 0x31, 0x5d, 0xfd, 0x89, 0x1d, 0x8a, 0x1c,
- 0xf7, 0xfb, 0x8b, 0x7e, 0x5c, 0x1f, 0xed, 0x4c, 0xbd, 0xd9, 0x4f, 0x69,
- 0x75, 0x2d, 0x2c, 0x7d, 0x12, 0x49, 0x83, 0x91, 0x68, 0xcb, 0xda, 0x58,
- 0xc7, 0x24, 0x29, 0x25, 0x16, 0x35, 0x03, 0xf5, 0x69, 0xc9, 0x39, 0x85,
- 0x92, 0x71, 0xc5, 0x2e, 0x49, 0xbb, 0x11, 0x3d, 0x89, 0xf3, 0x07, 0x8b,
- 0x45, 0x49, 0xdd, 0x5d, 0xa6, 0xe5, 0x29, 0x9c, 0x7f, 0x56, 0x2e, 0x33,
- 0xef, 0x35, 0x72, 0xe2, 0xc1, 0x12, 0xce, 0xc4, 0x71, 0xc2, 0x9f, 0xd2,
- 0x4a, 0xf7, 0x5a, 0x3e, 0xd2, 0x35, 0xc1, 0xbf, 0x7f, 0x25, 0x55, 0xca,
- 0xcc, 0x79, 0x16, 0xa6, 0x14, 0xa1, 0x0f, 0xfc, 0x7c, 0x57, 0xdc, 0x6f,
- 0x8d, 0xc0, 0x55, 0xeb, 0xe4, 0xf0, 0xe2, 0xd8, 0x68, 0xb6, 0xd7, 0x05,
- 0x38, 0x2a, 0x8a, 0x46, 0x93, 0xea, 0xb2, 0x42, 0x0a, 0xa3, 0x15, 0x7a,
- 0x3e, 0xe8, 0x83, 0x77, 0xde, 0x9b, 0xb4, 0x99, 0x04, 0x18, 0xc0, 0xf9,
- 0xdb, 0x6e, 0xcb, 0x4d, 0x94, 0x17, 0x18, 0x52, 0x87, 0x68, 0x12, 0x78,
- 0x4b, 0x51, 0x88, 0xc4, 0x7c, 0xaa, 0x54, 0x4e, 0xe0, 0xf3, 0x40, 0xac,
- 0xfb, 0x64, 0xc0, 0x3a, 0xd7, 0x38, 0xd5, 0x2e, 0x15, 0xe1, 0x6f, 0x4a,
- 0xcc, 0x29, 0xdf, 0x6a, 0x85, 0x3d, 0xdd, 0x76, 0xea, 0xc7, 0x5d, 0x46,
- 0x7f, 0xc3, 0x3d, 0x43, 0xba, 0x48, 0x57, 0x2f, 0xc8, 0x2c, 0xc2, 0x9e,
- 0xbd, 0xd7, 0x53, 0x4f, 0xf9, 0xe5, 0x14, 0x40, 0xc2, 0x58, 0xb3, 0x63,
- 0x5a, 0x98, 0x80, 0xc4, 0xaf, 0xc3, 0xe6, 0xc0, 0x54, 0xce, 0x2a, 0xed,
- 0x0a, 0x82, 0x0b, 0x8f, 0x89, 0x2d, 0xe9, 0x23, 0x2b, 0x00, 0xbe, 0x7c,
- 0x8a, 0xfa, 0x76, 0xff, 0x60, 0x47, 0xeb, 0xfa, 0xb0, 0xe1, 0xd5, 0x55,
- 0x37, 0x4b, 0xaa, 0xec, 0x76, 0xd4, 0x8b, 0x21, 0x7d, 0x08, 0x22, 0x15,
- 0x31, 0x53, 0xfa, 0x0b, 0x7e, 0x0c, 0xd4, 0x9b, 0xd2, 0x9d, 0x42, 0xea,
- 0x58, 0x0a, 0xad, 0x52, 0x62, 0xaa, 0xae, 0x23, 0x1c, 0xd8, 0x83, 0x84,
- 0x1e, 0xfb, 0xaa, 0xf1, 0xe0, 0xdb, 0x1d, 0xad, 0x67, 0x4d, 0xfe, 0x1b,
- 0x4a, 0x20, 0xd6, 0x03, 0x5f, 0x67, 0xad, 0x02, 0xd8, 0x36, 0x53, 0xa8,
- 0x37, 0xe8, 0x99, 0xb9, 0xd8, 0x9c, 0xcd, 0x9c, 0xc0, 0xd7, 0xc7, 0x68,
- 0x55, 0x91, 0x54, 0xe7, 0x14, 0x26, 0x91, 0x5d, 0x54, 0x54, 0xe3, 0xbe,
- 0x95, 0xe2, 0x40, 0x65, 0xea, 0x28, 0x03, 0xc8, 0x12, 0x7b, 0x21, 0x4d,
- 0x04, 0x20, 0x81, 0xdb, 0xbc, 0xd6, 0xe0, 0xa3, 0xd9, 0xdb, 0x13, 0xc6,
- 0x44, 0x34, 0x4c, 0x48, 0x90, 0x35, 0x13, 0x6f, 0x2a, 0xb3, 0xc9, 0x4d,
- 0xc9, 0x98, 0x5a, 0x33, 0x69, 0x5e, 0xa6, 0x67, 0x2f, 0xf9, 0x5f, 0xb2,
- 0x07, 0xbe, 0x75, 0x49, 0x7b, 0xb4, 0x11, 0x86, 0xcc, 0x43, 0x39, 0x74,
- 0x1b, 0xe2, 0xf8, 0x87, 0xcb, 0x8b, 0xc3, 0xe4, 0x9b, 0xe3, 0xc3, 0xd7,
- 0xc7, 0x17, 0xa3, 0xce, 0xa5, 0x2f, 0xf0, 0x0f, 0xd6, 0xd0, 0xc8, 0x09,
- 0x0c, 0xd5, 0x58, 0x89, 0x07, 0x04, 0xb7, 0xaf, 0x52, 0xcf, 0x6c, 0x1e,
- 0x3a, 0x48, 0xe6, 0x7c, 0x90, 0x41, 0xc4, 0xd1, 0x02, 0x10, 0x18, 0xd7,
- 0x10, 0x36, 0xb6, 0x8d, 0x89, 0x91, 0x50, 0x04, 0x62, 0x50, 0x97, 0xb9,
- 0x9f, 0x31, 0xe3, 0xb8, 0xfa, 0xdc, 0x65, 0x32, 0x2d, 0x35, 0x19, 0xb0,
- 0xbd, 0x72, 0xdf, 0xb8, 0x7c, 0x6f, 0x4f, 0x6c, 0xc9, 0x25, 0x23, 0x5e,
- 0xc3, 0xde, 0x0f, 0x03, 0xf3, 0xdd, 0x81, 0x99, 0xfc, 0x01, 0x91, 0x39,
- 0xde, 0x67, 0x75, 0xaf, 0xe3, 0x02, 0x6c, 0x7f, 0x1e, 0x32, 0xfa, 0x3a,
- 0x3c, 0x49, 0xdf, 0x44, 0x5b, 0xa2, 0xd3, 0x35, 0xa3, 0xfa, 0x48, 0x5d,
- 0x0b, 0x02, 0x97, 0xaa, 0xa7, 0x24, 0xcb, 0x09, 0x0a, 0xd2, 0x5b, 0x04,
- 0xa0, 0xe4, 0xcc, 0x4c, 0xc1, 0x83, 0xa1, 0x23, 0x32, 0x04, 0xe8, 0x3a,
- 0xe6, 0xec, 0xf1, 0xa5, 0x3e, 0x63, 0xae, 0x65, 0xf6, 0x98, 0x99, 0x6e,
- 0xc9, 0x43, 0xfe, 0xfd, 0x80, 0x00, 0x88, 0x60, 0xf0, 0xeb, 0x56, 0x7c,
- 0x54, 0x9c, 0xa1, 0x52, 0xb3, 0x51, 0x9a, 0xa3, 0x3e, 0xd8, 0x3d, 0xaf,
- 0xd0, 0x7d, 0xfa, 0xa4, 0x56, 0x08, 0x91, 0x77, 0x19, 0x05, 0x46, 0x46,
- 0x3d, 0xfc, 0x9b, 0x5c, 0x7b, 0x96, 0xde, 0x51, 0x7d, 0xd5, 0xcb, 0x05,
- 0xf2, 0x37, 0x33, 0x4a, 0xb3, 0x01, 0x3d, 0x6e, 0x9f, 0xcb, 0x92, 0x6f,
- 0xca, 0x1a, 0x77, 0x41, 0xf8, 0x38, 0x5d, 0xf2, 0xb1, 0xe9, 0xc7, 0x1b,
- 0x12, 0xdf, 0xb2, 0x24, 0xb1, 0x1b, 0x1b, 0x9a, 0x52, 0x75, 0x7e, 0x78,
- 0xf9, 0x0d, 0xa2, 0xab, 0xd8, 0xc2, 0xaf, 0xc1, 0x98, 0xa2, 0x31, 0xb5,
- 0x30, 0x25, 0xcb, 0x1a, 0x70, 0xac, 0xff, 0x2a, 0x31, 0xa3, 0xea, 0x93,
- 0x88, 0xde, 0xe5, 0x0c, 0x44, 0x9a, 0x71, 0xad, 0x5f, 0xc8, 0xe8, 0x56,
- 0x1d, 0x46, 0x40, 0xdf, 0x6d, 0xbe, 0x9d, 0xc5, 0x5b, 0x6e, 0x72, 0x22,
- 0xfc, 0x26, 0x8f, 0x09, 0x9b, 0x9e, 0x94, 0xb9, 0x8d, 0xa4, 0xcd, 0x3c,
- 0x8c, 0x5f, 0x50, 0xa6, 0x33, 0x07, 0xa0, 0xa6, 0x65, 0x9c, 0xf7, 0xd0,
- 0x3b, 0xd2, 0x5f, 0xce, 0xef, 0x87, 0x21, 0x01, 0x4f, 0xf2, 0xd5, 0xb2,
- 0x69, 0x8b, 0x95, 0x0e, 0xff, 0xb1, 0xd5, 0x2c, 0xab, 0xb2, 0x6c, 0xbc,
- 0x3e, 0x40, 0xfb, 0x49, 0x1b, 0x39, 0xd1, 0x4c, 0x70, 0xc9, 0x7d, 0xa1,
- 0xa6, 0x0a, 0xd1, 0xbb, 0x7d, 0xc5, 0x30, 0x1d, 0xd7, 0xe5, 0x6c, 0xd9,
- 0x78, 0xe8, 0xeb, 0x5f, 0xd6, 0x67, 0xaf, 0xd3, 0x5b, 0x27, 0x43, 0x25,
- 0xfb, 0x2c, 0x98, 0xa2, 0xce, 0x58, 0xfa, 0x46, 0xbd, 0x44, 0xb0, 0xb1,
- 0x2a, 0x8b, 0x76, 0x0d, 0x38, 0x00, 0xbd, 0xb7, 0x37, 0x36, 0x46, 0xba,
- 0xd8, 0x44, 0xf7, 0x1a, 0x2e, 0xfa, 0xf7, 0xd0, 0x26, 0xa9, 0x0f, 0x1c,
- 0x2c, 0x98, 0x98, 0xbf, 0x28, 0x09, 0x5c, 0xc6, 0x6b, 0x0a, 0x11, 0xce,
- 0x6b, 0x9c, 0xd7, 0xed, 0x41, 0xe1, 0x57, 0x36, 0x5c, 0xa1, 0xf9, 0x65,
- 0x97, 0xa5, 0x72, 0xf2, 0x4b, 0xb8, 0xce, 0x6d, 0x88, 0x56, 0x36, 0x7c,
- 0x94, 0x61, 0x9a, 0x2e, 0x01, 0xad, 0x20, 0x6d, 0xe1, 0xb8, 0xd4, 0xc9,
- 0x9d, 0xff, 0xbd, 0x93, 0xf4, 0xb9, 0x3a, 0x41, 0x84, 0xb4, 0x67, 0x99,
- 0xfc, 0xff, 0x00, 0xbc, 0x12, 0x7a, 0x5f, 0x6a, 0x73, 0xd8, 0x26, 0x90,
- 0x1d, 0x1a, 0x13, 0xea, 0xa6, 0x9a, 0xb8, 0xdd, 0x6f, 0xb4, 0x83, 0xec,
- 0x8e, 0xec, 0x17, 0xb5, 0x11, 0x84, 0x2e, 0x84, 0x8b, 0x38, 0x5b, 0x02,
- 0x26, 0xd0, 0x6d, 0x5c, 0x59, 0xaf, 0x1e, 0xd5, 0x53, 0xe5, 0xa2, 0xa3,
- 0xac, 0xd6, 0xa3, 0x9c, 0x92, 0x86, 0x4d, 0x37, 0x92, 0x96, 0xdd, 0x4e,
- 0xe5, 0x08, 0xf9, 0x4f, 0x4d, 0x3a, 0x12, 0x60, 0x97, 0x6c, 0x7f, 0xaf,
- 0x44, 0x9f, 0x14, 0x3b, 0x46, 0x6a, 0x93, 0x20, 0x4e, 0x19, 0x4d, 0xa7,
- 0xe1, 0x48, 0xed, 0xa4, 0x6a, 0x01, 0x14, 0xad, 0x04, 0xad, 0xa5, 0x30,
- 0x8f, 0x10, 0x92, 0x8c, 0x38, 0x8c, 0x39, 0x69, 0x9b, 0x8a, 0x49, 0xaa,
- 0x25, 0xa3, 0x57, 0xaa, 0xa6, 0x71, 0xd8, 0x95, 0x72, 0xdd, 0x97, 0xbb,
- 0x1f, 0x49, 0xf8, 0x88, 0xcc, 0x51, 0x09, 0x4d, 0x5f, 0x25, 0xd0, 0x21,
- 0x49, 0x45, 0x5f, 0x06, 0x6f, 0xf8, 0x80, 0x14, 0x87, 0xd8, 0xbc, 0xa6,
- 0x2c, 0x0f, 0x71, 0x49, 0x09, 0x97, 0x09, 0xfc, 0x5f, 0x37, 0xb9, 0xe0,
- 0x4a, 0x79, 0xd6, 0xdb, 0x55, 0x54, 0xe1, 0xe1, 0x23, 0x48, 0x81, 0x8b,
- 0xaa, 0x5a, 0xe0, 0xc3, 0x30, 0x3c, 0x30, 0x43, 0xcb, 0xaa, 0x2a, 0x97,
- 0xc8, 0x89, 0x9f, 0x53, 0xce, 0x28, 0x0c, 0x8b, 0x75, 0x7e, 0xe4, 0xd7,
- 0xfd, 0x4f, 0x12, 0x88, 0xb5, 0x48, 0x38, 0x81, 0x44, 0xa8, 0xe2, 0xe8,
- 0x42, 0xd9, 0xdf, 0x83, 0x61, 0xca, 0x98, 0x0d, 0xf0, 0x94, 0x6a, 0x0b,
- 0xad, 0x42, 0x6c, 0xde, 0xe4, 0x6f, 0xf7, 0x65, 0x96, 0x6c, 0xc6, 0xbd,
- 0x84, 0x98, 0x59, 0x2f, 0xf4, 0xe2, 0x4e, 0xad, 0x0a, 0x70, 0x9c, 0xc5,
- 0x5d, 0x37, 0xd5, 0x72, 0xd2, 0xb4, 0xeb, 0xc0, 0xba, 0x1d, 0x66, 0xab,
- 0xcd, 0xf1, 0x1c, 0x97, 0xbe, 0x6d, 0x7f, 0x72, 0x2e, 0xe6, 0x3d, 0x5b,
- 0x1f, 0xd4, 0xb3, 0xad, 0xb4, 0x95, 0xe4, 0x62, 0x6b, 0x90, 0xfa, 0xdf,
- 0xdd, 0xb6, 0xbb, 0x6c, 0x70, 0x6e, 0x33, 0xea, 0xdb, 0xf4, 0x47, 0xc8,
- 0x4e, 0xf0, 0xee, 0x5e, 0x51, 0xc4, 0xa0, 0x78, 0x54, 0x89, 0x90, 0x2f,
- 0x42, 0xad, 0x21, 0x97, 0xe5, 0x86, 0x25, 0x48, 0x34, 0x5d, 0x1a, 0x08,
- 0x54, 0x95, 0xa3, 0xbf, 0x3b, 0x66, 0x22, 0xb5, 0xd2, 0x8f, 0xad, 0x72,
- 0x55, 0x3b, 0x92, 0xc5, 0x0e, 0x4e, 0x15, 0x14, 0x4d, 0x56, 0x3f, 0x14,
- 0xb2, 0x38, 0x99, 0xbf, 0x61, 0xf2, 0x5a, 0x0e, 0x85, 0x7c, 0xa1, 0xab,
- 0x4e, 0x84, 0x77, 0xe3, 0x39, 0x53, 0xa1, 0x04, 0xfb, 0xe8, 0xb5, 0xfa,
- 0x54, 0x21, 0x72, 0x30, 0x37, 0x64, 0xd9, 0xe8, 0x22, 0x99, 0x79, 0xd5,
- 0x4f, 0x98, 0x2e, 0xd0, 0x88, 0x37, 0x67, 0xd9, 0xee, 0xa6, 0x57, 0xa6,
- 0x6b, 0x8b, 0x41, 0xff, 0x25, 0xac, 0x1f, 0x4b, 0x56, 0xc8, 0xde, 0x0b,
- 0x02, 0xb7, 0x6d, 0x47, 0xba, 0x62, 0x9a, 0xf8, 0xa5, 0x9d, 0xd9, 0x7b,
- 0xb1, 0x3f, 0xdc, 0x7b, 0xfe, 0xf9, 0x70, 0x77, 0xb8, 0xb7, 0x4b, 0xf2,
- 0x85, 0xba, 0xe2, 0x75, 0x8e, 0xe7, 0x25, 0xf2, 0xa9, 0xd6, 0x7b, 0xe1,
- 0x37, 0xdf, 0x1d, 0x5f, 0x7e, 0x7f, 0x76, 0xf1, 0x6d, 0x72, 0xf2, 0xee,
- 0xf2, 0xf8, 0xe2, 0xcd, 0xe1, 0xd1, 0x63, 0x09, 0xfb, 0x7d, 0xb7, 0xb5,
- 0x57, 0xb3, 0x3c, 0x73, 0x13, 0x13, 0xfa, 0x06, 0xdd, 0x9c, 0x65, 0xcd,
- 0xcd, 0xee, 0xc1, 0xde, 0x5a, 0x4a, 0xea, 0x88, 0x7b, 0xd0, 0xbd, 0xaf,
- 0x83, 0xda, 0xa3, 0x41, 0xad, 0x6e, 0xc5, 0x52, 0x33, 0x8e, 0x18, 0x5b,
- 0x65, 0x71, 0xb9, 0x10, 0xf3, 0xa8, 0x82, 0x04, 0x46, 0x56, 0x11, 0xec,
- 0x63, 0x26, 0xbf, 0xe5, 0xf4, 0x5a, 0x21, 0x99, 0x11, 0x0c, 0xba, 0xc8,
- 0xdc, 0x0d, 0xae, 0x0f, 0xde, 0x88, 0x3b, 0x85, 0xe9, 0x6c, 0xa7, 0x50,
- 0xf1, 0x54, 0x2a, 0x4b, 0xee, 0x1a, 0xed, 0x16, 0x29, 0x52, 0xca, 0x84,
- 0x83, 0x53, 0x9b, 0x27, 0x62, 0x59, 0x08, 0x36, 0x12, 0x4f, 0x4f, 0x47,
- 0x5f, 0xdb, 0x25, 0xde, 0x7d, 0xf8, 0x6c, 0x87, 0x7b, 0xb5, 0x56, 0x5c,
- 0x33, 0x06, 0xd6, 0x72, 0x8d, 0x1e, 0x49, 0x47, 0x70, 0x1a, 0xbc, 0xde,
- 0xf0, 0xa7, 0xa0, 0x50, 0x11, 0x49, 0x1a, 0xe8, 0x21, 0x5b, 0x0c, 0xc9,
- 0x7c, 0x47, 0x21, 0x77, 0x82, 0xf5, 0x3f, 0x2d, 0x6b, 0x41, 0xad, 0xd7,
- 0x2d, 0x92, 0xc2, 0x84, 0x2b, 0x53, 0xf9, 0xaf, 0xb3, 0xaa, 0x0d, 0x74,
- 0xe6, 0xb4, 0x4a, 0xef, 0x50, 0x5e, 0x25, 0x77, 0x94, 0xa3, 0x1b, 0xed,
- 0xea, 0x5a, 0xa4, 0x38, 0xb9, 0x39, 0x4f, 0xce, 0x8f, 0xdf, 0x0e, 0xb4,
- 0xc6, 0xb1, 0xf9, 0x3b, 0x3b, 0xa3, 0x94, 0x5f, 0x92, 0x73, 0x7b, 0x16,
- 0x59, 0xa1, 0x58, 0x1a, 0xc8, 0x44, 0x01, 0xff, 0xf8, 0x03, 0xa0, 0x43,
- 0x63, 0x19, 0x28, 0x05, 0x32, 0xaa, 0x98, 0x4b, 0xce, 0x2d, 0xec, 0xd2,
- 0x72, 0xd2, 0x7a, 0x0a, 0x60, 0x39, 0xd9, 0xb2, 0x20, 0x5d, 0xfa, 0x1e,
- 0x90, 0xa8, 0x40, 0x0d, 0x58, 0x98, 0x40, 0xa9, 0x99, 0xd7, 0xe7, 0xdf,
- 0x1e, 0x8d, 0xfe, 0xb0, 0xb7, 0x2f, 0xdd, 0xd9, 0x56, 0xab, 0x80, 0x64,
- 0x55, 0x37, 0x29, 0x1f, 0xe2, 0xda, 0xef, 0xa3, 0xa6, 0x58, 0xe3, 0x80,
- 0x63, 0x31, 0xb6, 0x6c, 0x62, 0xd0, 0x76, 0x2b, 0x33, 0x08, 0xc8, 0xaf,
- 0x7b, 0xab, 0x62, 0xda, 0x9a, 0xbd, 0x14, 0x12, 0x41, 0x79, 0x27, 0x29,
- 0xb0, 0xd4, 0x58, 0xa8, 0x5f, 0x5a, 0xe8, 0x8f, 0xb8, 0x65, 0x69, 0x0d,
- 0x39, 0xe4, 0x0e, 0xce, 0xd2, 0x5d, 0x73, 0x9a, 0x6f, 0xf7, 0x5b, 0xe2,
- 0x89, 0x95, 0x9b, 0x5d, 0x09, 0x81, 0xdc, 0x67, 0x70, 0x00, 0x04, 0xbd,
- 0x3e, 0xd5, 0x12, 0x6e, 0x85, 0xab, 0x83, 0x42, 0x4f, 0x9f, 0x99, 0x85,
- 0x32, 0x27, 0x8b, 0x79, 0x1b, 0x48, 0x28, 0x94, 0x33, 0x32, 0x5d, 0xec,
- 0x23, 0xaf, 0x2b, 0xaa, 0x1c, 0xb3, 0x60, 0x1c, 0xe9, 0xbb, 0x61, 0xf2,
- 0x4d, 0x56, 0x50, 0xe2, 0x3c, 0x21, 0xee, 0x34, 0xf7, 0x0a, 0xb8, 0x40,
- 0xaa, 0x21, 0x89, 0x9a, 0x7a, 0xa7, 0x59, 0x2a, 0x9c, 0x9c, 0x46, 0xd6,
- 0xd5, 0x6c, 0xe1, 0x6a, 0x3d, 0xa9, 0x94, 0xd0, 0x79, 0x42, 0x20, 0x6a,
- 0xc9, 0x2e, 0x98, 0x24, 0x9a, 0x1a, 0xd8, 0x6a, 0x13, 0x6b, 0xa2, 0x24,
- 0x02, 0x9a, 0x93, 0x63, 0x8e, 0x58, 0x93, 0x78, 0x95, 0x6f, 0x40, 0xa7,
- 0x4d, 0xde, 0x42, 0xb6, 0xb8, 0x9c, 0x50, 0x99, 0x56, 0x37, 0xe4, 0xfa,
- 0xa8, 0xcd, 0x75, 0x93, 0x16, 0x93, 0xfb, 0xe1, 0xd4, 0xe8, 0xb2, 0xe4,
- 0x3c, 0x1b, 0x2e, 0x3f, 0xee, 0x78, 0xc7, 0x94, 0x44, 0xfe, 0x0d, 0x73,
- 0x04, 0xb4, 0x1d, 0xdf, 0x5a, 0xab, 0x38, 0xa4, 0x0e, 0x4b, 0x5b, 0x67,
- 0x82, 0xb6, 0x84, 0x66, 0xfb, 0xf3, 0xf1, 0x5c, 0x49, 0xb2, 0x75, 0x9c,
- 0x58, 0x86, 0x63, 0x6a, 0x61, 0xb8, 0xc8, 0xe6, 0x07, 0x36, 0x1b, 0x59,
- 0xe5, 0x83, 0x54, 0xd5, 0xb0, 0x86, 0x85, 0xe7, 0xa4, 0x2d, 0xb2, 0xeb,
- 0x99, 0x28, 0x14, 0xbe, 0xe9, 0x62, 0x9b, 0x88, 0xa4, 0x80, 0xb0, 0xc1,
- 0x23, 0xd5, 0x8e, 0xa0, 0xb1, 0x9b, 0x7d, 0xd8, 0x08, 0xa4, 0x96, 0x1f,
- 0xae, 0x48, 0xa1, 0x77, 0x8d, 0x08, 0x73, 0x08, 0xc8, 0x96, 0x49, 0x19,
- 0x16, 0x17, 0x8f, 0x22, 0x91, 0x24, 0xfc, 0x44, 0x44, 0xb0, 0xd8, 0x21,
- 0xa0, 0x71, 0x17, 0x54, 0x34, 0x82, 0x9f, 0x5a, 0x0f, 0x98, 0xcf, 0x8a,
- 0xf9, 0xf5, 0xed, 0x13, 0xf2, 0x78, 0x5f, 0x9e, 0x8e, 0x34, 0x2a, 0x52,
- 0x64, 0x77, 0xde, 0xd6, 0xe2, 0xd2, 0x03, 0xb2, 0xff, 0xc8, 0x01, 0xc4,
- 0x94, 0xca, 0x60, 0x3b, 0x40, 0x4f, 0x58, 0x2a, 0xb8, 0x30, 0x99, 0x4b,
- 0x7e, 0xd0, 0x49, 0x10, 0x18, 0x31, 0x75, 0x45, 0x4b, 0x97, 0xb1, 0x32,
- 0x64, 0x99, 0x5e, 0x88, 0xbb, 0xcf, 0x28, 0x4b, 0x4f, 0xfa, 0xc9, 0x60,
- 0x1f, 0xfc, 0x39, 0x7b, 0xed, 0x49, 0x4c, 0x1b, 0xa6, 0x09, 0xa4, 0x36,
- 0x4c, 0x4b, 0xda, 0x8a, 0x88, 0x83, 0x2d, 0xd9, 0xd2, 0xb7, 0xe6, 0x7d,
- 0xfa, 0x63, 0x5f, 0x06, 0x74, 0xbb, 0x07, 0xc4, 0x36, 0xf3, 0x56, 0xce,
- 0xee, 0x43, 0x95, 0x61, 0x7f, 0xed, 0xaa, 0x22, 0x37, 0xe2, 0x2e, 0xb7,
- 0x04, 0xd2, 0x5c, 0x34, 0x01, 0xae, 0x50, 0xa1, 0x04, 0xd5, 0x0e, 0x98,
- 0x29, 0x14, 0x27, 0x77, 0x91, 0xdc, 0xee, 0x6b, 0xac, 0x99, 0x7e, 0xa3,
- 0xf3, 0xc6, 0xce, 0x7a, 0x27, 0x44, 0x82, 0xb4, 0x45, 0x42, 0xb9, 0x79,
- 0xbb, 0x96, 0xb2, 0x9e, 0xcc, 0x9e, 0x35, 0x52, 0xa4, 0x25, 0x65, 0xca,
- 0x42, 0xdc, 0x0a, 0x9c, 0xf2, 0xce, 0x7c, 0xf4, 0x64, 0xc0, 0x7b, 0x30,
- 0x27, 0x20, 0xbf, 0x3d, 0x44, 0xe4, 0x49, 0x61, 0x13, 0x25, 0xc4, 0x95,
- 0x0f, 0x8a, 0x3e, 0x2c, 0xff, 0x4d, 0xce, 0x8e, 0x09, 0x60, 0x4d, 0x71,
- 0x9d, 0x9b, 0x93, 0xbf, 0x99, 0x98, 0xc3, 0xb4, 0x24, 0x89, 0xdf, 0xd8,
- 0x3a, 0x6a, 0x23, 0xa6, 0xf6, 0xdc, 0xf4, 0xc5, 0xdc, 0xe0, 0x0b, 0x1a,
- 0x4a, 0xbd, 0xe9, 0xc6, 0x2e, 0x14, 0xe7, 0xed, 0x81, 0x48, 0x9c, 0x43,
- 0x2b, 0x87, 0x9d, 0x57, 0x5a, 0x1b, 0x7d, 0xf3, 0xf8, 0x13, 0xe9, 0x38,
- 0x9b, 0xf2, 0x25, 0xfe, 0x35, 0xe7, 0xf4, 0x63, 0x8e, 0xce, 0x4f, 0xde,
- 0x71, 0xb9, 0x6f, 0x7b, 0x16, 0x32, 0xa2, 0x5e, 0xdc, 0xe0, 0xba, 0xf2,
- 0xe8, 0x4f, 0xaa, 0x1c, 0xf0, 0xec, 0x38, 0xa2, 0x3d, 0x43, 0x7b, 0x3c,
- 0x97, 0x6f, 0x5d, 0x2c, 0xf9, 0xeb, 0x9b, 0x74, 0xcf, 0xd5, 0xf5, 0x6c,
- 0xb3, 0x53, 0xc6, 0xd6, 0xae, 0x49, 0xe7, 0x42, 0xb1, 0x1e, 0xa9, 0xc9,
- 0xd4, 0x29, 0xf8, 0x49, 0x22, 0xad, 0xb4, 0xe4, 0x5c, 0xbf, 0x93, 0xe9,
- 0xe8, 0xbb, 0xc2, 0xff, 0x90, 0x0c, 0x77, 0xcc, 0x07, 0xeb, 0x1d, 0x7d,
- 0x71, 0xf1, 0x71, 0x52, 0x9b, 0x1b, 0x8e, 0xd2, 0x7a, 0x7f, 0x84, 0x41,
- 0x8e, 0xe5, 0x30, 0x3d, 0x9e, 0xfe, 0x9c, 0x0c, 0x26, 0x33, 0x8c, 0x2f,
- 0x41, 0xbd, 0xec, 0x1f, 0xcd, 0xca, 0xd3, 0x13, 0x3f, 0xdb, 0x35, 0x7c,
- 0x93, 0xd3, 0x79, 0xfb, 0xd4, 0xd7, 0xa1, 0x9f, 0xb1, 0xc1, 0xc0, 0xfc,
- 0xb6, 0xc9, 0xe1, 0xf4, 0x96, 0x92, 0xee, 0xa6, 0xf2, 0x4f, 0x1a, 0xcf,
- 0x71, 0x81, 0x52, 0xa3, 0x18, 0x69, 0x3a, 0xe6, 0xca, 0xe2, 0xdf, 0xe5,
- 0xc6, 0xe8, 0x38, 0xea, 0xe8, 0x17, 0x94, 0xff, 0x47, 0x1d, 0xc4, 0x5b,
- 0xde, 0x2f, 0x35, 0x99, 0xa3, 0x2f, 0x39, 0x0b, 0x0e, 0x5a, 0x4a, 0xd2,
- 0x99, 0x96, 0x6e, 0x98, 0x7c, 0x45, 0x31, 0xce, 0x2a, 0xf3, 0xd8, 0x5f,
- 0xe5, 0xe2, 0xe3, 0x92, 0x7c, 0xb4, 0x18, 0x29, 0xf3, 0x4f, 0x0c, 0xed,
- 0x48, 0x82, 0x1c, 0x18, 0x3b, 0x26, 0xfb, 0x9b, 0xf6, 0xe0, 0xd0, 0x2f,
- 0x4d, 0x69, 0x37, 0x43, 0xd1, 0x7c, 0x89, 0x24, 0x18, 0x8a, 0xc7, 0x4b,
- 0xc9, 0x3d, 0xe4, 0x0b, 0x73, 0x9a, 0x69, 0x62, 0x7f, 0xe9, 0xb3, 0xa9,
- 0xa8, 0xe7, 0x18, 0x4d, 0xa9, 0x46, 0x60, 0xb7, 0x04, 0xee, 0x70, 0xd7,
- 0xeb, 0xa3, 0x1b, 0x23, 0x9a, 0x33, 0xdb, 0xd5, 0x11, 0xbb, 0xf4, 0xb4,
- 0x8b, 0x23, 0xba, 0xa3, 0x74, 0x11, 0xec, 0x2f, 0x35, 0x3b, 0x12, 0x5a,
- 0xe8, 0x0e, 0xcb, 0x2e, 0xbb, 0x77, 0x79, 0x76, 0xdb, 0x43, 0xa0, 0xa4,
- 0xc6, 0xd1, 0xfb, 0xb7, 0x54, 0xda, 0x04, 0x15, 0xa8, 0x2f, 0x2f, 0x0e,
- 0xdf, 0x8d, 0xde, 0xb0, 0x6b, 0xfc, 0xb2, 0xf4, 0x6a, 0x5b, 0x4b, 0x5c,
- 0x41, 0xe3, 0xc7, 0x96, 0x26, 0xee, 0x8e, 0xeb, 0x6d, 0x28, 0x9e, 0x5e,
- 0x0a, 0x5f, 0xf7, 0xbb, 0x7c, 0xfb, 0x5c, 0x35, 0x9b, 0x66, 0x83, 0xba,
- 0xb6, 0x35, 0xda, 0xb6, 0x8a, 0x50, 0xed, 0x17, 0x65, 0x73, 0x55, 0xe7,
- 0x95, 0x19, 0x5a, 0x1e, 0xa2, 0x69, 0x39, 0xd2, 0xce, 0xe8, 0x4f, 0xf9,
- 0xee, 0x5d, 0x49, 0x46, 0x7a, 0x64, 0x4c, 0xc5, 0x81, 0x54, 0xaa, 0x71,
- 0x7c, 0x6c, 0xce, 0x9d, 0xca, 0x77, 0xaf, 0x50, 0xf9, 0xd9, 0xc6, 0xfd,
- 0xbc, 0x4f, 0x6d, 0x7a, 0xeb, 0xdf, 0xf6, 0xb6, 0xe3, 0xcd, 0x5f, 0xfe,
- 0xd2, 0xe6, 0xe3, 0x7d, 0x57, 0xdb, 0xcc, 0xa5, 0x14, 0x6d, 0xfd, 0xdb,
- 0xfe, 0xf6, 0xda, 0x11, 0xf9, 0x59, 0x91, 0xee, 0x9b, 0xe6, 0x0d, 0xea,
- 0x6c, 0xf2, 0x8a, 0x8f, 0x99, 0xd5, 0x99, 0x2c, 0x42, 0xc7, 0xe3, 0x1b,
- 0x6e, 0x11, 0x76, 0x10, 0x6c, 0xdb, 0x6a, 0xea, 0x2e, 0xf0, 0x26, 0xd9,
- 0x25, 0x27, 0xff, 0xf3, 0xd8, 0xa7, 0x91, 0x2c, 0x36, 0x1b, 0xff, 0x8a,
- 0x22, 0x76, 0x80, 0xba, 0x1c, 0xe2, 0xdb, 0xfb, 0x6b, 0xbe, 0xed, 0x46,
- 0xe7, 0xb9, 0x25, 0x28, 0x8a, 0x4d, 0x30, 0x38, 0x65, 0xc3, 0x96, 0xef,
- 0xd8, 0x6f, 0xaf, 0xfb, 0xde, 0xe5, 0xc9, 0xdb, 0x63, 0x62, 0xcd, 0x7e,
- 0x7d, 0x42, 0xe4, 0x73, 0x23, 0xa1, 0x7f, 0x54, 0x0f, 0x84, 0x65, 0xe4,
- 0xf5, 0xab, 0xa5, 0x70, 0x78, 0xd7, 0xa2, 0xcd, 0xac, 0xe4, 0xb0, 0x2b,
- 0x41, 0x9f, 0x16, 0x0c, 0x74, 0xad, 0x99, 0x96, 0x27, 0x57, 0x83, 0xb7,
- 0xe5, 0x14, 0x56, 0xf2, 0x60, 0x04, 0xa8, 0xa0, 0x79, 0xcb, 0xfc, 0xf0,
- 0x7d, 0x31, 0x6f, 0xfd, 0x78, 0x18, 0xc9, 0xd4, 0xdd, 0x58, 0x55, 0x94,
- 0xe7, 0xef, 0x3b, 0x83, 0x01, 0x75, 0x66, 0xc0, 0xb0, 0x2e, 0x09, 0xee,
- 0xb4, 0xf8, 0x39, 0x54, 0xb4, 0x98, 0x09, 0xca, 0x67, 0xf7, 0x0c, 0x44,
- 0x48, 0x1d, 0x7c, 0xcc, 0x65, 0x6f, 0x5e, 0x53, 0x06, 0x99, 0x73, 0xf1,
- 0xb1, 0x13, 0x6f, 0xc3, 0x27, 0x2f, 0x85, 0x21, 0x95, 0xdd, 0x39, 0xfc,
- 0x93, 0x94, 0x5f, 0x2e, 0x17, 0xf7, 0x18, 0xe5, 0x5d, 0x0b, 0x5a, 0x11,
- 0x8d, 0xaf, 0xfe, 0x9d, 0xdf, 0x69, 0x95, 0xa1, 0x12, 0x8e, 0x69, 0x6f,
- 0x07, 0xca, 0x4f, 0xa4, 0x6a, 0xd3, 0x59, 0xe5, 0x5d, 0x57, 0xd2, 0x6d,
- 0xad, 0x6e, 0xe7, 0x11, 0x9b, 0x7a, 0x3c, 0xac, 0xed, 0x7e, 0xfa, 0x24,
- 0xb0, 0x25, 0xa5, 0xbe, 0xbe, 0x2e, 0x6d, 0x70, 0xcc, 0x88, 0x9d, 0x45,
- 0xbb, 0xc0, 0x71, 0x96, 0x68, 0x92, 0x37, 0xe7, 0xf0, 0x6f, 0x0e, 0x36,
- 0x51, 0x97, 0x21, 0x2f, 0x22, 0x83, 0x19, 0xfc, 0xf2, 0xd1, 0x04, 0xa1,
- 0xd7, 0xa4, 0x77, 0x45, 0x44, 0x18, 0x14, 0xc7, 0xea, 0x71, 0x07, 0x98,
- 0x27, 0x86, 0x37, 0x97, 0xb9, 0x20, 0x48, 0xae, 0xa9, 0x21, 0xc9, 0x46,
- 0xb5, 0x45, 0xc6, 0x5a, 0x27, 0x39, 0x7b, 0x25, 0x49, 0x90, 0x2e, 0x17,
- 0x53, 0x80, 0x32, 0x18, 0x8e, 0xfa, 0x1f, 0x44, 0x8a, 0x5d, 0xdd, 0x27,
- 0x7b, 0xfb, 0xfd, 0x64, 0x7f, 0x77, 0x6f, 0x3f, 0x32, 0x86, 0xde, 0x7f,
- 0x10, 0x28, 0x6a, 0x1f, 0xbf, 0xee, 0x3d, 0x76, 0x14, 0x2e, 0x9f, 0x01,
- 0x37, 0x89, 0x64, 0xfe, 0x1a, 0xe1, 0x43, 0xf1, 0x59, 0x10, 0x31, 0xa3,
- 0xea, 0x31, 0xe8, 0xec, 0x70, 0x6d, 0xb1, 0x93, 0x50, 0x6b, 0x6c, 0xda,
- 0xd2, 0x61, 0x53, 0x54, 0xd2, 0xe1, 0xc2, 0xb3, 0x40, 0xbe, 0x58, 0x4f,
- 0x69, 0x5a, 0xa1, 0x14, 0x68, 0x7b, 0x8d, 0xf2, 0x46, 0x97, 0x85, 0xa0,
- 0x35, 0xb4, 0x36, 0x66, 0xbf, 0xbf, 0x3e, 0x39, 0xba, 0x54, 0xbe, 0xc3,
- 0x2b, 0x52, 0x9e, 0xaa, 0xfb, 0xc7, 0x15, 0x63, 0x5c, 0xfb, 0xcc, 0xf4,
- 0xe0, 0x26, 0x33, 0x6a, 0x74, 0x31, 0x5e, 0x5e, 0x1f, 0xfc, 0x35, 0xad,
- 0xae, 0xcb, 0xe2, 0xa1, 0xe7, 0xa7, 0x48, 0x28, 0x3b, 0x30, 0x12, 0x6a,
- 0xef, 0xc5, 0xde, 0x13, 0xe4, 0x7f, 0xcf, 0x72, 0x14, 0x04, 0x22, 0x01,
- 0xb1, 0x39, 0xdf, 0x64, 0x82, 0x0d, 0xa4, 0x49, 0x58, 0x56, 0x8d, 0x62,
- 0xba, 0xc9, 0xd7, 0x7d, 0xea, 0x3f, 0x3b, 0x95, 0x67, 0x39, 0xf5, 0x7c,
- 0x53, 0x72, 0x15, 0x36, 0x29, 0x4d, 0x73, 0xb9, 0xd8, 0x6c, 0x53, 0xc4,
- 0x3f, 0x30, 0x56, 0xfa, 0x84, 0xad, 0x3d, 0x79, 0x64, 0x89, 0xef, 0x91,
- 0x41, 0x54, 0x65, 0xe9, 0x47, 0x57, 0x06, 0xd9, 0xb1, 0x6f, 0x68, 0xc8,
- 0xe3, 0xe2, 0xcd, 0x11, 0x33, 0x98, 0x6a, 0xbe, 0x14, 0xa6, 0x3a, 0xb1,
- 0xae, 0xa9, 0x6d, 0xea, 0xe5, 0x03, 0xdf, 0xa7, 0xdc, 0x86, 0x83, 0xe9,
- 0xf8, 0x11, 0x0f, 0x99, 0x73, 0xc7, 0x64, 0x71, 0x87, 0xed, 0xd2, 0x3b,
- 0x64, 0xa8, 0xa1, 0x7e, 0x88, 0xd6, 0x3b, 0xde, 0xe2, 0x92, 0xb2, 0x1c,
- 0x71, 0xa0, 0xae, 0x69, 0x25, 0x69, 0xf5, 0xee, 0x98, 0x7e, 0x53, 0x95,
- 0xd7, 0xd7, 0x87, 0xe7, 0x9e, 0xa1, 0x0b, 0x43, 0xd2, 0x39, 0xf5, 0xe8,
- 0x39, 0x32, 0x74, 0x50, 0x52, 0x5d, 0xaa, 0x31, 0xf5, 0x9d, 0x89, 0xd2,
- 0x40, 0x4e, 0x92, 0x6e, 0x04, 0x80, 0x7c, 0x29, 0xf7, 0x09, 0xfc, 0x4f,
- 0xa8, 0x66, 0x30, 0x9b, 0xa6, 0x08, 0x84, 0xca, 0x2d, 0x44, 0x19, 0x10,
- 0x67, 0x85, 0x66, 0x31, 0xf7, 0x3b, 0xa5, 0x1b, 0xcc, 0x8f, 0xf1, 0x1d,
- 0x5c, 0xd1, 0xe7, 0x46, 0x09, 0x07, 0x8d, 0xcb, 0xe8, 0xf5, 0xb7, 0xd4,
- 0x63, 0x09, 0xea, 0x40, 0x6b, 0x53, 0x5f, 0xb6, 0x8d, 0x44, 0xa9, 0xd5,
- 0xa8, 0xce, 0x2b, 0xf5, 0x2d, 0x52, 0x73, 0xb7, 0x4f, 0x86, 0xfc, 0xe7,
- 0xbe, 0x2d, 0x3d, 0x8c, 0xc7, 0x80, 0xf3, 0xbc, 0xd2, 0xc2, 0xc6, 0xf3,
- 0x8c, 0xaa, 0xf9, 0xe6, 0xf5, 0xdc, 0xc1, 0x52, 0xae, 0xe4, 0x75, 0x57,
- 0x52, 0x4f, 0x94, 0x48, 0x0a, 0x2d, 0xa0, 0x1f, 0xe8, 0x6d, 0x2e, 0xb8,
- 0x2e, 0xb3, 0xcb, 0x3e, 0x25, 0x92, 0x8e, 0x22, 0x79, 0x37, 0x52, 0x39,
- 0x05, 0x8f, 0x51, 0x7e, 0xf5, 0xbd, 0x2e, 0x05, 0xdf, 0x34, 0x66, 0x19,
- 0xd2, 0xfa, 0xa3, 0xb9, 0x14, 0x18, 0x8a, 0x60, 0xe6, 0x31, 0x97, 0x60,
- 0x3e, 0xb9, 0xaf, 0x72, 0x86, 0x04, 0x91, 0x23, 0x0d, 0x8c, 0x4e, 0xad,
- 0xad, 0xc7, 0x97, 0x29, 0xd9, 0xce, 0xb3, 0x3a, 0x63, 0xfe, 0x45, 0x10,
- 0x02, 0x51, 0xec, 0x8f, 0xb6, 0x1e, 0x6c, 0x26, 0xc5, 0xd4, 0x42, 0x9c,
- 0xd1, 0x2e, 0xdd, 0xdf, 0x7f, 0xf6, 0xac, 0x9f, 0xf4, 0xc8, 0xef, 0x88,
- 0x3e, 0xd1, 0x86, 0x7e, 0x03, 0xc1, 0xd3, 0x8b, 0x56, 0xd8, 0xdd, 0xa9,
- 0xae, 0x26, 0xf4, 0x7f, 0xf4, 0x9e, 0x16, 0x96, 0xbc, 0x94, 0x44, 0x1c,
- 0xea, 0x26, 0x82, 0xac, 0x96, 0x2e, 0x87, 0x77, 0x1a, 0xfd, 0xee, 0xc4,
- 0xba, 0x96, 0x28, 0x8e, 0xb4, 0xc8, 0xca, 0x85, 0x06, 0x8c, 0xe7, 0x52,
- 0x32, 0x04, 0xdf, 0xf7, 0xa2, 0x6c, 0x08, 0xf1, 0x33, 0x42, 0x4e, 0x78,
- 0x11, 0xea, 0xe5, 0x78, 0x20, 0x09, 0xc2, 0x6c, 0x68, 0xe6, 0xe6, 0x30,
- 0xcf, 0x69, 0x11, 0xc4, 0x83, 0x1f, 0x08, 0xe9, 0xaf, 0x92, 0x9e, 0x6c,
- 0x37, 0xfa, 0x63, 0x88, 0x78, 0x6f, 0x36, 0xa1, 0x61, 0x94, 0xaf, 0xe4,
- 0x1f, 0xff, 0xfe, 0xef, 0xa6, 0xd9, 0x7f, 0xa7, 0x56, 0x5e, 0xfd, 0x5b,
- 0xdd, 0xdc, 0x78, 0xcf, 0xf4, 0xe4, 0x0c, 0x9c, 0xb8, 0x68, 0x37, 0x10,
- 0x6c, 0x60, 0x9e, 0x45, 0x1e, 0xdb, 0xdb, 0x53, 0x11, 0xd2, 0x7d, 0x6f,
- 0x7c, 0x39, 0x32, 0x0c, 0xd9, 0x6f, 0x6a, 0x01, 0x24, 0x5f, 0x51, 0x24,
- 0x3a, 0xa3, 0xcc, 0x74, 0xb3, 0x08, 0x20, 0x16, 0xdc, 0x76, 0x90, 0x12,
- 0x96, 0xef, 0xf0, 0x8d, 0x72, 0xc9, 0xb9, 0x4e, 0x09, 0xad, 0x3b, 0xbd,
- 0x29, 0xf8, 0x14, 0x63, 0x9d, 0xcc, 0xaf, 0xd2, 0x59, 0x79, 0x6d, 0x47,
- 0x1c, 0x2b, 0x5a, 0xf3, 0x8b, 0xc6, 0xde, 0xf3, 0x1b, 0xd2, 0x37, 0xfd,
- 0xf8, 0xfa, 0x23, 0x5b, 0x21, 0x9c, 0x80, 0x3d, 0x9a, 0x80, 0xbf, 0x86,
- 0x45, 0xca, 0x84, 0x91, 0xd8, 0x58, 0x2a, 0x2a, 0x48, 0x76, 0xf4, 0xa0,
- 0xdb, 0x93, 0x4f, 0xd0, 0xdd, 0x09, 0x1d, 0x81, 0x4e, 0xd5, 0x1c, 0x27,
- 0x2b, 0xac, 0x72, 0x23, 0x05, 0x51, 0x44, 0x37, 0xc9, 0x8c, 0xbc, 0xca,
- 0xcd, 0x59, 0xc0, 0x05, 0x48, 0xdf, 0xa1, 0x39, 0x43, 0x68, 0x32, 0x63,
- 0x42, 0x9a, 0x31, 0xd7, 0x1c, 0x1b, 0x0c, 0x8a, 0x66, 0x36, 0x67, 0xfe,
- 0xe6, 0x29, 0xea, 0x8f, 0x69, 0x86, 0x46, 0x5e, 0x84, 0x24, 0x83, 0xed,
- 0x79, 0xe6, 0x57, 0xff, 0xb1, 0x59, 0xf2, 0x85, 0x1e, 0x97, 0xf5, 0xa4,
- 0x76, 0x76, 0x1c, 0x71, 0xa3, 0x23, 0x47, 0x23, 0x5f, 0xe8, 0xa0, 0x90,
- 0x92, 0x68, 0x80, 0xf6, 0x5b, 0xd1, 0x24, 0xec, 0x63, 0x3e, 0x64, 0x55,
- 0x33, 0x8d, 0x88, 0x67, 0x9a, 0x9c, 0x6f, 0x46, 0xbe, 0x67, 0x00, 0x25,
- 0xd7, 0xc9, 0xd6, 0x68, 0x74, 0x7e, 0xb2, 0xa3, 0x15, 0xd5, 0x36, 0x36,
- 0x8e, 0xdf, 0x7d, 0x77, 0x72, 0x71, 0xf6, 0xee, 0xed, 0xf1, 0xbb, 0xcb,
- 0xe4, 0xbb, 0xc3, 0x8b, 0x93, 0xc3, 0xaf, 0x4e, 0x85, 0x7c, 0x81, 0x86,
- 0x49, 0x98, 0x33, 0x36, 0x05, 0x3b, 0xa4, 0xc4, 0x5e, 0x5e, 0x5c, 0xb4,
- 0x94, 0x4d, 0xa7, 0x4a, 0xf7, 0x07, 0x61, 0xd4, 0x87, 0x61, 0xfc, 0x01,
- 0x55, 0xb9, 0xfa, 0x64, 0x0b, 0x7d, 0xd0, 0x02, 0x5d, 0x64, 0xcb, 0xdf,
- 0x7b, 0xe9, 0xfc, 0x04, 0x87, 0x23, 0x71, 0xa6, 0xc2, 0xdc, 0x95, 0xa6,
- 0xb4, 0xb5, 0x5e, 0xbe, 0x66, 0x46, 0x08, 0x2d, 0x7c, 0xa3, 0xaf, 0x42,
- 0x7e, 0xb0, 0xae, 0xe3, 0xfa, 0x70, 0x78, 0x7a, 0xea, 0x3e, 0xb5, 0xbe,
- 0x26, 0x92, 0xb0, 0x81, 0x71, 0x2e, 0x21, 0x1a, 0xa5, 0x38, 0xf5, 0x75,
- 0xe9, 0xca, 0x03, 0x14, 0xf7, 0x7e, 0x25, 0x00, 0xfa, 0x98, 0xd9, 0x2e,
- 0x5b, 0x4c, 0xe3, 0x42, 0xa0, 0x85, 0x26, 0xab, 0xf2, 0xfa, 0x63, 0x3f,
- 0xd9, 0xfc, 0xb7, 0x4d, 0xa9, 0x50, 0x0f, 0xee, 0x6a, 0xae, 0xb8, 0xb4,
- 0xed, 0x3a, 0xf5, 0xee, 0xcc, 0xf5, 0x49, 0xe2, 0xf0, 0xb6, 0x03, 0xf6,
- 0x45, 0x87, 0xa2, 0xa8, 0x55, 0xbd, 0x06, 0x7c, 0xd9, 0x3d, 0x2e, 0x65,
- 0x49, 0x2c, 0x3b, 0x85, 0xc8, 0x47, 0x8a, 0xb3, 0x46, 0xdf, 0x85, 0x13,
- 0x21, 0x9d, 0x78, 0x14, 0xe5, 0x18, 0x6b, 0x41, 0x9e, 0x37, 0x5b, 0x2a,
- 0x4e, 0x9d, 0xd3, 0x66, 0xaa, 0xa7, 0x42, 0xb8, 0x98, 0x6a, 0xcb, 0x92,
- 0xca, 0x8c, 0x54, 0x71, 0x1b, 0x81, 0xf2, 0x9c, 0x8c, 0xa9, 0x00, 0xda,
- 0x87, 0x66, 0xa6, 0x71, 0xf2, 0xd9, 0x89, 0xd4, 0xf2, 0xee, 0x22, 0x26,
- 0xd4, 0xc9, 0xfd, 0x94, 0x58, 0x47, 0xd9, 0xfa, 0x99, 0xac, 0xab, 0x04,
- 0xa1, 0x98, 0xb4, 0x9b, 0x67, 0x1f, 0x2c, 0x18, 0xec, 0xce, 0xd4, 0x99,
- 0x04, 0x60, 0xd2, 0x7f, 0xbd, 0x87, 0xdc, 0x24, 0x8e, 0xb5, 0x58, 0x52,
- 0x44, 0xa2, 0x1c, 0xc2, 0x1c, 0x3b, 0x5c, 0x7a, 0xf6, 0x89, 0xb9, 0x84,
- 0xec, 0x2e, 0x73, 0x3b, 0x81, 0xab, 0xe9, 0x09, 0x0c, 0xbd, 0xdb, 0x63,
- 0xad, 0x94, 0x95, 0x6a, 0x65, 0x26, 0xc4, 0xcd, 0x58, 0xe5, 0x82, 0xd2,
- 0xd4, 0x1d, 0x0e, 0x9c, 0x86, 0x0c, 0x78, 0x6e, 0x75, 0xba, 0xd3, 0x70,
- 0x4f, 0xf1, 0x04, 0xcb, 0x5a, 0x54, 0x28, 0xdc, 0x21, 0x9f, 0x76, 0xb4,
- 0xd6, 0x15, 0x40, 0x06, 0x94, 0x10, 0x54, 0x19, 0x29, 0x5a, 0xaf, 0x2e,
- 0x29, 0x35, 0x44, 0x6c, 0xfa, 0xe2, 0x08, 0x35, 0x19, 0x0a, 0xaa, 0xca,
- 0xea, 0x6a, 0xe9, 0x20, 0x79, 0xa0, 0xc8, 0x9a, 0x8a, 0x32, 0x72, 0x0b,
- 0xb1, 0x42, 0x00, 0xc8, 0x87, 0x91, 0x9e, 0x5e, 0x97, 0x6a, 0x80, 0xa7,
- 0x16, 0x35, 0x63, 0x2b, 0x0e, 0x7a, 0x46, 0xbd, 0x65, 0x0e, 0xb4, 0x82,
- 0x0b, 0xf8, 0x1a, 0x8d, 0x10, 0x12, 0xbe, 0x94, 0x0e, 0x99, 0x56, 0x90,
- 0xaf, 0x3d, 0x6e, 0x06, 0x97, 0xbe, 0x44, 0x92, 0x9c, 0xb3, 0x74, 0x94,
- 0xca, 0x0f, 0xf4, 0x89, 0xca, 0xe5, 0x00, 0xa4, 0x33, 0xba, 0x45, 0x0f,
- 0xa2, 0x49, 0x01, 0xad, 0xa3, 0x49, 0x0d, 0x5e, 0x19, 0x79, 0x35, 0xa3,
- 0x0c, 0x52, 0xd5, 0x3b, 0xd2, 0x64, 0x9c, 0x5f, 0x33, 0x27, 0x08, 0x11,
- 0x50, 0xd0, 0xb9, 0x04, 0xc5, 0x63, 0x39, 0xcf, 0xe8, 0x70, 0x80, 0xc0,
- 0x11, 0xc6, 0xfb, 0x4d, 0x39, 0xf3, 0x59, 0x06, 0x75, 0x24, 0xb2, 0xfa,
- 0x36, 0xf6, 0x81, 0xd8, 0xe7, 0x92, 0xe6, 0x51, 0xe1, 0xa8, 0x52, 0x9e,
- 0x40, 0xc0, 0xb9, 0x14, 0x54, 0x03, 0x57, 0x6a, 0x81, 0x54, 0x40, 0xe5,
- 0x52, 0xc0, 0x3c, 0x68, 0xe2, 0x02, 0x6d, 0x5c, 0x38, 0xd2, 0xa9, 0xce,
- 0xeb, 0x96, 0xad, 0x2f, 0x40, 0xad, 0x4c, 0x98, 0xa1, 0x99, 0xc4, 0x0c,
- 0x43, 0x4a, 0xda, 0x05, 0xc1, 0x64, 0xb1, 0x84, 0x3b, 0xcf, 0xec, 0x09,
- 0xea, 0xb4, 0x99, 0xa9, 0x2d, 0x4f, 0xcd, 0x28, 0xcc, 0x16, 0xe1, 0xc7,
- 0xd8, 0x83, 0x24, 0xff, 0x1a, 0xd8, 0x5a, 0x86, 0x02, 0x3c, 0xd9, 0x76,
- 0xc0, 0x23, 0x36, 0x03, 0x48, 0x3e, 0x4c, 0xa4, 0x9a, 0x2c, 0x20, 0x3a,
- 0x54, 0x0a, 0x17, 0x84, 0x70, 0xad, 0xe0, 0x43, 0xa2, 0x09, 0x77, 0xb3,
- 0x99, 0x57, 0x60, 0x80, 0xfd, 0x91, 0x69, 0x60, 0x7c, 0x90, 0x9c, 0x18,
- 0xb2, 0xcc, 0x65, 0xe8, 0x1f, 0x93, 0x91, 0x7b, 0x03, 0x91, 0xa4, 0x12,
- 0x32, 0xcf, 0x3a, 0x31, 0x0d, 0xef, 0x0a, 0x51, 0x78, 0x8c, 0xaf, 0x86,
- 0x4a, 0x3d, 0x9d, 0x3c, 0x9d, 0xb3, 0xf1, 0xe8, 0x76, 0xdf, 0xfc, 0x9e,
- 0x61, 0xc7, 0x1b, 0x1b, 0x47, 0xef, 0x47, 0x97, 0x67, 0x6f, 0x93, 0xb3,
- 0xf7, 0x97, 0xe7, 0xef, 0x2f, 0x45, 0x4f, 0x1d, 0x73, 0xd2, 0x06, 0x43,
- 0x97, 0x58, 0x77, 0xd6, 0xc5, 0x9c, 0x0b, 0xc0, 0x07, 0x18, 0xb3, 0x12,
- 0xb4, 0xa2, 0x1e, 0xa3, 0x98, 0x4d, 0xca, 0x04, 0xd7, 0x1e, 0xf3, 0x95,
- 0x63, 0xca, 0xef, 0xcc, 0x94, 0x23, 0xa1, 0x1e, 0x9e, 0x7c, 0xcd, 0xf1,
- 0x84, 0xdf, 0x43, 0xcf, 0x5a, 0xbb, 0x56, 0xd5, 0x7d, 0xdb, 0x8f, 0x01,
- 0x74, 0x4e, 0x9b, 0xc1, 0xcd, 0x2f, 0x99, 0xcb, 0xce, 0x5d, 0xe7, 0xfb,
- 0xf5, 0x31, 0xdd, 0x52, 0x70, 0x57, 0x23, 0x50, 0x0a, 0xab, 0x07, 0xd6,
- 0xb0, 0x9d, 0x59, 0xec, 0x27, 0x38, 0x37, 0xa5, 0x19, 0xe1, 0x8d, 0x4d,
- 0x89, 0x21, 0x18, 0x21, 0xa0, 0xc0, 0x8c, 0xa0, 0x22, 0xcc, 0x2d, 0xbb,
- 0x0c, 0x8a, 0xec, 0x8e, 0x14, 0x9f, 0x40, 0xa7, 0xbe, 0x4b, 0x36, 0xbf,
- 0xcf, 0xfc, 0x06, 0xff, 0xf8, 0x9f, 0x94, 0xb7, 0xfd, 0x41, 0x7f, 0xf2,
- 0x5f, 0xfc, 0xc9, 0x9f, 0x8a, 0x4d, 0x08, 0xcc, 0x36, 0x54, 0xe6, 0xdb,
- 0xe3, 0x8b, 0xaf, 0x8e, 0x2f, 0xce, 0x46, 0x90, 0x07, 0xea, 0xef, 0x0e,
- 0xf7, 0xfa, 0xc7, 0xac, 0x1a, 0x67, 0x55, 0x29, 0x75, 0xf4, 0xf4, 0x5f,
- 0xcf, 0x76, 0xbe, 0x1e, 0x8d, 0x0e, 0xcf, 0x4f, 0x6c, 0xa5, 0x2a, 0x9b,
- 0x41, 0xca, 0x3e, 0x92, 0x82, 0x73, 0x9c, 0x69, 0xfc, 0xfa, 0x8a, 0xd9,
- 0x17, 0x93, 0x8f, 0x9c, 0x59, 0x10, 0x80, 0x52, 0x34, 0xb0, 0x46, 0x68,
- 0x14, 0x49, 0x2c, 0xa6, 0x86, 0x95, 0x09, 0xce, 0xaf, 0x36, 0xc1, 0x65,
- 0x21, 0x28, 0x18, 0xd8, 0xb7, 0x10, 0xdc, 0x8f, 0xd5, 0x78, 0x60, 0x76,
- 0xfb, 0x47, 0x2d, 0xdc, 0xce, 0x89, 0x50, 0x46, 0x54, 0x72, 0x86, 0x84,
- 0x73, 0x36, 0x7e, 0xcc, 0x8b, 0xbc, 0xd9, 0xf9, 0x48, 0xe7, 0x83, 0xaa,
- 0x28, 0xcd, 0x86, 0x2c, 0xdd, 0xf9, 0x40, 0x29, 0xec, 0x9d, 0x44, 0xec,
- 0x3a, 0x76, 0x1a, 0xf3, 0x35, 0x5b, 0xfa, 0x94, 0x1d, 0xde, 0xe6, 0x27,
- 0x4f, 0x2d, 0x4d, 0x9f, 0x68, 0xfe, 0x40, 0xca, 0x5e, 0x99, 0xbb, 0x6a,
- 0x71, 0x37, 0x95, 0x4b, 0x04, 0x2c, 0xf5, 0xac, 0x5c, 0x8a, 0x0c, 0xef,
- 0x46, 0xa8, 0xa9, 0x3c, 0x2b, 0x32, 0xb6, 0x24, 0x1f, 0x25, 0x19, 0xcf,
- 0xd2, 0xe2, 0x23, 0xf4, 0x07, 0x68, 0x04, 0x74, 0xf7, 0x29, 0xf9, 0x1c,
- 0x95, 0xcd, 0x05, 0x20, 0x41, 0xf8, 0x60, 0x60, 0xf2, 0xcd, 0x48, 0xb8,
- 0xdd, 0x73, 0x30, 0xcf, 0x72, 0xec, 0x79, 0xa1, 0x77, 0x1c, 0x27, 0x37,
- 0x09, 0xe4, 0x3b, 0x3e, 0x3e, 0x35, 0x17, 0x93, 0xcd, 0x32, 0x83, 0x8f,
- 0x2e, 0x9b, 0x51, 0x2c, 0x48, 0x21, 0x81, 0x9c, 0x58, 0x9d, 0x43, 0x90,
- 0xb1, 0xf4, 0xd0, 0x02, 0x0a, 0x08, 0x20, 0x63, 0xbb, 0x20, 0x7f, 0xbc,
- 0xb6, 0x65, 0x86, 0x44, 0x72, 0xb3, 0x10, 0x03, 0x3b, 0xb0, 0xab, 0x3a,
- 0xe4, 0xd7, 0xbf, 0x12, 0xbc, 0xed, 0x91, 0x03, 0x04, 0xda, 0x82, 0x80,
- 0xdc, 0x09, 0x67, 0x84, 0x5a, 0x88, 0x41, 0x2b, 0xbd, 0x6d, 0xe5, 0x32,
- 0xf1, 0xeb, 0x31, 0x2f, 0x20, 0x93, 0x1a, 0x4e, 0x25, 0xe0, 0x69, 0xf9,
- 0xc0, 0x34, 0x67, 0xa1, 0x9d, 0x27, 0xa0, 0x1d, 0x67, 0x38, 0x10, 0x45,
- 0x6f, 0x66, 0x8d, 0x75, 0x54, 0xd4, 0xcc, 0xb0, 0x06, 0xa5, 0x6b, 0x0a,
- 0x91, 0x53, 0xb5, 0xa8, 0xaa, 0x7d, 0x78, 0x3e, 0x53, 0xd6, 0x94, 0xd6,
- 0xc8, 0x64, 0xeb, 0xdf, 0x5a, 0xb3, 0x83, 0x77, 0x74, 0x5d, 0x94, 0x83,
- 0xf1, 0x12, 0x8e, 0x19, 0xaf, 0x50, 0x1f, 0x27, 0x71, 0x97, 0x57, 0xac,
- 0x79, 0xf0, 0xef, 0x29, 0x20, 0x0d, 0x7a, 0x0c, 0x8e, 0x51, 0x23, 0x5f,
- 0xba, 0xcd, 0xb4, 0x65, 0xf9, 0x95, 0x38, 0x09, 0xc9, 0x55, 0x10, 0xb7,
- 0x03, 0x94, 0x45, 0xb6, 0x4e, 0x1a, 0xcf, 0xa6, 0xe9, 0x77, 0x52, 0x2e,
- 0x1a, 0x5b, 0xf0, 0xe2, 0x12, 0x6a, 0x42, 0x26, 0x65, 0x20, 0x34, 0x97,
- 0x42, 0x33, 0xb7, 0x6e, 0x1b, 0x2a, 0x2d, 0xc7, 0xd4, 0x30, 0xe9, 0x8c,
- 0xeb, 0xf4, 0xac, 0xbc, 0x4a, 0xf8, 0x30, 0x35, 0x97, 0x97, 0x7f, 0x39,
- 0x3f, 0x7e, 0xa5, 0x6f, 0xae, 0x5b, 0x33, 0x66, 0x4c, 0x04, 0x68, 0x2e,
- 0x13, 0x86, 0x62, 0xcd, 0xa1, 0x61, 0x51, 0x31, 0x68, 0x14, 0xcc, 0xc3,
- 0x9f, 0x19, 0x24, 0x3f, 0xbc, 0x3e, 0x19, 0x9d, 0x9f, 0x9e, 0x1d, 0xbd,
- 0x7a, 0xf9, 0x83, 0x8a, 0xe4, 0x2f, 0x28, 0x46, 0xc8, 0x7a, 0x9a, 0xfd,
- 0x99, 0x63, 0x74, 0x91, 0xf7, 0xde, 0x1d, 0x7f, 0xff, 0xc1, 0xd8, 0x63,
- 0xaf, 0xa8, 0xae, 0x43, 0xff, 0x36, 0x9d, 0xc9, 0x4b, 0xa4, 0x9f, 0x46,
- 0x74, 0xbb, 0x61, 0x9b, 0x82, 0xb3, 0x3b, 0xb1, 0xb6, 0x3e, 0xb1, 0x4b,
- 0x54, 0xba, 0x57, 0x1c, 0xad, 0x57, 0x8a, 0x2e, 0x6d, 0xe5, 0xd5, 0x47,
- 0xaa, 0x89, 0xbb, 0xeb, 0x7f, 0xb3, 0x61, 0x50, 0x35, 0x61, 0x88, 0x7c,
- 0x68, 0x0e, 0x80, 0xeb, 0xf2, 0x1b, 0x07, 0xe8, 0x17, 0xfe, 0xf4, 0x8a,
- 0xfc, 0x68, 0x96, 0x80, 0x56, 0x4a, 0xd4, 0x03, 0xf4, 0x22, 0x2c, 0xb5,
- 0x42, 0xbd, 0x46, 0x18, 0x7a, 0x4d, 0xa7, 0x51, 0x39, 0x26, 0x2a, 0x8c,
- 0xed, 0x4b, 0xaa, 0xc5, 0xb2, 0x51, 0x91, 0xeb, 0xfc, 0xf8, 0x62, 0x74,
- 0x32, 0xba, 0x24, 0xc3, 0x55, 0x2a, 0xb7, 0x4a, 0x10, 0x4a, 0xcb, 0xea,
- 0x82, 0xb4, 0xa5, 0x4d, 0x38, 0xec, 0x57, 0x0b, 0x6a, 0x9d, 0x68, 0x2b,
- 0xe6, 0xda, 0x59, 0xdc, 0x74, 0x03, 0x70, 0x6a, 0x38, 0x29, 0xa2, 0x4c,
- 0x9b, 0x9d, 0x5e, 0xe9, 0x01, 0x2e, 0x65, 0x6b, 0x74, 0x8a, 0xe6, 0xa0,
- 0xe0, 0x15, 0x56, 0x67, 0x96, 0x8f, 0x9d, 0x33, 0xb3, 0x83, 0x21, 0x21,
- 0x78, 0x92, 0x50, 0xf4, 0xf8, 0x47, 0x48, 0x03, 0x62, 0x8e, 0x1a, 0x41,
- 0x8a, 0x79, 0xcb, 0xb5, 0x26, 0x69, 0xcd, 0x7e, 0x02, 0xbb, 0x75, 0x4b,
- 0xc1, 0x68, 0x51, 0x3d, 0xcd, 0xfe, 0xd4, 0x43, 0xa1, 0x0b, 0xeb, 0x1b,
- 0x08, 0xab, 0x45, 0x64, 0x93, 0x50, 0xce, 0x39, 0x15, 0x95, 0xfc, 0x93,
- 0x46, 0x6b, 0x01, 0xb5, 0x06, 0x80, 0x82, 0x32, 0xb2, 0x40, 0x05, 0x11,
- 0xd5, 0xf1, 0x9a, 0x72, 0x58, 0x41, 0xad, 0x37, 0x25, 0x7d, 0x0b, 0x2e,
- 0x78, 0xff, 0x63, 0x7a, 0x9d, 0xd2, 0x0c, 0x8e, 0x97, 0x7e, 0x29, 0x48,
- 0xdb, 0x7b, 0xae, 0x4a, 0x84, 0x89, 0x07, 0x44, 0x3a, 0xad, 0xe0, 0xc9,
- 0x68, 0xa4, 0x54, 0x84, 0x1a, 0x3e, 0x82, 0x77, 0x1e, 0xb6, 0x59, 0xbc,
- 0x74, 0x5f, 0xaa, 0x11, 0xb6, 0x6e, 0x46, 0xbd, 0xda, 0xb1, 0xb4, 0x7d,
- 0xab, 0x4c, 0x81, 0x8b, 0xec, 0x54, 0xac, 0x29, 0xe2, 0x58, 0x4c, 0xec,
- 0x65, 0x4c, 0x59, 0x87, 0x04, 0x30, 0xa8, 0x84, 0x21, 0xcd, 0x88, 0x3f,
- 0x0a, 0x2d, 0xa1, 0xe0, 0x2c, 0x2a, 0xb1, 0x53, 0xd8, 0x5d, 0xd9, 0x33,
- 0x5d, 0x1e, 0x07, 0x4f, 0xb7, 0xb7, 0xad, 0x38, 0xbe, 0x76, 0x2f, 0x1f,
- 0xb4, 0x0c, 0x19, 0xba, 0x58, 0x7d, 0x4e, 0xb8, 0x4c, 0x91, 0xdf, 0xa7,
- 0x81, 0x1d, 0x2f, 0x4f, 0xbc, 0x96, 0xec, 0x7b, 0x8b, 0x4f, 0x81, 0xc0,
- 0x6b, 0x55, 0xdd, 0xa6, 0xd1, 0xb5, 0xb0, 0x01, 0x46, 0xbf, 0x5c, 0xa0,
- 0x84, 0xda, 0x44, 0x6a, 0x48, 0x00, 0xb5, 0x6f, 0x1b, 0xd4, 0x4b, 0xc4,
- 0x4d, 0x96, 0x99, 0xd5, 0xb7, 0xef, 0x4f, 0x2f, 0x4f, 0xce, 0x7d, 0xfc,
- 0x41, 0xf2, 0xfd, 0xc9, 0xe5, 0x37, 0x46, 0x6b, 0x1f, 0x9d, 0xbc, 0xfb,
- 0xfa, 0x94, 0x82, 0xbc, 0x6f, 0xdf, 0x1e, 0xbe, 0x23, 0x7a, 0x91, 0x77,
- 0x80, 0x36, 0x1f, 0xc2, 0x70, 0x20, 0x71, 0x64, 0xa6, 0x98, 0xf6, 0x0e,
- 0x11, 0x4f, 0xf4, 0xc3, 0x58, 0x63, 0xe7, 0xf8, 0x71, 0x55, 0xf5, 0xa2,
- 0x3d, 0x49, 0xb4, 0xe2, 0x62, 0x19, 0xdc, 0x93, 0x1b, 0x17, 0xc7, 0x96,
- 0x8c, 0x2d, 0x9a, 0xe8, 0x6e, 0xf1, 0x08, 0x24, 0x39, 0xb3, 0x86, 0x0e,
- 0x1c, 0x0d, 0xdf, 0xdd, 0x2e, 0x7e, 0x89, 0x15, 0xb5, 0xd4, 0xd3, 0xb0,
- 0x63, 0x8c, 0xce, 0x54, 0x88, 0x5d, 0xc3, 0xf7, 0x65, 0x3b, 0xe9, 0xc8,
- 0x7c, 0x11, 0x5d, 0x02, 0x90, 0xa8, 0x74, 0x8e, 0x74, 0xb2, 0x38, 0xc9,
- 0x68, 0xbe, 0x38, 0xf5, 0x2f, 0xd4, 0x61, 0xab, 0xe6, 0xa0, 0xe2, 0x83,
- 0xaf, 0xcb, 0xcc, 0x9d, 0xdc, 0xc1, 0x99, 0x36, 0xa3, 0xf1, 0x1f, 0x98,
- 0x61, 0x7c, 0xb9, 0x0c, 0x48, 0xae, 0x0d, 0xcc, 0x92, 0x6c, 0xdb, 0x3a,
- 0x63, 0x62, 0xf6, 0x1f, 0xb0, 0x5a, 0x69, 0xc9, 0xd5, 0xb5, 0x3c, 0xa7,
- 0x69, 0x4e, 0x5b, 0x16, 0x2c, 0x1a, 0x12, 0x32, 0x24, 0xaf, 0x51, 0xc6,
- 0x0c, 0x69, 0xa9, 0x8f, 0xb5, 0x68, 0x19, 0xf8, 0xbe, 0x3b, 0xd3, 0xe0,
- 0xa4, 0xe6, 0xb5, 0xda, 0xc2, 0x8f, 0x0e, 0x3a, 0x81, 0xd2, 0x8a, 0x70,
- 0x57, 0x64, 0x84, 0x72, 0xa0, 0xbf, 0xfe, 0x75, 0x71, 0xed, 0xa7, 0xbc,
- 0x72, 0x61, 0xf9, 0x45, 0x6c, 0x65, 0x85, 0xc9, 0x9d, 0xd5, 0x22, 0x29,
- 0x66, 0xd9, 0xea, 0x81, 0x54, 0xa8, 0xdc, 0x5b, 0xf5, 0x41, 0xf9, 0xfd,
- 0x7e, 0xf8, 0xfb, 0x7d, 0x0e, 0x32, 0x9c, 0x9c, 0xdf, 0x3e, 0xb7, 0x0c,
- 0xc8, 0x4c, 0xe4, 0xe0, 0xab, 0x6f, 0xaa, 0x14, 0xd0, 0x0e, 0xa3, 0x47,
- 0xc5, 0x65, 0xce, 0x32, 0x91, 0x83, 0x7f, 0x04, 0x21, 0x5d, 0x56, 0x48,
- 0x50, 0xc7, 0x23, 0x88, 0xae, 0x30, 0xee, 0x1f, 0x9e, 0x27, 0xc8, 0x29,
- 0xba, 0xae, 0x4c, 0x83, 0xe6, 0xf7, 0x4f, 0x6d, 0x32, 0x8e, 0x93, 0x69,
- 0x28, 0xd2, 0x28, 0xe9, 0x90, 0x83, 0x7c, 0x71, 0xab, 0x55, 0xbe, 0xcd,
- 0x5f, 0x9f, 0xdb, 0x02, 0x5d, 0x75, 0x2b, 0x48, 0xdd, 0x62, 0x1b, 0x57,
- 0xe1, 0x8f, 0xce, 0xc1, 0x07, 0x46, 0x92, 0xc1, 0x19, 0x19, 0x9d, 0x7e,
- 0x65, 0xed, 0x8c, 0x0c, 0xaf, 0x4c, 0x31, 0xb2, 0xbe, 0x66, 0x48, 0x8d,
- 0x87, 0x3c, 0xf2, 0x84, 0x8b, 0x5f, 0xe9, 0x43, 0x56, 0xfd, 0xc7, 0xfd,
- 0xdd, 0xdd, 0xbd, 0x83, 0xbd, 0xcf, 0x5f, 0xec, 0x1e, 0xec, 0xed, 0xed,
- 0xed, 0x1f, 0xec, 0x1d, 0x1c, 0xec, 0xef, 0xfe, 0xbc, 0x43, 0xfe, 0xa3,
- 0xdb, 0x3c, 0xbb, 0xd3, 0xc8, 0x34, 0xfb, 0xf9, 0xb0, 0xad, 0xeb, 0xe6,
- 0x9e, 0xc1, 0x00, 0xec, 0xe9, 0xc3, 0xbe, 0x56, 0xcd, 0xc7, 0xd2, 0xca,
- 0x70, 0xce, 0x0c, 0x53, 0x48, 0x2e, 0x5c, 0xaa, 0x39, 0xce, 0xa0, 0x47,
- 0x73, 0x8f, 0x5e, 0xfd, 0x6d, 0x49, 0x23, 0x1d, 0x93, 0x3a, 0x00, 0x9d,
- 0xa6, 0xb6, 0x89, 0xbd, 0xd7, 0xb3, 0x72, 0x3c, 0x46, 0xea, 0x92, 0xcd,
- 0x6d, 0x1f, 0x26, 0xc4, 0xa5, 0xfc, 0x91, 0xb7, 0x84, 0x84, 0x0e, 0x81,
- 0x2a, 0xe6, 0x83, 0xee, 0x66, 0xc7, 0x79, 0xf6, 0xcc, 0x0e, 0x98, 0x94,
- 0x54, 0x57, 0x04, 0x9e, 0x6e, 0x33, 0x49, 0x95, 0xcd, 0x79, 0x4b, 0xae,
- 0xb2, 0xcf, 0x77, 0x0f, 0x0e, 0xa8, 0xf4, 0xcf, 0x1f, 0xf7, 0xfa, 0x02,
- 0x08, 0xf7, 0xb3, 0x5c, 0xfa, 0xf6, 0x7a, 0xe2, 0x36, 0xc8, 0xfc, 0xf0,
- 0xc7, 0x59, 0x2c, 0xe7, 0x59, 0x65, 0x0c, 0x11, 0x2a, 0x1e, 0x0d, 0x44,
- 0x34, 0x3c, 0x86, 0xcc, 0xb1, 0x08, 0x46, 0xa6, 0x4e, 0x36, 0x0e, 0xdd,
- 0x08, 0xcc, 0x15, 0x6d, 0x59, 0x28, 0x98, 0x2f, 0xcc, 0x0d, 0xd1, 0xb6,
- 0x8d, 0xf2, 0x57, 0x00, 0x6b, 0x72, 0x2e, 0x1b, 0x67, 0xf1, 0xf1, 0x7d,
- 0x2b, 0x92, 0x01, 0x87, 0xab, 0xe0, 0x92, 0xc6, 0xf4, 0x38, 0xeb, 0xf0,
- 0xf0, 0x98, 0x78, 0xca, 0xad, 0x24, 0xf0, 0xfd, 0xe8, 0x0d, 0x76, 0xff,
- 0xd9, 0xde, 0xcf, 0x8c, 0x57, 0xa6, 0x03, 0xe1, 0x66, 0x4d, 0x83, 0x2f,
- 0x7e, 0x8a, 0x96, 0x6e, 0xa4, 0xad, 0x6c, 0x78, 0x3d, 0x54, 0xad, 0x42,
- 0xbc, 0x8d, 0x7d, 0x3f, 0x6b, 0x84, 0xeb, 0x14, 0x70, 0xa1, 0x72, 0xd8,
- 0x69, 0xea, 0x50, 0xf2, 0x5d, 0xb5, 0x3a, 0x30, 0x5b, 0x8e, 0xee, 0xed,
- 0xf1, 0xe5, 0xa1, 0xb9, 0x3c, 0xbe, 0x0d, 0x0d, 0xfd, 0xb7, 0x99, 0xb1,
- 0xca, 0x69, 0xb1, 0xb7, 0x70, 0x1e, 0x6e, 0x2d, 0x3b, 0x38, 0xcd, 0xdd,
- 0xd3, 0x64, 0x8b, 0x42, 0x94, 0xcf, 0x3e, 0x7f, 0xf6, 0x74, 0x9b, 0x4b,
- 0xb1, 0xf0, 0x6b, 0x19, 0x25, 0x88, 0xc1, 0x2b, 0x29, 0xec, 0x54, 0xe4,
- 0xc0, 0xb7, 0x22, 0xe9, 0xfd, 0xc5, 0x09, 0x1f, 0xe9, 0x1b, 0x26, 0x11,
- 0x61, 0xa3, 0xb7, 0xcb, 0x26, 0x89, 0xfb, 0xd6, 0x53, 0x32, 0xe6, 0x39,
- 0x31, 0x9d, 0x82, 0x7c, 0x81, 0x2e, 0x46, 0x4b, 0xfe, 0x81, 0x1b, 0xd6,
- 0x1c, 0xd0, 0x12, 0x05, 0x4a, 0xa5, 0xee, 0x1b, 0x3a, 0x03, 0x6a, 0x54,
- 0x62, 0x66, 0x96, 0x7d, 0x66, 0x2d, 0x30, 0xb2, 0x83, 0x58, 0x1e, 0xb1,
- 0xf4, 0xef, 0xb0, 0xf1, 0x6f, 0x33, 0xe4, 0x07, 0x4a, 0x21, 0x6d, 0x43,
- 0xf3, 0xa0, 0x62, 0xc7, 0xa9, 0xc7, 0xad, 0x74, 0x54, 0xa7, 0x6d, 0x7a,
- 0xa4, 0x6e, 0xca, 0xe7, 0x24, 0xa2, 0xc8, 0x4e, 0x21, 0xe3, 0x59, 0x1a,
- 0x78, 0x16, 0xf3, 0x96, 0xcb, 0x47, 0xc8, 0x34, 0x40, 0x6a, 0x81, 0x9c,
- 0x83, 0xb9, 0xb9, 0x8e, 0xaa, 0x7b, 0xd1, 0xb0, 0x61, 0x26, 0xd8, 0x7a,
- 0x8a, 0x1d, 0x44, 0x10, 0xd3, 0xc6, 0xf8, 0xa9, 0x34, 0x96, 0x35, 0x49,
- 0x8d, 0xe6, 0x56, 0x07, 0x5a, 0x62, 0x7f, 0x30, 0xd7, 0x5f, 0x79, 0x80,
- 0x39, 0x3f, 0xbf, 0x54, 0xff, 0xae, 0xcf, 0x79, 0x58, 0xea, 0xb4, 0x3b,
- 0xb0, 0x15, 0x5d, 0x63, 0x46, 0x5d, 0xe0, 0x27, 0xad, 0xf5, 0xb3, 0x85,
- 0x9e, 0xec, 0xec, 0x6c, 0xaf, 0xe8, 0x8d, 0xfc, 0x3a, 0xf6, 0xf5, 0x73,
- 0x90, 0x12, 0x79, 0x29, 0xdd, 0x66, 0xcd, 0xdb, 0x8d, 0xd3, 0xd4, 0xe6,
- 0x35, 0xad, 0xe4, 0x54, 0x80, 0xf1, 0xec, 0x46, 0x55, 0xf3, 0x8a, 0x3b,
- 0xaf, 0xc2, 0xab, 0x3d, 0x08, 0xc1, 0xe2, 0x29, 0x49, 0x1c, 0x57, 0x95,
- 0x67, 0x54, 0xc0, 0x30, 0x39, 0xa4, 0xdd, 0xd0, 0xfa, 0xb0, 0xd7, 0x65,
- 0xf5, 0xe7, 0x6a, 0xdd, 0x03, 0x55, 0x62, 0xad, 0x3b, 0xaf, 0xef, 0xfd,
- 0x52, 0xd5, 0x3c, 0xe5, 0x04, 0xb1, 0xce, 0xde, 0x71, 0xc6, 0xfc, 0x47,
- 0x56, 0x72, 0x7a, 0x7c, 0xe6, 0x79, 0xd1, 0x2a, 0x14, 0x2c, 0x8d, 0x00,
- 0xe9, 0x62, 0x07, 0x01, 0xaa, 0xd4, 0x4a, 0x29, 0xb8, 0xfd, 0xe2, 0xa1,
- 0xa0, 0x20, 0x91, 0xac, 0x16, 0x56, 0xac, 0xed, 0x26, 0x66, 0x90, 0xc2,
- 0x98, 0xb7, 0x57, 0x6b, 0x3e, 0xfa, 0xbc, 0xe3, 0x19, 0xc5, 0x64, 0x21,
- 0x15, 0x24, 0x30, 0x0e, 0x4f, 0x4e, 0x09, 0x16, 0x7b, 0x6a, 0x4c, 0xbc,
- 0x91, 0xaa, 0x4a, 0x80, 0x89, 0x03, 0xb0, 0x5b, 0xe4, 0xa4, 0xae, 0xf7,
- 0x6d, 0xc1, 0x21, 0xcd, 0x96, 0x84, 0xdd, 0x42, 0x21, 0x56, 0x36, 0xfd,
- 0x85, 0x24, 0xd4, 0xac, 0x96, 0xd1, 0x97, 0x6a, 0x76, 0xda, 0x82, 0x80,
- 0x9b, 0x4a, 0x53, 0xdc, 0x66, 0xb3, 0x72, 0x01, 0x93, 0x9a, 0xc5, 0x34,
- 0xea, 0x9d, 0x55, 0xd9, 0x2c, 0xbb, 0x15, 0xef, 0x2a, 0xd3, 0x19, 0x7f,
- 0x2d, 0x88, 0x05, 0x2e, 0x78, 0xdc, 0x48, 0x56, 0x4b, 0x80, 0x8a, 0xa0,
- 0x8f, 0xee, 0x30, 0x2b, 0x94, 0x23, 0xfb, 0xa1, 0xef, 0xbb, 0x22, 0x1c,
- 0x66, 0x86, 0x6c, 0x11, 0x87, 0x01, 0x19, 0xb9, 0x02, 0x6e, 0x7f, 0x5f,
- 0x0b, 0x9f, 0x4b, 0x37, 0x5b, 0x84, 0x9d, 0x85, 0x5a, 0x33, 0x93, 0xbd,
- 0xef, 0x7d, 0xa5, 0x49, 0xe7, 0x90, 0x01, 0xdd, 0x3c, 0x7d, 0xf2, 0xd4,
- 0xa2, 0xa5, 0x2b, 0x63, 0x91, 0x51, 0x41, 0x9c, 0x3e, 0xa7, 0x8e, 0x63,
- 0x73, 0x94, 0x33, 0xf3, 0x4f, 0x00, 0x2a, 0x19, 0x62, 0x6d, 0x9e, 0xa5,
- 0x78, 0xb3, 0x87, 0x69, 0x27, 0xcc, 0x0d, 0xd2, 0xa1, 0xe4, 0x5f, 0x68,
- 0xaa, 0x5a, 0x82, 0x4d, 0xbc, 0xcf, 0xb7, 0x21, 0xc5, 0x79, 0x9b, 0xc9,
- 0xd0, 0xf6, 0x5e, 0x50, 0x3f, 0xdc, 0xff, 0xd7, 0x3c, 0x95, 0x34, 0x08,
- 0xd6, 0x43, 0xca, 0x4a, 0xa7, 0x97, 0x97, 0x61, 0xcc, 0x25, 0x4e, 0xbf,
- 0x5a, 0x52, 0xfc, 0xd1, 0x16, 0xf0, 0xa2, 0x5e, 0xcc, 0xe9, 0x2e, 0xca,
- 0xb8, 0x9a, 0xb0, 0x6d, 0x9c, 0x4c, 0xba, 0xa5, 0x59, 0x5e, 0x6e, 0xfd,
- 0xb4, 0xbc, 0xa3, 0x52, 0xc8, 0x57, 0x57, 0xf9, 0x84, 0x62, 0xff, 0x8e,
- 0x35, 0x9c, 0x64, 0x3c, 0x3f, 0x38, 0xd7, 0xea, 0x6b, 0x66, 0x6c, 0xc9,
- 0x62, 0x39, 0x9e, 0x99, 0xcb, 0x5a, 0xf3, 0x59, 0xcc, 0xa9, 0xc2, 0x2c,
- 0x19, 0x6b, 0x0b, 0xcd, 0x31, 0xbd, 0x21, 0x0c, 0xce, 0x4e, 0x0e, 0x05,
- 0xc2, 0xa5, 0x15, 0x54, 0xf0, 0x39, 0x6a, 0x42, 0x53, 0xa2, 0xc1, 0xbc,
- 0x2c, 0x34, 0x1d, 0x6e, 0x59, 0x33, 0x9d, 0x2c, 0xa2, 0x39, 0x5c, 0x25,
- 0x2b, 0xc1, 0x93, 0x52, 0xb4, 0x41, 0x4c, 0x73, 0xbc, 0xe1, 0x0f, 0x66,
- 0x3a, 0x58, 0xdc, 0x2c, 0x74, 0xa5, 0x55, 0x21, 0x62, 0x6d, 0x49, 0x12,
- 0xb0, 0x70, 0xf4, 0xce, 0xbf, 0x39, 0x1f, 0x26, 0xc7, 0xd4, 0x12, 0xf7,
- 0x49, 0x14, 0x5d, 0xf8, 0x68, 0xcc, 0xef, 0xcc, 0x60, 0xaf, 0xe9, 0x02,
- 0x3b, 0xab, 0xe8, 0x5f, 0x68, 0x4d, 0x7e, 0xc9, 0x6e, 0x59, 0xfc, 0xb6,
- 0xfd, 0x55, 0xd3, 0x90, 0xa6, 0x59, 0x9c, 0xe3, 0xef, 0xe6, 0xac, 0x18,
- 0xf5, 0xcb, 0x2e, 0x93, 0xfb, 0x42, 0x59, 0xb5, 0xc8, 0xb7, 0xf8, 0xcd,
- 0xc4, 0x68, 0x65, 0xd0, 0xad, 0x16, 0xf7, 0x58, 0x3f, 0x4f, 0x38, 0xb2,
- 0xfe, 0xc9, 0x0d, 0x78, 0x5b, 0x4b, 0xb6, 0x9f, 0x05, 0xf0, 0xf2, 0xc1,
- 0xaa, 0x98, 0x76, 0xaa, 0xca, 0x04, 0xee, 0x5c, 0x4a, 0x60, 0x9a, 0x3d,
- 0x1a, 0x75, 0xd6, 0x39, 0xaf, 0x9e, 0xfd, 0xa6, 0xbf, 0x20, 0xb3, 0x9b,
- 0xfa, 0x62, 0xb4, 0x16, 0xb3, 0x04, 0xc3, 0x8d, 0xff, 0x3f, 0xad, 0x97,
- 0xa6, 0x3e, 0x3e, 0xe8, 0x02, 0x00,
+ 0x6b, 0x7b, 0x1b, 0x47, 0x92, 0x26, 0x80, 0x7e, 0xe7, 0xaf, 0xa8, 0x46,
+ 0x9f, 0x1e, 0x92, 0xdd, 0x00, 0x78, 0xd1, 0xc5, 0x36, 0x2d, 0x79, 0x4c,
+ 0x53, 0x94, 0xcd, 0x31, 0x25, 0x72, 0x09, 0xca, 0x76, 0xaf, 0xed, 0x47,
+ 0x4f, 0x01, 0x28, 0x92, 0xd5, 0x02, 0xaa, 0xd0, 0x55, 0x05, 0x52, 0xec,
+ 0xd9, 0xd9, 0xdf, 0x7e, 0x32, 0xde, 0x88, 0xc8, 0xcc, 0xaa, 0x4c, 0x80,
+ 0xb4, 0xdb, 0xee, 0x9d, 0x73, 0x76, 0xe7, 0x62, 0x49, 0x64, 0x55, 0x56,
+ 0x5e, 0x23, 0xe3, 0xf2, 0xc6, 0x1b, 0x49, 0xf2, 0xd0, 0xff, 0xbc, 0xc7,
+ 0xff, 0xbf, 0x37, 0xff, 0x63, 0xfe, 0xdc, 0x48, 0x92, 0xf3, 0xaa, 0xfc,
+ 0x5b, 0x36, 0x69, 0xe2, 0xcf, 0xbe, 0x7f, 0xff, 0xbf, 0x12, 0xfe, 0x5f,
+ 0xf3, 0xce, 0x4f, 0xe6, 0xcf, 0x8d, 0xb5, 0x6d, 0xef, 0x24, 0xee, 0x85,
+ 0xff, 0xf5, 0x7e, 0x3b, 0x79, 0xe8, 0x85, 0xff, 0x95, 0x6c, 0xe1, 0x85,
+ 0xf7, 0xf2, 0x85, 0x17, 0xf4, 0xf7, 0xf7, 0xef, 0xd7, 0x7f, 0xe4, 0x27,
+ 0xea, 0x15, 0xfd, 0x67, 0x87, 0xde, 0xfb, 0xe9, 0x3d, 0xfd, 0xd5, 0xfc,
+ 0x64, 0x63, 0xe3, 0xed, 0xe1, 0x9b, 0x63, 0x7d, 0x75, 0xb2, 0xac, 0x66,
+ 0xc9, 0x20, 0x69, 0xaa, 0xb4, 0xa8, 0xaf, 0xb2, 0x2a, 0x49, 0x93, 0x77,
+ 0x17, 0xa7, 0x1b, 0x1b, 0xa3, 0xbf, 0xbe, 0x3d, 0x3b, 0x1f, 0x9d, 0x8c,
+ 0x5a, 0x8f, 0xfd, 0x58, 0x2e, 0x9a, 0xbc, 0x2c, 0xea, 0x9f, 0x93, 0x1f,
+ 0xcd, 0x43, 0xc3, 0xe1, 0xf0, 0xe7, 0x8d, 0x8d, 0x57, 0xc7, 0xa3, 0xa3,
+ 0x8b, 0x93, 0xf3, 0xcb, 0x93, 0xb3, 0xb7, 0xad, 0x67, 0x93, 0xbc, 0x4e,
+ 0x4c, 0x63, 0x4d, 0x59, 0xce, 0xcc, 0x7f, 0x5c, 0xfb, 0xd3, 0xb4, 0x49,
+ 0x93, 0xab, 0xaa, 0x9c, 0x27, 0x65, 0x45, 0xbf, 0x48, 0x93, 0x3a, 0xab,
+ 0x6e, 0xb3, 0xaa, 0x9f, 0x2c, 0xeb, 0xbc, 0xb8, 0x4e, 0xca, 0x22, 0x4b,
+ 0xca, 0xab, 0xa4, 0xb9, 0xc9, 0xb4, 0xb9, 0x7a, 0xb9, 0x58, 0x94, 0x55,
+ 0x93, 0x4d, 0x93, 0x45, 0x55, 0x36, 0xe5, 0xa4, 0x9c, 0xd5, 0xc9, 0xd6,
+ 0xab, 0x93, 0xa3, 0xcb, 0x7e, 0xf2, 0xfa, 0xe4, 0xf4, 0xd8, 0xfc, 0xf7,
+ 0xf2, 0x1c, 0xff, 0x19, 0xf5, 0x93, 0xaf, 0xcf, 0xce, 0xbf, 0x39, 0xbe,
+ 0xe8, 0x27, 0xdf, 0x5c, 0xd2, 0xcf, 0xe8, 0xbf, 0xe6, 0x87, 0xc9, 0xc9,
+ 0x9b, 0xc3, 0xf3, 0xbe, 0x36, 0x47, 0xff, 0xa0, 0x1f, 0x9e, 0xbe, 0x32,
+ 0x3f, 0xe4, 0x3f, 0xe8, 0x9f, 0xe7, 0x67, 0xe7, 0x4f, 0xe4, 0x0f, 0xfa,
+ 0xe7, 0xc5, 0xe5, 0x1b, 0xf3, 0xdb, 0x8b, 0xcb, 0x91, 0xf9, 0xef, 0xe8,
+ 0x88, 0xfe, 0x83, 0xaf, 0x8c, 0xde, 0x7c, 0x85, 0xff, 0x8c, 0x6c, 0x73,
+ 0xa3, 0x37, 0xfc, 0x73, 0x7c, 0xe9, 0xf2, 0xf8, 0xf4, 0xed, 0xf1, 0x65,
+ 0x92, 0x16, 0xd3, 0xe4, 0xd2, 0x3c, 0xbf, 0x3d, 0x4c, 0x2e, 0x6f, 0xb2,
+ 0x64, 0x52, 0xce, 0xe7, 0xf4, 0x23, 0x33, 0x23, 0xd3, 0xac, 0xce, 0xaf,
+ 0x0b, 0x33, 0x14, 0x33, 0xf2, 0xbb, 0xb2, 0xfa, 0x90, 0x24, 0x77, 0x79,
+ 0x73, 0x53, 0x2e, 0x1b, 0x6d, 0x6e, 0x69, 0x66, 0x23, 0xc9, 0x8b, 0x26,
+ 0xab, 0xd2, 0x09, 0xcd, 0xf5, 0x70, 0xa3, 0x35, 0xab, 0xe5, 0x95, 0x99,
+ 0xc3, 0xda, 0x4c, 0xda, 0x78, 0x59, 0xcf, 0xca, 0x74, 0x4a, 0x53, 0x65,
+ 0x5e, 0xb9, 0x5a, 0x9a, 0x49, 0xae, 0xf2, 0xc9, 0x87, 0x3a, 0x99, 0xe5,
+ 0x1f, 0x32, 0x9a, 0xa8, 0x8f, 0xf7, 0x3a, 0x71, 0x7d, 0x6e, 0x34, 0x5d,
+ 0x9a, 0x39, 0x2d, 0x06, 0xda, 0x5c, 0x93, 0x4f, 0x52, 0xfa, 0x00, 0x66,
+ 0x2e, 0x59, 0x2e, 0xa8, 0x35, 0x9e, 0xb1, 0x64, 0x51, 0xd6, 0xe6, 0xa5,
+ 0xd1, 0xe8, 0xd4, 0xf4, 0xbc, 0x28, 0x32, 0xf4, 0xa3, 0xee, 0x9b, 0x7f,
+ 0x94, 0x1f, 0xf2, 0xcc, 0xfc, 0xe5, 0x2a, 0x9f, 0x65, 0x09, 0xaf, 0xa8,
+ 0x6d, 0x8e, 0x96, 0x36, 0xa9, 0xb2, 0x7a, 0x39, 0xcf, 0xcc, 0xec, 0xbd,
+ 0xc9, 0x9a, 0x74, 0x96, 0x17, 0x1f, 0xcc, 0x5f, 0x69, 0xe0, 0xf3, 0xb2,
+ 0xca, 0x86, 0xc9, 0x61, 0x9d, 0xdc, 0x97, 0x4b, 0x33, 0xe0, 0xd9, 0xcc,
+ 0xac, 0x79, 0x96, 0x8c, 0xb3, 0x59, 0x79, 0xd7, 0xa7, 0x95, 0x4e, 0x8a,
+ 0xe5, 0x7c, 0x6c, 0x1a, 0x28, 0xaf, 0x5c, 0x73, 0x69, 0xb3, 0x34, 0xcd,
+ 0xf1, 0xd3, 0xf3, 0xd4, 0x8c, 0xc9, 0xbc, 0x5b, 0x25, 0x37, 0x99, 0x19,
+ 0x73, 0xbd, 0xc8, 0x8b, 0x3f, 0xb4, 0xe7, 0xc5, 0x4c, 0xed, 0xa2, 0xbc,
+ 0xcb, 0x2a, 0x33, 0xb3, 0xe3, 0xfb, 0xc4, 0x4c, 0xc2, 0x98, 0x37, 0xe1,
+ 0x95, 0xd9, 0x64, 0x49, 0x6a, 0x9a, 0xb0, 0x1b, 0x70, 0x50, 0x65, 0xb3,
+ 0x94, 0x36, 0x93, 0xfd, 0xc6, 0xd0, 0x2c, 0x62, 0x66, 0x77, 0x9b, 0xbc,
+ 0xba, 0xf5, 0x64, 0x1b, 0x2f, 0x4f, 0xcd, 0x48, 0xf2, 0x59, 0x6d, 0x96,
+ 0x81, 0x8e, 0x85, 0x3c, 0x43, 0x8b, 0x4a, 0xc7, 0xc4, 0xec, 0xcd, 0xfb,
+ 0xa2, 0x49, 0x3f, 0xe2, 0xf3, 0xb2, 0x37, 0x07, 0xd3, 0x6c, 0x91, 0x15,
+ 0xd3, 0xac, 0x68, 0x86, 0xc9, 0x5f, 0xcb, 0xe5, 0xa6, 0xf9, 0xf6, 0x55,
+ 0x6e, 0xe6, 0x20, 0x95, 0xa6, 0xcc, 0x97, 0xcd, 0x26, 0x98, 0x54, 0xf9,
+ 0xc2, 0x5b, 0x8a, 0xb2, 0x30, 0x6b, 0x9e, 0x5c, 0xbc, 0x3e, 0x4a, 0x9e,
+ 0x7c, 0xf6, 0xe9, 0x73, 0xb7, 0xe6, 0xa6, 0x81, 0x64, 0x92, 0x16, 0x66,
+ 0xc4, 0xd9, 0x24, 0xbf, 0xba, 0x4f, 0xe6, 0xcb, 0x59, 0x93, 0x2f, 0xcc,
+ 0xec, 0x9b, 0x8f, 0xd7, 0x74, 0x80, 0x16, 0x69, 0xd5, 0xd4, 0xb4, 0x09,
+ 0xf0, 0x03, 0x8c, 0xfd, 0xae, 0xca, 0x1b, 0x3a, 0x48, 0xf8, 0x9d, 0xe9,
+ 0x61, 0xd6, 0xd4, 0xda, 0x1c, 0xed, 0x35, 0xf3, 0x9d, 0xb1, 0xd9, 0x5b,
+ 0x66, 0x6a, 0xd3, 0xda, 0x7c, 0xf4, 0x60, 0xc3, 0xc9, 0x90, 0x9b, 0xa6,
+ 0x59, 0x1c, 0xec, 0xec, 0xd4, 0x79, 0x93, 0x0d, 0xff, 0xd3, 0x9c, 0xc3,
+ 0x7e, 0x73, 0x57, 0xf6, 0x9b, 0x9b, 0x2a, 0xcb, 0xfe, 0x6b, 0x68, 0xf6,
+ 0xb0, 0x7d, 0xd2, 0x7c, 0xf7, 0x5e, 0x3a, 0x76, 0x9d, 0x35, 0xe6, 0x0b,
+ 0x7f, 0x5f, 0x66, 0x05, 0xb5, 0x68, 0xfa, 0x91, 0xce, 0x16, 0x37, 0xa9,
+ 0x59, 0xce, 0xcc, 0xec, 0x46, 0x3a, 0xd9, 0x66, 0xc3, 0x50, 0xaf, 0xf8,
+ 0x6c, 0xff, 0xf8, 0x73, 0xf8, 0xd1, 0x2b, 0x7c, 0xd3, 0xfc, 0x77, 0x98,
+ 0x7d, 0x4c, 0xe7, 0x66, 0x6c, 0xf4, 0xa9, 0x1d, 0xda, 0x62, 0x3f, 0xee,
+ 0x0d, 0xf6, 0x76, 0x77, 0x7f, 0x1e, 0x36, 0x1f, 0x9b, 0xc7, 0x3d, 0xbf,
+ 0xbb, 0xeb, 0xde, 0xa0, 0x47, 0xb7, 0x68, 0xbc, 0xc9, 0xcc, 0x6c, 0x19,
+ 0xfa, 0xf8, 0x3f, 0xb2, 0xaa, 0xac, 0xb7, 0x1f, 0xd7, 0x52, 0x3a, 0xf8,
+ 0x47, 0xfb, 0xbb, 0x6f, 0xb3, 0x1a, 0x7b, 0xc6, 0x8d, 0x35, 0x49, 0x2b,
+ 0xb3, 0x6f, 0xcb, 0xc6, 0x89, 0xa7, 0xbe, 0x39, 0x94, 0x8d, 0x9d, 0x19,
+ 0x73, 0xe6, 0xcc, 0xd3, 0x46, 0xb0, 0xa5, 0x33, 0x92, 0x69, 0x75, 0x52,
+ 0x64, 0x1f, 0xed, 0x29, 0x37, 0xa7, 0x3f, 0x4b, 0x27, 0x37, 0x49, 0x69,
+ 0x36, 0x7f, 0x15, 0x59, 0x02, 0xbf, 0x43, 0x69, 0x35, 0xb9, 0xc9, 0x6f,
+ 0xcd, 0x6c, 0x7c, 0xf6, 0xd9, 0xf3, 0x81, 0xf9, 0xcf, 0x67, 0x3f, 0xef,
+ 0xdc, 0x96, 0x33, 0x33, 0x39, 0x4f, 0x7f, 0xde, 0xa1, 0x25, 0xfe, 0xcf,
+ 0xb4, 0x3f, 0xee, 0x4f, 0xfe, 0x6b, 0x78, 0xd3, 0xcc, 0x67, 0x2b, 0x37,
+ 0x4e, 0x5a, 0x98, 0xff, 0x9f, 0x97, 0xcb, 0xa2, 0xb1, 0x9b, 0xc5, 0xec,
+ 0xb9, 0xc6, 0x13, 0x4e, 0xe6, 0xb8, 0x9a, 0x33, 0x4a, 0x5b, 0x9b, 0xf6,
+ 0x10, 0x9d, 0x3a, 0x73, 0x40, 0xdd, 0x71, 0x6c, 0x26, 0x37, 0x66, 0xfc,
+ 0x66, 0xf3, 0xa4, 0x32, 0x07, 0x4d, 0x9e, 0xd2, 0xc1, 0x34, 0xf2, 0x81,
+ 0xe4, 0x15, 0x9a, 0xe2, 0x8f, 0xe5, 0xe6, 0xb9, 0xb2, 0x9a, 0x66, 0x55,
+ 0x7b, 0x1b, 0xa3, 0x3b, 0xae, 0x3f, 0x89, 0x99, 0xcf, 0x85, 0xf9, 0xf8,
+ 0x92, 0x44, 0x1d, 0x4e, 0x1a, 0xb5, 0x60, 0xce, 0xe8, 0xb5, 0x99, 0x2a,
+ 0x33, 0x3d, 0xb4, 0xb1, 0x68, 0xf6, 0xee, 0x93, 0xb7, 0x66, 0x0d, 0x59,
+ 0x3e, 0x78, 0xfb, 0x6f, 0x96, 0x35, 0xcd, 0x83, 0x33, 0xe7, 0x36, 0xd1,
+ 0xc1, 0x5e, 0xb0, 0x8f, 0x56, 0x3d, 0x6f, 0x96, 0xfe, 0x60, 0xbf, 0xfd,
+ 0xf0, 0xf7, 0x46, 0x6e, 0xba, 0x1d, 0x6c, 0xbe, 0xfe, 0x9f, 0xff, 0xe5,
+ 0x6d, 0x84, 0x3b, 0xfa, 0x6d, 0x5e, 0xdc, 0x96, 0x1f, 0xcc, 0xc0, 0x71,
+ 0xb1, 0xa5, 0xad, 0x49, 0x4d, 0x48, 0x34, 0xcc, 0x17, 0x8d, 0xbd, 0x31,
+ 0x68, 0x87, 0x98, 0x1f, 0x8d, 0xd3, 0xf1, 0xec, 0x3e, 0xb9, 0x49, 0x6f,
+ 0x33, 0x1a, 0xef, 0xc2, 0x6c, 0x1d, 0x9a, 0x01, 0x23, 0xc9, 0x67, 0x10,
+ 0x2d, 0x72, 0x56, 0xa7, 0xe5, 0x72, 0x6c, 0xce, 0xfb, 0xdf, 0x97, 0x65,
+ 0xc3, 0x13, 0x93, 0xde, 0x96, 0xf9, 0xb4, 0x75, 0x3d, 0xde, 0x64, 0x24,
+ 0x63, 0xe8, 0xc3, 0xb8, 0x37, 0x8c, 0x8c, 0xa3, 0x9e, 0x62, 0xef, 0xe7,
+ 0x0d, 0xdd, 0x40, 0x46, 0x3a, 0xa5, 0xb3, 0xba, 0x4c, 0x92, 0xeb, 0x92,
+ 0x36, 0x2e, 0x64, 0x22, 0x76, 0x9e, 0x59, 0x94, 0x9b, 0x94, 0x2e, 0x1a,
+ 0x73, 0xa7, 0xd8, 0xad, 0x59, 0x65, 0x10, 0x8f, 0x58, 0xa9, 0x74, 0xd6,
+ 0xe7, 0x0b, 0x85, 0xde, 0x91, 0xa9, 0x4a, 0x36, 0xff, 0x6d, 0xb3, 0x9f,
+ 0x6c, 0xfe, 0xfb, 0x26, 0x44, 0xfb, 0xe6, 0x9f, 0x37, 0xdd, 0x3a, 0x1b,
+ 0x0d, 0xe9, 0x36, 0x9f, 0xd2, 0xdd, 0x60, 0x46, 0x72, 0x72, 0x7e, 0xfb,
+ 0x3c, 0xf9, 0x07, 0x5d, 0xe7, 0x46, 0xfc, 0x65, 0x1f, 0x75, 0x93, 0xe8,
+ 0xd8, 0xcc, 0xdb, 0x89, 0x91, 0x83, 0xe9, 0x82, 0xee, 0xf5, 0xac, 0x9a,
+ 0x98, 0x1d, 0x95, 0x5e, 0x9b, 0x3d, 0x64, 0xae, 0x47, 0x6d, 0x8e, 0xda,
+ 0xa7, 0x57, 0x78, 0x58, 0x46, 0x66, 0x25, 0x45, 0x3a, 0x37, 0x9b, 0xf4,
+ 0x94, 0x7a, 0x94, 0x17, 0xe1, 0x62, 0xfe, 0x78, 0x95, 0x7d, 0xba, 0x7b,
+ 0x70, 0xf0, 0xe4, 0x4f, 0xfb, 0xcf, 0xb2, 0xe6, 0x66, 0xf7, 0xe7, 0x1d,
+ 0xfb, 0xc8, 0xc9, 0x15, 0xa6, 0x5d, 0xb7, 0x9f, 0x76, 0xc2, 0x5c, 0xbc,
+ 0x56, 0x70, 0x9b, 0xf7, 0xcd, 0xdf, 0xb3, 0xab, 0xfc, 0x63, 0x5f, 0x55,
+ 0x18, 0x3e, 0x06, 0xa9, 0xd9, 0x6a, 0x66, 0xfd, 0xe8, 0xd4, 0x6a, 0x73,
+ 0xd7, 0xcb, 0xac, 0x36, 0x33, 0x79, 0x77, 0x93, 0x36, 0x89, 0x6d, 0x80,
+ 0x57, 0x76, 0x9e, 0x5f, 0xdf, 0x34, 0xc9, 0x5d, 0x4a, 0xf2, 0xff, 0xa4,
+ 0xe1, 0x26, 0xe8, 0xe2, 0x35, 0x52, 0xff, 0x2a, 0x35, 0xe2, 0x9b, 0xd6,
+ 0x10, 0xb7, 0xec, 0xd8, 0x5d, 0xfa, 0x8d, 0xd9, 0xe6, 0xbc, 0x20, 0x4e,
+ 0xc3, 0x19, 0xa7, 0x35, 0x1d, 0xa4, 0xc2, 0x9c, 0xd7, 0xc6, 0x5c, 0xdb,
+ 0x4b, 0xfa, 0xd7, 0x8d, 0xb9, 0x98, 0x31, 0x07, 0xd2, 0x51, 0xdc, 0x5d,
+ 0xaf, 0x69, 0x39, 0x69, 0x6d, 0xec, 0x7d, 0x62, 0x16, 0xa9, 0x2f, 0xcb,
+ 0x6c, 0xdf, 0xa8, 0xcd, 0x81, 0x33, 0xc2, 0xc2, 0xee, 0x8c, 0x1e, 0xc9,
+ 0xbd, 0x1e, 0x8f, 0x13, 0x7d, 0x4c, 0x6b, 0xba, 0xbb, 0xf9, 0x86, 0x36,
+ 0x9d, 0xf7, 0x06, 0x6b, 0x26, 0x2d, 0xfd, 0x40, 0x5a, 0x42, 0x47, 0x17,
+ 0xc1, 0x6b, 0xd3, 0xd2, 0x6c, 0x32, 0xd3, 0x5b, 0x23, 0x1f, 0x69, 0x64,
+ 0x24, 0xf5, 0x30, 0x2b, 0xd8, 0xe4, 0xa6, 0x4d, 0xfa, 0x61, 0xde, 0x90,
+ 0xd8, 0x87, 0x62, 0x69, 0xfa, 0x6b, 0x26, 0x05, 0xba, 0xa1, 0x91, 0x9d,
+ 0xde, 0xf8, 0x71, 0x63, 0x99, 0x67, 0x93, 0x5b, 0xa3, 0x38, 0x18, 0x1d,
+ 0x31, 0xb3, 0x6f, 0xe1, 0x8a, 0x9d, 0x90, 0xba, 0x32, 0x33, 0xe7, 0x65,
+ 0x52, 0x56, 0x15, 0x29, 0xe1, 0xb4, 0x82, 0x63, 0x96, 0x6b, 0xf3, 0xcc,
+ 0xdc, 0xec, 0xfe, 0x74, 0xe6, 0x74, 0xc7, 0x18, 0xf9, 0x62, 0x54, 0x05,
+ 0x48, 0x10, 0x73, 0xa5, 0x43, 0x0c, 0x63, 0xe0, 0xe8, 0x1d, 0xb5, 0x3d,
+ 0x99, 0x64, 0x8b, 0xa6, 0x8e, 0x8d, 0x49, 0x17, 0xdc, 0x74, 0xa7, 0xca,
+ 0x68, 0xe6, 0x7d, 0x3d, 0x08, 0xf3, 0x6a, 0xef, 0x61, 0xa8, 0x42, 0xaa,
+ 0x5a, 0x18, 0xd5, 0xa8, 0xb6, 0xb3, 0xd6, 0x60, 0x6f, 0x18, 0x31, 0x86,
+ 0x39, 0x9f, 0x53, 0x47, 0xe9, 0xe1, 0x9a, 0x4f, 0x2a, 0xc4, 0x25, 0x2d,
+ 0x24, 0x2b, 0xbf, 0xfc, 0x5d, 0xba, 0x4d, 0xcc, 0x7c, 0xda, 0xc6, 0xcd,
+ 0x57, 0xed, 0x9a, 0xd2, 0xe7, 0x6b, 0x63, 0x36, 0x98, 0xcb, 0x75, 0x5a,
+ 0xdf, 0x18, 0x7d, 0xa8, 0x96, 0x93, 0x9d, 0xcf, 0xcd, 0x9e, 0xb9, 0xa5,
+ 0xf5, 0x5d, 0x64, 0xd9, 0x74, 0x98, 0x9c, 0x5d, 0x91, 0x54, 0xad, 0x4c,
+ 0xa7, 0x1b, 0xfc, 0x9a, 0x04, 0xbd, 0x99, 0xb7, 0x29, 0xf4, 0x6a, 0x7b,
+ 0xb4, 0xb8, 0x2b, 0x9e, 0xc4, 0xa6, 0x9d, 0x66, 0x26, 0x3b, 0x21, 0x29,
+ 0x37, 0x6b, 0xdf, 0x0a, 0x38, 0x87, 0x46, 0x7a, 0x53, 0xf7, 0xc6, 0x59,
+ 0x82, 0x9d, 0x38, 0xce, 0x9a, 0xbb, 0x2c, 0xb3, 0xcd, 0xd5, 0x99, 0xb9,
+ 0x89, 0x68, 0xd1, 0x58, 0x19, 0x83, 0x30, 0xa4, 0xa9, 0x3d, 0xbf, 0x38,
+ 0xfb, 0xfa, 0xe2, 0x78, 0x34, 0x4a, 0xde, 0x1c, 0x5f, 0x1e, 0x5f, 0xb4,
+ 0x66, 0xba, 0x28, 0xab, 0x39, 0x56, 0x74, 0x9a, 0xd7, 0x8b, 0x59, 0x7a,
+ 0x4f, 0x4b, 0x6d, 0x46, 0x72, 0x5d, 0xd1, 0xc9, 0x9a, 0x67, 0x74, 0x2b,
+ 0x4c, 0x97, 0x90, 0x64, 0x49, 0x69, 0xe4, 0x43, 0x2a, 0x4a, 0x28, 0x09,
+ 0x13, 0x68, 0xae, 0xc5, 0xb5, 0x9b, 0x69, 0x23, 0x71, 0xe4, 0x72, 0xa3,
+ 0xdb, 0xcd, 0xae, 0x07, 0x69, 0x83, 0xb0, 0x37, 0xfa, 0xee, 0x67, 0x3c,
+ 0x4d, 0x35, 0xc6, 0x64, 0xf6, 0x6c, 0x3e, 0x87, 0xb0, 0x33, 0x7f, 0x3a,
+ 0x05, 0x30, 0xbb, 0x32, 0xda, 0xaf, 0xb9, 0xf0, 0x58, 0x79, 0xef, 0xf6,
+ 0x49, 0x7b, 0x6b, 0x55, 0x56, 0xb3, 0x0d, 0x49, 0x34, 0x53, 0x83, 0xdc,
+ 0x15, 0xfe, 0x82, 0x15, 0x62, 0x46, 0x4d, 0x20, 0xd9, 0x27, 0x8f, 0x2d,
+ 0xa8, 0x0b, 0x99, 0x59, 0xd9, 0x29, 0x37, 0x5f, 0x2f, 0xaf, 0x70, 0x90,
+ 0x93, 0x2d, 0xa3, 0x2c, 0xbf, 0x31, 0x06, 0x8c, 0x31, 0x22, 0xfa, 0xc9,
+ 0xf9, 0x36, 0xde, 0xdb, 0xdb, 0xdd, 0x7f, 0xca, 0x82, 0x60, 0xa8, 0xcd,
+ 0xbd, 0xf6, 0x04, 0xf1, 0xde, 0x07, 0x5a, 0x5e, 0x7e, 0x88, 0x1a, 0x1f,
+ 0x26, 0x7b, 0x6f, 0xf8, 0x27, 0x4f, 0x3f, 0x7d, 0xf6, 0xc9, 0x73, 0xf9,
+ 0x61, 0x7b, 0x83, 0xdb, 0xfe, 0x63, 0x77, 0xc0, 0x18, 0x23, 0xeb, 0xcc,
+ 0xf4, 0xc4, 0x8c, 0x6e, 0x9e, 0x17, 0xe6, 0x98, 0x98, 0x63, 0x25, 0xb2,
+ 0x8a, 0xf6, 0xb3, 0xe9, 0xfc, 0x15, 0x4b, 0x36, 0x59, 0xd7, 0xb6, 0x95,
+ 0x67, 0x5e, 0x36, 0x5b, 0xd6, 0xc8, 0x72, 0xbb, 0x48, 0x98, 0x09, 0x73,
+ 0xc0, 0xe8, 0xd6, 0x19, 0x93, 0x80, 0x25, 0x53, 0xc7, 0xe8, 0xa4, 0x59,
+ 0xf4, 0x6b, 0xf6, 0x56, 0x34, 0x6f, 0x98, 0xbe, 0x99, 0x3b, 0x91, 0xae,
+ 0xb9, 0x70, 0xde, 0x8d, 0x28, 0x80, 0x84, 0xbc, 0xcb, 0x6b, 0x88, 0x86,
+ 0xbb, 0x72, 0x39, 0x33, 0x86, 0x05, 0x3d, 0xb0, 0x5c, 0xe0, 0x05, 0xf3,
+ 0xa9, 0x85, 0x93, 0x01, 0xf3, 0xfc, 0x23, 0xed, 0x9d, 0x6e, 0x2b, 0xa6,
+ 0x6b, 0xe6, 0x9f, 0x0b, 0xb3, 0x95, 0xb8, 0x3b, 0xc3, 0xee, 0x0d, 0x01,
+ 0xd9, 0x17, 0xec, 0x44, 0x3a, 0xf3, 0x10, 0xda, 0xe7, 0x67, 0xa3, 0x4b,
+ 0xd2, 0x00, 0xce, 0xdf, 0x5d, 0x9a, 0x86, 0x8c, 0x0a, 0x50, 0x37, 0x66,
+ 0x53, 0xd2, 0x8b, 0x45, 0x06, 0xab, 0x4e, 0x9b, 0x33, 0x7b, 0x2f, 0x87,
+ 0xa0, 0x82, 0x5a, 0xa3, 0x9f, 0xe4, 0x3e, 0xb2, 0xd9, 0x4b, 0x47, 0x50,
+ 0x8d, 0x5e, 0xbe, 0xc3, 0xed, 0x3b, 0xc9, 0xd6, 0x17, 0xdb, 0x66, 0xcf,
+ 0x0e, 0x4a, 0x3b, 0x3b, 0x83, 0x81, 0xbc, 0x6a, 0xbe, 0x5d, 0xe7, 0xf3,
+ 0x7c, 0x96, 0x7a, 0xea, 0x95, 0x48, 0x54, 0x3a, 0x9f, 0x56, 0xae, 0x4c,
+ 0xcc, 0xae, 0x41, 0xb7, 0x9d, 0x75, 0x47, 0x73, 0x08, 0xa9, 0xe4, 0x96,
+ 0x6a, 0x4a, 0x0a, 0x01, 0x94, 0xd8, 0x45, 0x6e, 0xa7, 0x8e, 0xd6, 0x8c,
+ 0xc4, 0x55, 0x6b, 0xa2, 0xba, 0xeb, 0x16, 0x4c, 0x1c, 0xdd, 0x48, 0x70,
+ 0x1f, 0xd8, 0xa9, 0x4b, 0x7a, 0xe3, 0xb4, 0xea, 0x25, 0x56, 0x16, 0xf3,
+ 0xd9, 0xa4, 0x13, 0x52, 0x65, 0xd7, 0x4b, 0x33, 0x82, 0x84, 0x67, 0x97,
+ 0x46, 0xfa, 0x47, 0x6f, 0xa4, 0xda, 0xc0, 0x60, 0x4c, 0x8f, 0xe4, 0x35,
+ 0x5b, 0x7e, 0x57, 0xc6, 0x94, 0xa0, 0x43, 0xa3, 0x9a, 0x2d, 0x34, 0x1a,
+ 0xd9, 0x31, 0x91, 0x0d, 0x63, 0x77, 0x69, 0x49, 0x47, 0xa5, 0xc9, 0x8c,
+ 0xa0, 0x81, 0xf8, 0xa7, 0x27, 0x07, 0x66, 0xc9, 0x06, 0x83, 0xda, 0xcc,
+ 0x3f, 0xa9, 0xc3, 0x0b, 0x31, 0xb3, 0xcf, 0xe0, 0xc3, 0xb0, 0x0e, 0x8f,
+ 0x33, 0x76, 0x75, 0xf0, 0xb5, 0xc9, 0xef, 0x42, 0x84, 0x1a, 0x45, 0xf5,
+ 0xce, 0x7c, 0x38, 0x35, 0x4b, 0x66, 0x0e, 0xdc, 0x1b, 0x9a, 0x28, 0x76,
+ 0x57, 0x24, 0xd2, 0x54, 0x9d, 0x60, 0x67, 0xe4, 0x74, 0xee, 0x53, 0xa7,
+ 0xcb, 0x4c, 0xa7, 0x39, 0xfd, 0xd6, 0x9c, 0x2f, 0x73, 0xc3, 0x2d, 0x33,
+ 0x98, 0x03, 0x32, 0xa9, 0x73, 0x37, 0x99, 0xb0, 0x2c, 0xeb, 0x9b, 0x92,
+ 0x2c, 0xb7, 0x1e, 0xcb, 0xe2, 0x01, 0x7d, 0xab, 0x87, 0xfb, 0x7c, 0x9e,
+ 0xe8, 0xb7, 0xe4, 0x53, 0x66, 0x1c, 0x53, 0x5f, 0x37, 0xeb, 0x9b, 0x8b,
+ 0xe6, 0xde, 0xd3, 0xdb, 0x21, 0xab, 0xb9, 0xef, 0x95, 0x55, 0x78, 0xcc,
+ 0x95, 0xba, 0x20, 0x65, 0x4a, 0x64, 0x38, 0x2e, 0x43, 0x1c, 0xd9, 0x9a,
+ 0xbb, 0xd6, 0x37, 0x73, 0x4b, 0x4f, 0x5e, 0xdf, 0xe8, 0xa3, 0xde, 0xc5,
+ 0x9a, 0x9a, 0xc1, 0xd1, 0xe5, 0x40, 0x26, 0xee, 0x54, 0xe5, 0x7e, 0x59,
+ 0xb1, 0x30, 0x9b, 0x95, 0x66, 0x2f, 0xf7, 0x58, 0x65, 0x95, 0x6e, 0x53,
+ 0xaf, 0xa9, 0x97, 0x34, 0xe3, 0xec, 0xfa, 0x29, 0xed, 0xda, 0xd8, 0x4e,
+ 0xcb, 0x7c, 0xd5, 0x0f, 0x76, 0xcd, 0x4d, 0xd4, 0x08, 0x73, 0x64, 0xae,
+ 0xce, 0x9a, 0xf6, 0xb1, 0xce, 0x3c, 0xb6, 0xb7, 0xb9, 0xea, 0x36, 0x1b,
+ 0x3e, 0x8f, 0x30, 0x7b, 0x3a, 0x33, 0x5f, 0x63, 0xfb, 0xc8, 0x45, 0x66,
+ 0x47, 0x66, 0x46, 0x34, 0xcd, 0x53, 0xec, 0x13, 0x5e, 0x1a, 0x28, 0x23,
+ 0xce, 0x48, 0x8b, 0xe8, 0xc1, 0xf7, 0x5d, 0x1b, 0x6b, 0x36, 0xf3, 0xaf,
+ 0x24, 0xed, 0xd3, 0xe0, 0xcc, 0x8c, 0xfd, 0x14, 0xe3, 0x18, 0xdc, 0x26,
+ 0x74, 0xfc, 0x8c, 0xd9, 0x40, 0x67, 0x71, 0x70, 0x76, 0x7a, 0xeb, 0x1d,
+ 0x23, 0x32, 0xa6, 0x0b, 0xd2, 0x53, 0xfa, 0x70, 0x58, 0x8c, 0xcb, 0xd2,
+ 0x58, 0xae, 0x6e, 0x68, 0x74, 0x1f, 0x64, 0x05, 0xed, 0x76, 0x59, 0x51,
+ 0x23, 0x12, 0x16, 0x56, 0xde, 0xde, 0x1b, 0x73, 0x29, 0xbd, 0x4e, 0x73,
+ 0xbb, 0xdf, 0xe4, 0x64, 0x4c, 0x13, 0x7d, 0xb8, 0x28, 0xe5, 0x79, 0x5a,
+ 0x2a, 0x52, 0x81, 0x44, 0x6e, 0x2d, 0x6b, 0x3e, 0x3e, 0x66, 0x54, 0x46,
+ 0xf2, 0x40, 0x76, 0x48, 0xbb, 0xa4, 0x36, 0x6a, 0x73, 0x63, 0x28, 0xca,
+ 0xa4, 0x73, 0x42, 0xf8, 0x42, 0x83, 0x34, 0x2d, 0xf6, 0x86, 0xc9, 0x37,
+ 0xe5, 0x5d, 0x06, 0xf7, 0x1d, 0xf4, 0xfb, 0x9c, 0x1c, 0x50, 0x46, 0x15,
+ 0xbc, 0xcb, 0x92, 0xb9, 0x51, 0x3d, 0xcd, 0x6c, 0x42, 0xfb, 0xc0, 0xcf,
+ 0x4c, 0x3f, 0x9d, 0xcd, 0x52, 0xde, 0xf1, 0x2c, 0xd9, 0x51, 0xd8, 0xa5,
+ 0xbc, 0xe2, 0x23, 0x91, 0x6c, 0x41, 0xbd, 0x99, 0xd0, 0x6c, 0x2d, 0x1a,
+ 0x37, 0x0a, 0x3b, 0x21, 0x77, 0x69, 0xed, 0x1d, 0x2e, 0x36, 0x4e, 0x93,
+ 0x4f, 0x86, 0x7b, 0x9f, 0x0d, 0x77, 0x87, 0x64, 0x8a, 0x64, 0xb7, 0x79,
+ 0xb9, 0xac, 0x69, 0x3d, 0xa9, 0x27, 0xde, 0xe9, 0x24, 0x37, 0x11, 0x2d,
+ 0xef, 0xf5, 0xf5, 0x8c, 0x15, 0x9f, 0x9d, 0xf2, 0xea, 0x2a, 0xf1, 0x94,
+ 0xa3, 0x2a, 0x5b, 0xb0, 0x0d, 0x44, 0x73, 0x23, 0x07, 0x8e, 0x85, 0xaa,
+ 0xaf, 0x15, 0xc9, 0x6c, 0x3a, 0x8f, 0xc2, 0x60, 0x90, 0x8e, 0xeb, 0x86,
+ 0xcc, 0xa9, 0xc1, 0xb2, 0xc8, 0x3f, 0x0e, 0xea, 0x72, 0xf2, 0xc1, 0x2c,
+ 0xcb, 0x8b, 0x45, 0xda, 0xdc, 0x7c, 0xd1, 0xf1, 0xd4, 0x6e, 0xd1, 0x6d,
+ 0xb2, 0x9d, 0x24, 0x47, 0xac, 0x58, 0xd2, 0x5c, 0x54, 0x7c, 0xe2, 0xcc,
+ 0x7a, 0x4a, 0x2b, 0xc9, 0x3b, 0xd3, 0x8a, 0xd9, 0xcd, 0x73, 0xb3, 0xac,
+ 0x09, 0x37, 0xd6, 0x57, 0x61, 0xda, 0x69, 0x0e, 0x5e, 0x40, 0xba, 0x48,
+ 0xe0, 0x4c, 0x33, 0x87, 0xa7, 0xac, 0x3e, 0x0c, 0xc9, 0x6d, 0x61, 0xac,
+ 0xc6, 0x03, 0xda, 0xd0, 0x8d, 0x11, 0x63, 0x0d, 0xcf, 0x7b, 0x2d, 0x42,
+ 0x98, 0xba, 0xc5, 0x32, 0xd9, 0x49, 0x29, 0x9d, 0x4f, 0xed, 0x81, 0x7c,
+ 0x36, 0x51, 0x7b, 0x43, 0xb6, 0xde, 0xe6, 0x97, 0xc6, 0x02, 0xbc, 0xe1,
+ 0x85, 0x47, 0x63, 0x3c, 0x46, 0xb3, 0x47, 0xaf, 0x8d, 0x0d, 0x51, 0x34,
+ 0x9d, 0xe6, 0xcc, 0x57, 0xe9, 0xb2, 0xa6, 0x7b, 0x86, 0xcd, 0x5d, 0x6c,
+ 0x13, 0x71, 0xcb, 0x58, 0x0b, 0x74, 0xb8, 0xd1, 0x79, 0xed, 0x50, 0x57,
+ 0xf5, 0x93, 0xe1, 0xb3, 0x27, 0x66, 0x51, 0xfd, 0x89, 0x2e, 0xee, 0xc9,
+ 0x9d, 0x19, 0x9f, 0xd4, 0x4b, 0x73, 0x97, 0xd6, 0xac, 0x9e, 0x98, 0x33,
+ 0x7c, 0x95, 0x5f, 0x2f, 0xab, 0x8c, 0x2f, 0x35, 0x78, 0x40, 0xd5, 0xf1,
+ 0x49, 0xf7, 0xc4, 0x4d, 0x09, 0x7f, 0xa1, 0x91, 0x2f, 0xd9, 0xec, 0xaa,
+ 0xdf, 0x9d, 0x05, 0xd2, 0xe8, 0x68, 0x0b, 0x60, 0x88, 0xd8, 0x44, 0x46,
+ 0x73, 0x43, 0x63, 0x45, 0x26, 0xf7, 0xfa, 0xdc, 0x4c, 0x70, 0x42, 0x0e,
+ 0xb3, 0x64, 0x32, 0x4b, 0xf3, 0x39, 0xcc, 0x1d, 0x71, 0x08, 0x0d, 0x3b,
+ 0xcd, 0x5d, 0x8a, 0x3a, 0x0e, 0x4d, 0x7c, 0x4c, 0xd6, 0x40, 0x55, 0x93,
+ 0xb0, 0xa2, 0x49, 0x48, 0x55, 0x99, 0x60, 0x5d, 0xfb, 0x26, 0x9b, 0x7c,
+ 0xd0, 0xd5, 0xd4, 0x5b, 0x78, 0xd0, 0x69, 0x8e, 0x3c, 0xa1, 0x30, 0x39,
+ 0xcc, 0x53, 0x4b, 0xb3, 0xa6, 0x8b, 0xb2, 0xae, 0x73, 0xf2, 0x28, 0x90,
+ 0x86, 0xbc, 0x9c, 0x40, 0x71, 0x26, 0x13, 0xfb, 0xa3, 0x59, 0x49, 0xdd,
+ 0x12, 0x89, 0xd9, 0x63, 0xc5, 0x74, 0xd0, 0x54, 0xf9, 0x62, 0x55, 0xef,
+ 0xf8, 0xca, 0x68, 0xdf, 0xd9, 0xb5, 0x18, 0x31, 0xb0, 0x0f, 0xd8, 0x62,
+ 0x98, 0x24, 0x9d, 0xd9, 0xec, 0x34, 0xc7, 0x73, 0xdb, 0x27, 0x13, 0x39,
+ 0x37, 0x22, 0x94, 0xf5, 0x47, 0x78, 0x80, 0x8c, 0xb6, 0x28, 0x67, 0xd9,
+ 0x28, 0xb6, 0xf9, 0x04, 0xf7, 0x42, 0x7e, 0x9d, 0x91, 0xc7, 0xd9, 0x1c,
+ 0xef, 0x66, 0x66, 0x6e, 0x0b, 0x4f, 0x50, 0xd8, 0x15, 0x2f, 0xb2, 0xeb,
+ 0xb2, 0x21, 0x01, 0x1d, 0x6c, 0x93, 0x77, 0xd8, 0xf8, 0x76, 0x4f, 0xa8,
+ 0x26, 0xe4, 0x5f, 0x53, 0x39, 0xab, 0x28, 0xe6, 0xd3, 0xac, 0x09, 0x89,
+ 0x11, 0x56, 0x37, 0x66, 0x07, 0x76, 0x57, 0xdd, 0xb4, 0x36, 0xc9, 0xa0,
+ 0x8e, 0xe2, 0x2e, 0xd5, 0xab, 0x5c, 0x75, 0xa0, 0x31, 0x99, 0x6c, 0x64,
+ 0x1e, 0xdf, 0xe5, 0x93, 0x4c, 0x3d, 0x14, 0xe2, 0x49, 0x9b, 0xe5, 0xe1,
+ 0xde, 0x9f, 0x2f, 0x6b, 0x58, 0x4d, 0xac, 0xa6, 0x90, 0x41, 0x79, 0x97,
+ 0x93, 0x1a, 0x73, 0x72, 0x25, 0x67, 0x95, 0x6e, 0x51, 0x3e, 0x1f, 0x69,
+ 0x95, 0xc3, 0x7a, 0x36, 0xcd, 0x49, 0x3f, 0x3d, 0x23, 0x47, 0xed, 0x36,
+ 0xd7, 0x6f, 0xbc, 0x2f, 0x9a, 0x9d, 0xd3, 0xe8, 0x60, 0x48, 0x5e, 0xa5,
+ 0xf9, 0x2c, 0x32, 0x4f, 0x50, 0x50, 0x8d, 0x45, 0x7a, 0x93, 0x55, 0xb2,
+ 0x06, 0x4b, 0x9a, 0x74, 0x8a, 0x0e, 0x04, 0x4f, 0x8f, 0xb2, 0x8c, 0x55,
+ 0x2c, 0xe8, 0x63, 0x1f, 0xef, 0xed, 0xf4, 0xe2, 0x1e, 0xe3, 0xb5, 0x93,
+ 0xbf, 0xf3, 0xf2, 0x79, 0xc7, 0x33, 0xa5, 0x56, 0xd3, 0x05, 0xb9, 0xc1,
+ 0xbb, 0x27, 0x94, 0xb4, 0x51, 0x8a, 0xa4, 0x6c, 0xab, 0x53, 0x4d, 0x9c,
+ 0x8a, 0x85, 0x8d, 0x40, 0x40, 0x38, 0x90, 0xc3, 0x5f, 0x8e, 0x30, 0xb7,
+ 0x23, 0x9a, 0x52, 0xa7, 0x39, 0xa3, 0x9a, 0x91, 0x9f, 0x10, 0x46, 0x78,
+ 0x6b, 0xc7, 0x1a, 0x83, 0xb8, 0xb2, 0x7e, 0x70, 0x72, 0x82, 0xd1, 0x7c,
+ 0xab, 0xee, 0x89, 0x33, 0x8b, 0x97, 0x3a, 0xcd, 0x91, 0x36, 0x4c, 0xaa,
+ 0x83, 0x39, 0x34, 0x39, 0xed, 0x47, 0x6c, 0x02, 0x75, 0x85, 0x9a, 0xed,
+ 0xcb, 0x9e, 0x31, 0x95, 0xab, 0xac, 0x6c, 0xa0, 0xbb, 0x57, 0xb3, 0xf4,
+ 0xda, 0xec, 0xbb, 0x4e, 0x73, 0xf9, 0xb5, 0xb1, 0x71, 0x39, 0x20, 0x51,
+ 0x97, 0xe6, 0xf6, 0xa0, 0x71, 0x8b, 0xbd, 0x6f, 0xcc, 0x3d, 0xb3, 0xcd,
+ 0x66, 0x4b, 0x48, 0xc0, 0x33, 0x33, 0xc0, 0xd1, 0xe8, 0x9b, 0x6d, 0x5f,
+ 0xc0, 0x61, 0x7e, 0x1f, 0x23, 0xde, 0x20, 0x9f, 0x60, 0x9a, 0x24, 0x5f,
+ 0x61, 0x4d, 0xba, 0x52, 0x8e, 0x57, 0x3a, 0x32, 0x79, 0x3a, 0x11, 0xe4,
+ 0x22, 0x1a, 0x8a, 0x00, 0x80, 0x04, 0xc0, 0x34, 0xa9, 0xb7, 0x8a, 0x77,
+ 0x38, 0x79, 0x11, 0xf8, 0x9a, 0x36, 0x7f, 0x5b, 0xd6, 0x4b, 0x32, 0xdc,
+ 0x3b, 0xcd, 0x2d, 0x8c, 0x20, 0x6b, 0x8c, 0xf1, 0x66, 0x24, 0xd2, 0xb2,
+ 0xa0, 0x3f, 0xad, 0x76, 0x91, 0x43, 0xcf, 0xa5, 0x25, 0xa9, 0xc8, 0x39,
+ 0x48, 0x16, 0x82, 0xbd, 0x9b, 0x8d, 0x68, 0x91, 0x96, 0xbb, 0x4b, 0x0b,
+ 0xf7, 0x09, 0x05, 0x2f, 0x20, 0x76, 0xa6, 0x39, 0x05, 0xbe, 0xe8, 0xe0,
+ 0xad, 0x90, 0xe2, 0x5b, 0xf5, 0xd2, 0xc8, 0x19, 0xd2, 0xaa, 0x58, 0x88,
+ 0x04, 0x02, 0x44, 0x85, 0x8c, 0x51, 0xe0, 0x3c, 0x69, 0xb2, 0xfd, 0x5b,
+ 0x1f, 0x13, 0x2c, 0x9c, 0xbf, 0x92, 0x13, 0xa3, 0xcf, 0x1a, 0x4d, 0xf5,
+ 0x05, 0xed, 0xb7, 0x40, 0x0b, 0xb8, 0x3c, 0x1d, 0xc5, 0x16, 0xb4, 0xed,
+ 0x4c, 0xa7, 0xf7, 0x49, 0xe4, 0x92, 0x7f, 0x85, 0xfd, 0x4d, 0x25, 0x69,
+ 0x4b, 0x46, 0xe5, 0x0c, 0xe6, 0x8c, 0xae, 0xf5, 0xcc, 0x74, 0x53, 0x0c,
+ 0x09, 0x0e, 0xd4, 0x91, 0x18, 0x33, 0x6a, 0x54, 0x43, 0x6a, 0x84, 0xf5,
+ 0x2d, 0x1d, 0x1d, 0xfa, 0xed, 0xc2, 0x99, 0xd4, 0xdd, 0x20, 0xde, 0xef,
+ 0xb7, 0xea, 0x6d, 0x2b, 0xc9, 0x4c, 0x2b, 0xe7, 0xc7, 0x6f, 0xa0, 0xd8,
+ 0xa7, 0x66, 0xe3, 0xbc, 0x55, 0x3f, 0x8e, 0xc6, 0xe1, 0xc6, 0xcb, 0x7c,
+ 0xd6, 0x72, 0x96, 0x3a, 0x5b, 0x04, 0x41, 0x30, 0xde, 0x57, 0xe8, 0x1a,
+ 0xbb, 0xfd, 0x73, 0xf8, 0xcd, 0xba, 0xbb, 0xac, 0xb9, 0x5f, 0x88, 0xcb,
+ 0x6f, 0x59, 0xb7, 0x2c, 0x6b, 0xbd, 0x9d, 0x67, 0x0d, 0x94, 0x0f, 0x52,
+ 0xf8, 0xbd, 0x36, 0x83, 0x15, 0x42, 0xb7, 0xe8, 0x32, 0xb8, 0x2e, 0xf2,
+ 0x7f, 0x88, 0x6f, 0x21, 0x2b, 0x6e, 0xf3, 0xaa, 0x2c, 0x48, 0x55, 0x31,
+ 0x36, 0x41, 0x95, 0x43, 0x38, 0x93, 0xba, 0x6b, 0xc4, 0xc7, 0xe6, 0xd1,
+ 0xbb, 0x8b, 0xd3, 0xf7, 0x47, 0x87, 0xef, 0xbf, 0x7a, 0xf7, 0xf6, 0xd5,
+ 0xe9, 0xf1, 0x66, 0xf7, 0x50, 0x5f, 0xb1, 0x58, 0xa0, 0x83, 0x52, 0x93,
+ 0x42, 0x86, 0x13, 0x62, 0xba, 0xc8, 0x2d, 0x5f, 0xe7, 0xb7, 0x46, 0xac,
+ 0x41, 0xb5, 0x82, 0xf3, 0x12, 0x7f, 0x83, 0xb9, 0x2f, 0x13, 0xde, 0x69,
+ 0x6e, 0x6c, 0xee, 0x63, 0xd3, 0x69, 0x3e, 0x7d, 0x32, 0x78, 0x3d, 0x29,
+ 0x62, 0xce, 0x68, 0x07, 0x83, 0x91, 0xd1, 0x12, 0xd3, 0x65, 0x42, 0x2a,
+ 0x9d, 0xa7, 0x3d, 0x7b, 0x7e, 0xcc, 0x65, 0x63, 0x94, 0x47, 0xf5, 0x9c,
+ 0x1a, 0xeb, 0xac, 0xfc, 0xa0, 0x11, 0x51, 0xa3, 0x79, 0x1e, 0x46, 0x96,
+ 0xbb, 0xe6, 0x75, 0xe1, 0xa9, 0xd8, 0xa4, 0x96, 0xcc, 0xfe, 0x1d, 0x48,
+ 0x27, 0x27, 0x55, 0x63, 0xd4, 0xbe, 0x2c, 0xc7, 0xc1, 0xd0, 0x90, 0x0f,
+ 0xa9, 0xc5, 0xf0, 0x5a, 0x74, 0xf5, 0x13, 0x63, 0x14, 0xde, 0xd3, 0x1c,
+ 0x50, 0x23, 0xc3, 0xec, 0x63, 0x86, 0x93, 0x27, 0x6f, 0x1d, 0x2d, 0x2b,
+ 0x9c, 0xe5, 0xef, 0x8d, 0x4e, 0x42, 0x12, 0xf0, 0x15, 0xdc, 0x1e, 0xe6,
+ 0x05, 0x7d, 0xc8, 0x5c, 0x36, 0xdd, 0x8b, 0xaf, 0x9c, 0x4d, 0xc9, 0xbd,
+ 0x00, 0x13, 0x13, 0x0e, 0x81, 0xf3, 0xc3, 0xcb, 0x6f, 0x82, 0x39, 0x21,
+ 0x31, 0xef, 0xe0, 0x07, 0xb2, 0x15, 0x61, 0x18, 0xd5, 0x8d, 0x1c, 0x90,
+ 0xb7, 0xa3, 0x51, 0x82, 0xe0, 0xf6, 0x2c, 0x1f, 0x57, 0x29, 0x7d, 0x93,
+ 0x7e, 0x4c, 0x3f, 0x35, 0xdb, 0xba, 0xd3, 0xdc, 0xf9, 0xb7, 0x47, 0xa3,
+ 0x3f, 0xee, 0xed, 0x19, 0xe5, 0x6f, 0xba, 0x34, 0xf3, 0xb2, 0x65, 0x5e,
+ 0x29, 0x6a, 0x73, 0x32, 0xe7, 0xc3, 0xba, 0xdc, 0xc6, 0xe5, 0x0d, 0x8d,
+ 0x0f, 0xd7, 0x43, 0x7a, 0x6b, 0x6e, 0x5d, 0xec, 0x24, 0x9e, 0x63, 0xda,
+ 0xcf, 0x5d, 0x35, 0x9d, 0x17, 0x58, 0x63, 0xff, 0x46, 0x62, 0x98, 0x7b,
+ 0x7b, 0x76, 0x1f, 0x8c, 0x62, 0x2b, 0x3f, 0x1b, 0x49, 0xe4, 0x3c, 0x9d,
+ 0x98, 0xbf, 0x92, 0x0d, 0xb5, 0x4d, 0x63, 0x6b, 0x9f, 0x31, 0x1d, 0xd7,
+ 0x88, 0xb5, 0xd2, 0x4b, 0x72, 0x71, 0x22, 0xe0, 0x1f, 0xca, 0x85, 0xa2,
+ 0x7b, 0xbc, 0x1c, 0xa8, 0x02, 0x9d, 0x1d, 0xa7, 0x93, 0x0f, 0x77, 0x69,
+ 0x35, 0x65, 0x87, 0x89, 0xd9, 0x33, 0xe3, 0x7c, 0x96, 0x37, 0xf7, 0x7c,
+ 0x7b, 0x74, 0x47, 0xc1, 0xa1, 0x23, 0x9a, 0x42, 0x73, 0x92, 0xae, 0x8d,
+ 0x2d, 0x44, 0x5a, 0x28, 0x59, 0x88, 0xe6, 0x60, 0x78, 0xba, 0x3e, 0x54,
+ 0xa5, 0xc6, 0xaa, 0x3a, 0xf6, 0xdb, 0x9d, 0xe6, 0xe0, 0x7e, 0xa2, 0x93,
+ 0x84, 0x6e, 0xba, 0xdd, 0xab, 0x82, 0xd0, 0x17, 0x53, 0xba, 0x81, 0x92,
+ 0xfa, 0xde, 0xdc, 0xf6, 0xf3, 0x24, 0xa2, 0x2a, 0x02, 0xeb, 0x90, 0x7c,
+ 0x9b, 0xdd, 0x1b, 0xc3, 0x22, 0x2f, 0x9c, 0xac, 0x64, 0x1f, 0x51, 0x46,
+ 0x96, 0x2a, 0xeb, 0xa4, 0xb9, 0xfa, 0x19, 0x33, 0x71, 0x15, 0xf3, 0x4d,
+ 0x12, 0x5a, 0x56, 0xfc, 0xbe, 0xea, 0xe3, 0xd4, 0xc4, 0x66, 0xdd, 0x12,
+ 0xca, 0xf8, 0x52, 0x6c, 0x2b, 0x06, 0x17, 0x27, 0x5c, 0x26, 0x1c, 0x13,
+ 0x26, 0x97, 0x73, 0xcd, 0x7b, 0x6f, 0x96, 0xd6, 0x0d, 0x6c, 0x0a, 0x8c,
+ 0x5b, 0x3c, 0x13, 0xed, 0x3b, 0x04, 0x72, 0xe4, 0x85, 0x39, 0x68, 0xff,
+ 0xfc, 0x15, 0xc2, 0xc7, 0x15, 0xc7, 0x33, 0x94, 0xaa, 0x32, 0x57, 0xad,
+ 0xab, 0xe4, 0x8d, 0xde, 0x19, 0xd4, 0x09, 0xeb, 0x3d, 0x59, 0x70, 0xac,
+ 0x8f, 0xd5, 0x1b, 0x76, 0x03, 0x85, 0xea, 0x2a, 0x59, 0xf2, 0xe2, 0x2d,
+ 0x38, 0xe8, 0x25, 0x5b, 0xd9, 0xf0, 0xda, 0xb4, 0xd7, 0xa3, 0x76, 0xf6,
+ 0x0e, 0xe8, 0xbf, 0xfb, 0xf8, 0xef, 0x93, 0x9e, 0x02, 0x65, 0xfc, 0xa5,
+ 0xa6, 0xfb, 0xa6, 0x2b, 0x2d, 0xc5, 0x95, 0x4e, 0xf7, 0x8f, 0x5c, 0x40,
+ 0x22, 0x80, 0x49, 0x2e, 0xc7, 0x0f, 0x07, 0x6b, 0x57, 0xa7, 0xfd, 0x88,
+ 0x06, 0xe4, 0x26, 0x02, 0x77, 0x1b, 0x6c, 0xd3, 0x31, 0xb9, 0x9d, 0xcc,
+ 0xd8, 0x26, 0x46, 0x83, 0x81, 0x07, 0x80, 0x03, 0x53, 0x34, 0x1d, 0x93,
+ 0xf7, 0x55, 0x76, 0x93, 0xd6, 0x46, 0x99, 0x5a, 0x36, 0x38, 0x1d, 0x5d,
+ 0xcb, 0xc1, 0x1c, 0xa9, 0x59, 0x6e, 0x5d, 0x2e, 0xf2, 0xe1, 0xa1, 0x35,
+ 0x50, 0x64, 0x15, 0xd9, 0x79, 0x39, 0x2b, 0xef, 0xf4, 0x89, 0x81, 0x20,
+ 0x57, 0x62, 0x17, 0x97, 0x59, 0x4d, 0x80, 0x5f, 0xe8, 0x31, 0x3f, 0x08,
+ 0x35, 0x27, 0x6d, 0x87, 0x60, 0x35, 0xe6, 0x08, 0x5e, 0x99, 0x19, 0x23,
+ 0xcb, 0x63, 0x86, 0x75, 0x23, 0x1b, 0x0b, 0xbd, 0x0e, 0x34, 0x20, 0xd1,
+ 0x44, 0xf2, 0x2b, 0x71, 0xbc, 0xc8, 0xbf, 0x21, 0xf1, 0x45, 0x3f, 0xa8,
+ 0x39, 0x50, 0xd5, 0x55, 0x0e, 0x1e, 0xde, 0xda, 0x7a, 0x80, 0xed, 0x5d,
+ 0x2c, 0x83, 0x65, 0x5f, 0xa7, 0xee, 0x6b, 0xd1, 0x88, 0x63, 0x86, 0xb6,
+ 0xe9, 0x15, 0xc7, 0x0c, 0x7e, 0xfd, 0x21, 0x31, 0x3d, 0x1e, 0x90, 0x9b,
+ 0x63, 0x59, 0x3f, 0xe2, 0x8c, 0x78, 0x42, 0x81, 0xdf, 0xb1, 0x8e, 0x1e,
+ 0x0e, 0xc8, 0xf9, 0x13, 0xd0, 0xdd, 0x85, 0xf7, 0x9e, 0xb3, 0xe5, 0xc8,
+ 0x3b, 0x59, 0x23, 0x6e, 0xe8, 0x42, 0x4c, 0xf9, 0xad, 0xf4, 0x43, 0x3a,
+ 0x4c, 0xce, 0x8e, 0x46, 0xe7, 0xf4, 0x09, 0xb3, 0x35, 0x8a, 0x6b, 0xd3,
+ 0x8b, 0xd3, 0x51, 0xa7, 0x39, 0x63, 0xa1, 0x67, 0x45, 0xdd, 0x82, 0x7a,
+ 0xad, 0x9c, 0x66, 0x75, 0x00, 0x6a, 0x64, 0x5c, 0x3a, 0x6b, 0x2c, 0x52,
+ 0x84, 0xb4, 0x28, 0x42, 0x43, 0xe1, 0xd3, 0x84, 0x8f, 0x5a, 0xf0, 0xa1,
+ 0x85, 0xd9, 0xf0, 0xd3, 0x6d, 0xeb, 0x52, 0xe8, 0xeb, 0x5e, 0xb0, 0x9e,
+ 0xfe, 0x7a, 0x79, 0x4d, 0x5a, 0x72, 0xad, 0xb6, 0x8d, 0xfd, 0x82, 0x99,
+ 0x8d, 0xe0, 0x82, 0xd7, 0x61, 0x9b, 0x33, 0xc1, 0xc7, 0xc6, 0xa8, 0xf5,
+ 0x04, 0x82, 0xc0, 0x25, 0x5e, 0x94, 0xae, 0x55, 0xd2, 0xe4, 0x81, 0xc1,
+ 0xca, 0xe1, 0x1b, 0x9f, 0x64, 0x46, 0x49, 0x9a, 0x46, 0x2e, 0x29, 0x5e,
+ 0x14, 0x55, 0xec, 0xaf, 0x04, 0x77, 0x15, 0xf1, 0x53, 0xa0, 0xa1, 0x09,
+ 0x2b, 0x11, 0xb4, 0xeb, 0xe1, 0x63, 0xcc, 0xc9, 0x29, 0x4b, 0x2a, 0x1d,
+ 0x9b, 0x94, 0xd4, 0x9e, 0x3d, 0xfb, 0x5f, 0x17, 0x4b, 0x33, 0xf1, 0x91,
+ 0xdb, 0x82, 0xae, 0x7d, 0xba, 0xfb, 0x68, 0x02, 0xd7, 0x39, 0xa0, 0x9e,
+ 0xee, 0xb5, 0x1d, 0x50, 0xd8, 0x6c, 0x46, 0x45, 0xcd, 0x92, 0x17, 0xf4,
+ 0xdf, 0x07, 0xa5, 0x32, 0xa2, 0xce, 0xbe, 0x14, 0xc6, 0xbb, 0x12, 0xb6,
+ 0x60, 0x39, 0xba, 0x66, 0xc7, 0x21, 0xa0, 0x3d, 0x24, 0xb1, 0xd7, 0x4f,
+ 0x5e, 0x1d, 0x5f, 0x60, 0xf9, 0x8f, 0xdf, 0x7e, 0x0d, 0x9f, 0xb0, 0x55,
+ 0x6d, 0xa7, 0x68, 0xb3, 0x66, 0x5b, 0x97, 0x63, 0x3a, 0x22, 0xfe, 0xbb,
+ 0x53, 0x4d, 0xe2, 0x93, 0x5c, 0xf9, 0x88, 0xf8, 0x4f, 0x7f, 0xbf, 0x8b,
+ 0x2b, 0xb0, 0x91, 0x8e, 0xfb, 0x32, 0x75, 0xe2, 0x39, 0xf8, 0x90, 0xdd,
+ 0xbb, 0xbf, 0x61, 0x3a, 0xbd, 0x39, 0x76, 0x0f, 0xbf, 0xf0, 0x66, 0xe6,
+ 0xc7, 0x03, 0x42, 0x15, 0x18, 0xf5, 0x69, 0xfa, 0xf3, 0xaf, 0xbb, 0x0a,
+ 0xc5, 0x4d, 0x93, 0xb4, 0xef, 0xc4, 0x88, 0x37, 0x00, 0x8e, 0x18, 0x8d,
+ 0xdf, 0x73, 0xb8, 0x8e, 0x05, 0xbb, 0xa0, 0x4a, 0x09, 0x70, 0x4a, 0x3b,
+ 0x3d, 0x2d, 0x58, 0x21, 0x22, 0x11, 0xcd, 0xa0, 0x0d, 0x80, 0x38, 0xba,
+ 0xc7, 0x65, 0x52, 0xce, 0x82, 0x4b, 0xae, 0x65, 0x53, 0x41, 0xd5, 0xdc,
+ 0x97, 0x6b, 0x0d, 0x76, 0x86, 0x5c, 0x3e, 0xac, 0xde, 0x75, 0xcf, 0x81,
+ 0x55, 0xf6, 0x80, 0x87, 0xf2, 0xaf, 0xc4, 0xc4, 0x7b, 0x19, 0xe1, 0x29,
+ 0x74, 0x8f, 0x35, 0xb5, 0xa1, 0x2c, 0x6f, 0x16, 0xd5, 0x4c, 0xcd, 0xea,
+ 0xea, 0xec, 0x9a, 0x65, 0x27, 0x57, 0x88, 0xdb, 0x43, 0xec, 0xf7, 0xe7,
+ 0x65, 0x36, 0xf2, 0xad, 0xca, 0x45, 0x75, 0x64, 0x18, 0x59, 0xf7, 0x30,
+ 0x6b, 0x94, 0x50, 0x5c, 0x25, 0x62, 0xce, 0x63, 0x5b, 0xe9, 0xbe, 0xe2,
+ 0xed, 0x47, 0x46, 0x52, 0xcf, 0x9b, 0x92, 0x5e, 0x6c, 0x29, 0x1a, 0x0e,
+ 0x58, 0xc8, 0x79, 0xc9, 0x6f, 0x69, 0xea, 0x74, 0xef, 0x38, 0xcf, 0x5b,
+ 0x5b, 0x27, 0x2b, 0x0b, 0xfa, 0xb3, 0x20, 0x8f, 0xcd, 0x1f, 0x22, 0x1b,
+ 0x32, 0xba, 0x17, 0xc9, 0x79, 0x2b, 0xc1, 0x1c, 0x68, 0x2e, 0x04, 0x5c,
+ 0x12, 0x30, 0x67, 0x44, 0x4b, 0x8f, 0xd9, 0x1a, 0xaa, 0x75, 0xa8, 0x49,
+ 0xe1, 0xd9, 0x19, 0x81, 0x1a, 0xde, 0xdd, 0x20, 0x46, 0x7e, 0x37, 0x14,
+ 0x06, 0xe6, 0xbd, 0x4b, 0xce, 0xc1, 0x7c, 0xf2, 0x01, 0x68, 0x1f, 0xb9,
+ 0x9a, 0x5a, 0xf2, 0x43, 0xb0, 0x36, 0x8c, 0x12, 0x8b, 0x2c, 0x01, 0xcc,
+ 0x1c, 0xf2, 0x5a, 0xd2, 0x9e, 0xa4, 0x6b, 0x39, 0x2f, 0x58, 0x59, 0x5b,
+ 0x69, 0x00, 0x9b, 0xbe, 0xbe, 0x7f, 0x75, 0x72, 0x91, 0x6c, 0x99, 0x55,
+ 0x1d, 0x77, 0x95, 0x1b, 0xbd, 0xd7, 0x77, 0xb2, 0x66, 0xb2, 0xb3, 0xf8,
+ 0x90, 0xef, 0x18, 0x3b, 0x68, 0x3a, 0xde, 0xb6, 0xda, 0x3d, 0x3e, 0x87,
+ 0x4d, 0xa8, 0x36, 0x93, 0x1a, 0x4d, 0xb0, 0x9a, 0xba, 0xa7, 0xc1, 0xb3,
+ 0xa2, 0x18, 0x28, 0xee, 0x8c, 0x27, 0x4c, 0x13, 0xbb, 0x18, 0x00, 0x52,
+ 0xe1, 0x88, 0x66, 0x42, 0xde, 0xc1, 0x8c, 0x1d, 0xa7, 0xc6, 0xfc, 0xeb,
+ 0x9e, 0x55, 0x46, 0x2c, 0x89, 0x8f, 0x81, 0x7d, 0x0b, 0x0a, 0xb3, 0x91,
+ 0x7b, 0xc2, 0x69, 0x7b, 0x7d, 0x02, 0x48, 0xd1, 0xa4, 0x2c, 0xe8, 0x2e,
+ 0x9a, 0x92, 0x83, 0xaa, 0xdb, 0x1c, 0x5c, 0x66, 0xbd, 0xe1, 0x4e, 0x2f,
+ 0xb1, 0x90, 0x30, 0x33, 0xcb, 0x40, 0x35, 0x3a, 0x0c, 0x9e, 0xd9, 0x62,
+ 0x57, 0xcb, 0x9a, 0x9d, 0xae, 0x64, 0xef, 0xdb, 0xf5, 0x1a, 0xc6, 0x04,
+ 0xaa, 0xb7, 0x9c, 0x56, 0xd9, 0x32, 0x4a, 0x31, 0xce, 0x95, 0x35, 0x24,
+ 0xc7, 0xb6, 0x53, 0x58, 0xaa, 0xde, 0x4f, 0xbd, 0xc4, 0x83, 0x14, 0xb5,
+ 0x5c, 0x63, 0xb9, 0x0b, 0xfa, 0x7b, 0x57, 0x80, 0xb9, 0x8a, 0xed, 0x09,
+ 0x9e, 0x66, 0xb3, 0x7c, 0x9e, 0x37, 0xd0, 0xe1, 0xbd, 0x2e, 0x04, 0x4b,
+ 0xd1, 0xee, 0xd2, 0x4f, 0x61, 0x97, 0x14, 0xa6, 0x97, 0xd2, 0xaf, 0x4d,
+ 0x97, 0xe0, 0xac, 0x61, 0x14, 0x55, 0xdc, 0x9c, 0x6b, 0x77, 0xc8, 0x02,
+ 0xfd, 0xd6, 0xc4, 0x7a, 0x7e, 0x1f, 0x8b, 0xb7, 0x7d, 0x64, 0xea, 0x06,
+ 0x70, 0x22, 0x3a, 0x67, 0xe2, 0xc4, 0x18, 0xf3, 0xe5, 0xa0, 0x67, 0x2c,
+ 0xd5, 0xc7, 0x03, 0xd9, 0x6d, 0x5e, 0xdf, 0x51, 0xc1, 0x03, 0xc9, 0xa3,
+ 0xee, 0x0f, 0x36, 0x43, 0xcd, 0x81, 0x81, 0xd9, 0xf9, 0x41, 0xac, 0x4e,
+ 0x68, 0x40, 0x10, 0x56, 0xec, 0xfe, 0xe9, 0xea, 0xbb, 0x2a, 0xec, 0x07,
+ 0x59, 0x31, 0x29, 0xa7, 0x1d, 0xfb, 0x8c, 0x26, 0xc1, 0x13, 0x72, 0xd8,
+ 0xf1, 0x1c, 0x3f, 0xc1, 0x2e, 0x8f, 0x3b, 0xd6, 0xc8, 0xa3, 0xc3, 0xde,
+ 0xbe, 0x5f, 0xb4, 0xef, 0x63, 0xe6, 0x3d, 0xb6, 0xfd, 0xaf, 0xda, 0xf5,
+ 0xff, 0x32, 0x3d, 0xc2, 0x53, 0xbf, 0x1e, 0xa1, 0x48, 0x0c, 0x26, 0xf9,
+ 0xe2, 0x86, 0x7c, 0xee, 0x2f, 0x10, 0x86, 0x26, 0x17, 0x19, 0xff, 0x20,
+ 0xae, 0x40, 0x8c, 0xe4, 0xca, 0xab, 0xc5, 0x4f, 0xa0, 0x6f, 0x8b, 0x78,
+ 0xc9, 0x15, 0x36, 0xad, 0xc6, 0x98, 0x40, 0x1f, 0xf2, 0xc0, 0x5a, 0xa5,
+ 0x40, 0x84, 0xbe, 0xcc, 0x37, 0xbd, 0xbd, 0x5d, 0x18, 0xe5, 0xa8, 0xbf,
+ 0x1d, 0x1a, 0x93, 0x21, 0x9d, 0x12, 0x8e, 0xc9, 0x4c, 0x13, 0xd2, 0x2e,
+ 0xf0, 0xf3, 0x4e, 0x73, 0xe8, 0xbc, 0xa4, 0x23, 0xf0, 0xad, 0x6b, 0x66,
+ 0xf4, 0xdd, 0xc5, 0xe9, 0x41, 0x77, 0x9e, 0x80, 0x86, 0xad, 0x0f, 0x76,
+ 0x76, 0xe0, 0x7a, 0xbb, 0x49, 0x3f, 0x7e, 0x1c, 0xd6, 0xd9, 0xce, 0xb4,
+ 0x9c, 0xd4, 0x3b, 0x75, 0x3d, 0xd3, 0xd9, 0x68, 0xe3, 0xc5, 0x7f, 0x07,
+ 0x9f, 0x45, 0x39, 0x5f, 0x54, 0x30, 0xa2, 0x07, 0x75, 0x1d, 0x44, 0x6a,
+ 0x47, 0x47, 0x1a, 0x07, 0x3a, 0x2e, 0x18, 0xf3, 0x85, 0x03, 0x3e, 0xc8,
+ 0x69, 0x02, 0xbe, 0x49, 0xf4, 0x65, 0x4c, 0xaf, 0x8d, 0x4d, 0xda, 0x28,
+ 0x69, 0x3f, 0x22, 0x73, 0x52, 0xd9, 0xa9, 0x9f, 0xfb, 0x66, 0x0b, 0xdd,
+ 0x1d, 0x25, 0xff, 0x21, 0xe0, 0xca, 0xbc, 0x59, 0x1b, 0x67, 0x7e, 0xde,
+ 0x51, 0xf3, 0xed, 0x20, 0xe2, 0xb1, 0x18, 0x35, 0xf5, 0xd2, 0xc4, 0x3d,
+ 0xe9, 0xec, 0x9e, 0x6e, 0x42, 0x93, 0xd9, 0xbd, 0xd7, 0x65, 0x65, 0x4e,
+ 0xcd, 0xbc, 0x8e, 0xd9, 0xfa, 0xe2, 0x92, 0xab, 0x11, 0x00, 0x4d, 0x6a,
+ 0xf2, 0x46, 0xb0, 0xe3, 0x61, 0x59, 0x78, 0xad, 0x9b, 0x41, 0x4c, 0x10,
+ 0x64, 0x1f, 0x26, 0x1a, 0xd5, 0x5a, 0xe5, 0x67, 0xf4, 0xe2, 0xb9, 0x16,
+ 0x9d, 0xd8, 0xb5, 0x18, 0x97, 0x85, 0xf3, 0x04, 0x42, 0x1a, 0x99, 0x2e,
+ 0xf7, 0x63, 0xbd, 0xc3, 0x3a, 0x57, 0x19, 0x3d, 0x0a, 0x89, 0x5e, 0x55,
+ 0xa5, 0x27, 0xc6, 0x07, 0xdf, 0x42, 0x9d, 0x32, 0xb2, 0x21, 0xbf, 0xd6,
+ 0x58, 0x47, 0xf7, 0xf8, 0x5a, 0xe8, 0x7f, 0x43, 0xf8, 0x1a, 0x8d, 0x64,
+ 0x54, 0xb4, 0xf5, 0x59, 0x8d, 0x52, 0xf8, 0x40, 0xcd, 0x52, 0x4c, 0xa3,
+ 0x18, 0x82, 0xba, 0x08, 0x8e, 0x03, 0x41, 0xeb, 0xfd, 0x57, 0x28, 0xb6,
+ 0x9d, 0xe8, 0xf9, 0x74, 0xdf, 0xf0, 0x37, 0x28, 0xd2, 0x4f, 0xb0, 0x16,
+ 0x5d, 0xfd, 0x06, 0xa0, 0x10, 0x6b, 0x8b, 0xc5, 0x72, 0x23, 0xba, 0xe3,
+ 0x51, 0x80, 0x98, 0x28, 0xa1, 0x39, 0x92, 0x71, 0x52, 0x80, 0xcf, 0x6a,
+ 0xab, 0xd8, 0x7b, 0x29, 0x11, 0x9e, 0xc3, 0x1c, 0x0d, 0x76, 0x6d, 0x3c,
+ 0xfe, 0x3d, 0xa3, 0x02, 0x15, 0x4f, 0x0b, 0x2d, 0xc0, 0x88, 0xa1, 0x26,
+ 0x03, 0x2e, 0x8a, 0x72, 0xb0, 0x66, 0xa5, 0xbb, 0x5e, 0xcc, 0xee, 0x33,
+ 0x02, 0x11, 0x98, 0xf9, 0xae, 0xce, 0x71, 0x4a, 0x7e, 0x72, 0x0f, 0xc8,
+ 0xc3, 0x7e, 0x3b, 0x55, 0xf3, 0x67, 0x50, 0xa9, 0x38, 0x58, 0x91, 0x88,
+ 0xfe, 0x98, 0x24, 0xb2, 0x7c, 0x51, 0x63, 0x48, 0xb0, 0x63, 0x0c, 0xc7,
+ 0xcf, 0x91, 0xfc, 0x21, 0xa9, 0x09, 0x0c, 0x85, 0x53, 0x27, 0x4e, 0x5d,
+ 0xf6, 0x65, 0xea, 0x66, 0x14, 0x8e, 0xa8, 0xa4, 0x8f, 0xdd, 0x1d, 0x65,
+ 0xd3, 0x0e, 0x7c, 0x30, 0x16, 0xad, 0x8e, 0x45, 0x94, 0xd5, 0xa1, 0xe3,
+ 0xd8, 0xcd, 0x66, 0x54, 0x5f, 0x0b, 0xe0, 0x79, 0xe8, 0x49, 0x95, 0xe9,
+ 0x27, 0x8a, 0xb2, 0xdb, 0x2b, 0xe9, 0xc7, 0x20, 0xb4, 0x5e, 0x2c, 0x02,
+ 0xcd, 0xeb, 0x80, 0x22, 0xd1, 0xec, 0x32, 0xc7, 0x6f, 0xbc, 0xcc, 0x3d,
+ 0x00, 0x9b, 0xa5, 0xb4, 0xc1, 0x37, 0x7f, 0x21, 0xdb, 0xcf, 0xc9, 0x76,
+ 0xe9, 0x3a, 0x6c, 0x8a, 0xc9, 0xac, 0xac, 0xd5, 0xa1, 0x48, 0xcb, 0xc4,
+ 0x69, 0x20, 0xe6, 0x60, 0x7c, 0x2f, 0x3f, 0x90, 0x35, 0x90, 0x5f, 0x70,
+ 0xb3, 0x57, 0x25, 0x79, 0x17, 0x43, 0x0f, 0xa0, 0x28, 0x61, 0x2e, 0x73,
+ 0x85, 0xdc, 0x07, 0x56, 0xf1, 0x3e, 0x48, 0x7e, 0xfa, 0xa9, 0x9f, 0x90,
+ 0xf6, 0xf7, 0x93, 0xb1, 0x29, 0x7f, 0x32, 0x9b, 0x2c, 0xf9, 0xa9, 0x12,
+ 0xc1, 0xf1, 0xd3, 0xad, 0xf9, 0x64, 0x37, 0x5e, 0x44, 0x6e, 0x93, 0x7a,
+ 0x06, 0x7f, 0x28, 0x2b, 0x14, 0x02, 0x39, 0xb9, 0xd7, 0x08, 0x01, 0xe7,
+ 0xe8, 0xc0, 0x79, 0xc1, 0x7e, 0x3f, 0xbb, 0xa2, 0x80, 0xbe, 0x84, 0xf6,
+ 0xf1, 0x72, 0x5e, 0x88, 0x1a, 0xc6, 0x1b, 0x11, 0x47, 0x1c, 0x72, 0x7f,
+ 0xf3, 0x8f, 0x9b, 0x6e, 0xcf, 0xf4, 0xd5, 0x67, 0xd5, 0xa8, 0x5c, 0x8d,
+ 0x1c, 0x27, 0x3d, 0xf5, 0x9a, 0xce, 0x82, 0x68, 0x1c, 0x23, 0x42, 0x8c,
+ 0xe4, 0x3c, 0x23, 0x87, 0x11, 0x83, 0x92, 0x4b, 0x0b, 0xe5, 0x02, 0x36,
+ 0x7b, 0x71, 0x73, 0x5f, 0x53, 0xc0, 0x2c, 0x26, 0x6d, 0xdc, 0xd5, 0x4f,
+ 0xbd, 0x8b, 0x46, 0x1b, 0x47, 0xce, 0x7c, 0xc4, 0x03, 0x50, 0x2d, 0xcd,
+ 0x16, 0x68, 0xc9, 0x47, 0xd3, 0x97, 0xcd, 0xc1, 0x26, 0x02, 0x47, 0x70,
+ 0xee, 0x8a, 0xf8, 0xab, 0x42, 0x5c, 0x97, 0x36, 0xe3, 0xe1, 0x3e, 0x82,
+ 0x4f, 0xb6, 0x0c, 0x6c, 0x8e, 0x45, 0x29, 0xd8, 0xc4, 0x65, 0x5b, 0x51,
+ 0xba, 0x44, 0xd8, 0xfd, 0x7e, 0xc4, 0x94, 0x12, 0x1c, 0xb3, 0x7d, 0xd7,
+ 0x28, 0x89, 0xce, 0xdb, 0x39, 0x18, 0x20, 0x09, 0x75, 0xc1, 0x89, 0xa3,
+ 0xbc, 0x39, 0xe8, 0x62, 0x45, 0xe2, 0x61, 0x4d, 0x1e, 0xb8, 0x40, 0xae,
+ 0x2a, 0x0a, 0xa3, 0xb1, 0x39, 0x93, 0x74, 0x96, 0x29, 0x69, 0xf1, 0xae,
+ 0x90, 0xa4, 0xb3, 0x51, 0x09, 0x93, 0x63, 0x82, 0xc8, 0x11, 0xa2, 0x94,
+ 0x02, 0x71, 0x0e, 0x75, 0x5d, 0xba, 0xec, 0x02, 0x85, 0x87, 0xfa, 0xf4,
+ 0x32, 0xe9, 0xad, 0x56, 0x7b, 0x7a, 0xdd, 0x37, 0xbe, 0xb7, 0xa1, 0x26,
+ 0xb8, 0xd6, 0xc4, 0x6d, 0x69, 0xfa, 0xb0, 0x25, 0xd8, 0x85, 0xc1, 0xdf,
+ 0x19, 0x98, 0xc4, 0xf0, 0x62, 0xbd, 0x47, 0xb7, 0x13, 0xc6, 0x66, 0xd5,
+ 0x41, 0x70, 0xb2, 0xf2, 0x42, 0xdb, 0xde, 0x04, 0xbb, 0xe0, 0x70, 0x0e,
+ 0x97, 0x0e, 0xee, 0x28, 0x56, 0x18, 0xbd, 0xa7, 0xbb, 0xf2, 0xc7, 0xbe,
+ 0x4d, 0xf8, 0x47, 0xfa, 0x9e, 0xb8, 0x5a, 0xf4, 0x8a, 0xd0, 0xf3, 0x6d,
+ 0xf4, 0x79, 0x24, 0x72, 0x2a, 0xf2, 0x12, 0xfa, 0x4f, 0x30, 0x3b, 0x7b,
+ 0xdb, 0xe2, 0x51, 0x40, 0x2e, 0x26, 0x10, 0x71, 0xe2, 0x36, 0xe9, 0xdd,
+ 0x94, 0x1c, 0xbd, 0xed, 0x1d, 0x10, 0x86, 0x9c, 0x01, 0x69, 0x32, 0x42,
+ 0x1b, 0xc4, 0xec, 0x1e, 0x2c, 0x84, 0xc7, 0xbf, 0x39, 0x7b, 0x73, 0xdc,
+ 0x06, 0x3f, 0xe1, 0x27, 0x31, 0xb7, 0x82, 0x91, 0x56, 0xaf, 0x8d, 0x88,
+ 0xe1, 0x1d, 0x94, 0x06, 0xaa, 0x1b, 0xb6, 0x97, 0xe9, 0xd7, 0x75, 0xd6,
+ 0x2c, 0xee, 0x96, 0xf9, 0x74, 0x6b, 0x9b, 0xf6, 0x07, 0x21, 0x1f, 0x07,
+ 0x00, 0xdc, 0xb2, 0x85, 0x55, 0x27, 0x5b, 0xac, 0x8c, 0x57, 0x59, 0xb3,
+ 0xac, 0x0a, 0xf6, 0x04, 0x25, 0xd4, 0xfd, 0x30, 0xa4, 0x93, 0xc8, 0xbd,
+ 0xe6, 0xdb, 0x40, 0x92, 0x55, 0xcd, 0x81, 0x63, 0x6e, 0x72, 0x9b, 0xa4,
+ 0x80, 0x91, 0xa3, 0x88, 0x9f, 0x63, 0xed, 0x69, 0x2c, 0xc1, 0x3d, 0x85,
+ 0xb9, 0xd0, 0xf4, 0xc4, 0xc3, 0xf3, 0xf3, 0x57, 0x87, 0x97, 0x87, 0x76,
+ 0x6c, 0xb8, 0x88, 0x21, 0x59, 0xa0, 0x0e, 0x1b, 0x91, 0x44, 0xda, 0x11,
+ 0x3d, 0xb9, 0xf9, 0xa7, 0x77, 0xa3, 0xe3, 0x8b, 0xee, 0xc2, 0x9e, 0x5f,
+ 0x9c, 0x51, 0xc6, 0xfa, 0x9f, 0x7e, 0x3a, 0xa4, 0x48, 0x91, 0xf8, 0xb9,
+ 0x5f, 0xa5, 0x4d, 0xba, 0x19, 0x9c, 0xea, 0x7d, 0xb3, 0xd7, 0xce, 0x80,
+ 0xde, 0xd1, 0x0e, 0x5e, 0xc9, 0x6d, 0x06, 0xa3, 0x3f, 0x79, 0x4f, 0x6b,
+ 0x5a, 0x4d, 0x14, 0xfb, 0x84, 0x8f, 0xea, 0x72, 0xf6, 0x43, 0x8f, 0x86,
+ 0x37, 0x90, 0xd2, 0x49, 0x32, 0x8d, 0xde, 0xeb, 0x5c, 0xcd, 0x92, 0xec,
+ 0xa3, 0xb1, 0xac, 0x1b, 0xdd, 0xf4, 0xd8, 0x5f, 0x94, 0x53, 0xd4, 0x9d,
+ 0x17, 0xb7, 0x3e, 0xba, 0x40, 0x8c, 0x96, 0xe2, 0xdc, 0x6e, 0xc8, 0x01,
+ 0x24, 0xb5, 0x99, 0xdd, 0x06, 0x7c, 0xda, 0x50, 0x7b, 0x2b, 0xc6, 0x69,
+ 0xe0, 0x5c, 0x62, 0x87, 0x21, 0x52, 0xdc, 0xb8, 0x4b, 0xc1, 0x84, 0xfc,
+ 0xd1, 0x9c, 0xc7, 0x41, 0x72, 0x2c, 0xd8, 0x6b, 0x0c, 0xdb, 0xfc, 0x20,
+ 0x78, 0xa8, 0xb1, 0xb6, 0x82, 0x08, 0xfb, 0xb8, 0xac, 0xf0, 0xd2, 0x3e,
+ 0x7b, 0x5d, 0xe5, 0x99, 0x13, 0x2d, 0xcc, 0x43, 0xd4, 0x69, 0x9a, 0x72,
+ 0x98, 0x4a, 0xbd, 0x48, 0x9c, 0x79, 0x90, 0x5e, 0xd3, 0xee, 0x32, 0x8f,
+ 0x1a, 0x25, 0xda, 0x58, 0x48, 0xf4, 0xaf, 0x9d, 0xbd, 0xe1, 0x6e, 0x2f,
+ 0xec, 0x3c, 0x1d, 0x16, 0x64, 0xd1, 0x5a, 0x7f, 0x31, 0xc9, 0xc2, 0xa6,
+ 0x2c, 0x1f, 0xec, 0x1f, 0x8b, 0x30, 0xa3, 0x87, 0x2e, 0x4c, 0xfb, 0xd1,
+ 0xae, 0x0c, 0xce, 0x02, 0x68, 0x17, 0x81, 0xa5, 0x2a, 0x15, 0x8a, 0x46,
+ 0x26, 0x16, 0xe5, 0x1d, 0x8d, 0xc4, 0x6c, 0xb5, 0xd9, 0xac, 0x95, 0xee,
+ 0xdc, 0x8b, 0x4f, 0x73, 0x01, 0x66, 0x81, 0xac, 0x3b, 0xdb, 0xb1, 0x60,
+ 0x8c, 0x5c, 0x9e, 0xbe, 0x1e, 0x67, 0x51, 0x46, 0x30, 0x18, 0xed, 0x2e,
+ 0x70, 0x3f, 0x17, 0x19, 0x19, 0xc8, 0xbd, 0x99, 0x1f, 0x6c, 0x1c, 0x68,
+ 0xc4, 0x73, 0x40, 0xcd, 0x90, 0xf6, 0xf9, 0x82, 0x33, 0xa7, 0x02, 0xc3,
+ 0xfd, 0x4d, 0xfa, 0x31, 0x9f, 0x2f, 0xe7, 0x09, 0xbe, 0xc7, 0x0a, 0xad,
+ 0x3c, 0xa9, 0x17, 0x23, 0xf9, 0x4f, 0x38, 0xe8, 0x4a, 0x8b, 0xba, 0x59,
+ 0x7b, 0xf6, 0x7b, 0xe4, 0x92, 0x31, 0x97, 0xb2, 0x9a, 0x9d, 0x02, 0x5f,
+ 0x9f, 0xe7, 0x4d, 0xdd, 0xb1, 0xfb, 0x8d, 0xaa, 0x90, 0x52, 0x0c, 0x4d,
+ 0x53, 0xa4, 0xf8, 0x12, 0x8f, 0x88, 0x73, 0x4e, 0xdd, 0x53, 0x1d, 0xce,
+ 0x43, 0x09, 0x65, 0x55, 0x5e, 0x4e, 0xed, 0xb1, 0x21, 0x2d, 0x31, 0x2f,
+ 0x96, 0x66, 0xa2, 0xa9, 0x39, 0xba, 0x55, 0xe5, 0x37, 0x41, 0x18, 0x0f,
+ 0x80, 0xc6, 0x11, 0x70, 0xaa, 0x8a, 0xfb, 0xf9, 0x64, 0xf8, 0x64, 0x7f,
+ 0xb8, 0xdb, 0x6f, 0x59, 0xef, 0x92, 0xe1, 0x68, 0x4e, 0xd7, 0x24, 0x9f,
+ 0xdb, 0xec, 0x87, 0xe1, 0xbf, 0xcc, 0x4b, 0x43, 0x79, 0x1f, 0x83, 0x79,
+ 0xfa, 0x11, 0xcb, 0x17, 0x5d, 0xd6, 0x32, 0x79, 0xf1, 0xcd, 0xd9, 0xe8,
+ 0x72, 0xef, 0xe0, 0xfc, 0xec, 0xc2, 0xfc, 0x97, 0xfe, 0xbe, 0x8f, 0xbf,
+ 0xef, 0x07, 0xd6, 0xe3, 0x6b, 0x81, 0x2d, 0x29, 0x4e, 0x1a, 0xaa, 0x0e,
+ 0x6e, 0x01, 0xb1, 0x62, 0xbc, 0x86, 0x08, 0xdb, 0x4e, 0x52, 0x50, 0x17,
+ 0x2b, 0xe2, 0x33, 0xf3, 0x3e, 0xa5, 0xc8, 0xd1, 0x61, 0x7b, 0x3f, 0x03,
+ 0x23, 0x93, 0x37, 0xaa, 0x4a, 0x49, 0x66, 0x96, 0xe6, 0x7c, 0x75, 0x3d,
+ 0x7a, 0x9c, 0x55, 0x23, 0xd0, 0x68, 0x25, 0x34, 0x01, 0xdc, 0xa1, 0xfd,
+ 0xab, 0xc9, 0xcc, 0x68, 0xfa, 0x19, 0x85, 0x47, 0xa7, 0x19, 0x67, 0xd3,
+ 0xd3, 0x4f, 0x62, 0x06, 0x88, 0x20, 0xaf, 0x81, 0x16, 0x1d, 0x76, 0x7b,
+ 0x86, 0x5d, 0x29, 0xb8, 0x38, 0x4a, 0x63, 0x34, 0xbd, 0xcc, 0xeb, 0x1b,
+ 0x45, 0xff, 0x77, 0x9b, 0x03, 0xd8, 0xc8, 0x77, 0x58, 0x9d, 0x34, 0x9c,
+ 0xf9, 0xf5, 0xf6, 0xec, 0x32, 0x49, 0xaf, 0xae, 0x34, 0x4d, 0x0d, 0x50,
+ 0x50, 0xd2, 0x58, 0x77, 0x60, 0xe5, 0xab, 0xa3, 0xb9, 0x0e, 0x25, 0x1f,
+ 0xeb, 0x23, 0x97, 0xa7, 0xa3, 0x1d, 0x72, 0x57, 0x31, 0xae, 0x63, 0xf4,
+ 0xf6, 0xa4, 0xdf, 0x72, 0x64, 0xfa, 0xd1, 0xdc, 0x6d, 0xba, 0x29, 0xe5,
+ 0x1a, 0xed, 0xce, 0x9d, 0x77, 0x17, 0xda, 0xf4, 0xe7, 0x61, 0xd2, 0xc3,
+ 0x82, 0xf6, 0x58, 0xc7, 0xec, 0x61, 0x5d, 0x7b, 0x8c, 0x65, 0x04, 0x0c,
+ 0x04, 0xfd, 0xa5, 0x2c, 0xdd, 0x00, 0x85, 0x01, 0x2f, 0x6f, 0x1f, 0x59,
+ 0xc1, 0xa4, 0x74, 0xf4, 0xc8, 0x22, 0xa1, 0x81, 0x61, 0x50, 0x3d, 0x69,
+ 0x78, 0x9f, 0x1b, 0x46, 0xbb, 0xe6, 0xef, 0xd4, 0x2c, 0x36, 0xed, 0x38,
+ 0x8b, 0x61, 0x2a, 0xf1, 0x1d, 0xd7, 0xb4, 0x6d, 0xdb, 0x74, 0x0c, 0xce,
+ 0x57, 0x7e, 0x4a, 0x37, 0x87, 0x91, 0x2e, 0x14, 0x93, 0xcb, 0xaf, 0x29,
+ 0x02, 0xd6, 0x45, 0xed, 0xbb, 0x8e, 0x04, 0x6e, 0x28, 0xd2, 0xc7, 0xea,
+ 0xa6, 0xe7, 0xf9, 0x0c, 0x9a, 0x00, 0x15, 0x09, 0x74, 0x56, 0xa5, 0xf6,
+ 0x8c, 0x76, 0xa8, 0x2e, 0xc3, 0x1b, 0xdf, 0x3a, 0xf0, 0xe7, 0x29, 0xdd,
+ 0x3a, 0xd6, 0xcf, 0xad, 0x90, 0x6b, 0x3d, 0x48, 0x48, 0xca, 0xa6, 0x0c,
+ 0x42, 0xa0, 0xf3, 0x69, 0x6a, 0xd9, 0x39, 0xde, 0x6d, 0x8e, 0x29, 0x3d,
+ 0x8c, 0x44, 0x48, 0x80, 0xb4, 0xa5, 0x0e, 0x24, 0xbd, 0xbd, 0xfd, 0x4f,
+ 0x86, 0xbb, 0xe6, 0x7f, 0x69, 0x69, 0x44, 0x5d, 0x64, 0x06, 0x03, 0x97,
+ 0xa9, 0x2e, 0xb8, 0xdc, 0xae, 0x93, 0x59, 0xef, 0xa0, 0xb2, 0xba, 0xee,
+ 0x0d, 0x1f, 0x7d, 0xaf, 0xd0, 0x5a, 0xda, 0x3b, 0x25, 0x9d, 0xca, 0x4f,
+ 0xf4, 0x98, 0x57, 0xcb, 0x59, 0x04, 0xac, 0xe2, 0xb9, 0x8d, 0x49, 0x41,
+ 0x9b, 0xdd, 0x8a, 0xd3, 0xf8, 0x1b, 0x12, 0x4f, 0x9c, 0x45, 0x31, 0x6c,
+ 0x85, 0xfa, 0x3f, 0x6b, 0xf9, 0x00, 0x8f, 0xc4, 0x70, 0x83, 0x6c, 0x1e,
+ 0x98, 0x03, 0xf1, 0xa2, 0xbc, 0xba, 0xaa, 0xb3, 0xa6, 0x7b, 0x07, 0x1d,
+ 0xc9, 0x23, 0x3b, 0x17, 0x20, 0xc1, 0xf1, 0x60, 0xce, 0xed, 0x24, 0xf1,
+ 0x24, 0x6d, 0xda, 0x82, 0x8b, 0x9b, 0x1b, 0x46, 0xc0, 0x9d, 0xed, 0x27,
+ 0x3c, 0x70, 0x36, 0xe7, 0x6a, 0x05, 0x29, 0xc8, 0x38, 0xaf, 0x22, 0x9c,
+ 0xbb, 0xa7, 0xe2, 0x43, 0xbe, 0x58, 0x90, 0x8d, 0x03, 0xc6, 0x0d, 0xda,
+ 0xbb, 0x36, 0x4e, 0x30, 0xce, 0xcc, 0x46, 0xc5, 0x76, 0x56, 0x04, 0x8c,
+ 0x51, 0x92, 0x27, 0x16, 0x3d, 0x3c, 0xce, 0xcc, 0xb1, 0xcd, 0x42, 0xad,
+ 0x9d, 0x5c, 0x1b, 0x5e, 0x9e, 0xb5, 0xa4, 0x87, 0x4e, 0x29, 0xa7, 0xba,
+ 0x48, 0x59, 0xcc, 0xd0, 0xdd, 0xe2, 0x32, 0x10, 0x25, 0xf5, 0x22, 0x06,
+ 0xc4, 0x72, 0xc0, 0x78, 0xeb, 0x72, 0x1b, 0x9d, 0xfc, 0xcf, 0x63, 0x97,
+ 0x15, 0x6f, 0xd3, 0xce, 0x19, 0x66, 0x1c, 0x03, 0x6d, 0x27, 0xbd, 0xc1,
+ 0x51, 0x32, 0xe8, 0xa1, 0x23, 0x2e, 0x8a, 0x5a, 0x76, 0x40, 0xb0, 0xb0,
+ 0x7d, 0x48, 0x95, 0x48, 0xa0, 0x0f, 0xed, 0x70, 0x1e, 0x5a, 0x19, 0xe8,
+ 0x4f, 0x58, 0x42, 0x9e, 0x6c, 0x1d, 0x25, 0x4e, 0x49, 0x23, 0x59, 0x0b,
+ 0x3e, 0xda, 0x97, 0x15, 0xc6, 0x9d, 0xbc, 0x20, 0xb5, 0x11, 0x3a, 0x4c,
+ 0x00, 0x85, 0xd5, 0x2c, 0x24, 0x4e, 0xbf, 0x5d, 0x36, 0xff, 0xc2, 0x58,
+ 0x49, 0x45, 0xfb, 0x17, 0xbc, 0x2a, 0xde, 0xa6, 0x9e, 0xf0, 0xa6, 0x26,
+ 0x3e, 0xa7, 0xc1, 0xdf, 0x8c, 0x9d, 0xfd, 0x42, 0x7d, 0x15, 0x2b, 0xf2,
+ 0xd4, 0xac, 0x5b, 0xa3, 0x94, 0xa0, 0x08, 0xf6, 0x86, 0xcd, 0x97, 0xd6,
+ 0xb9, 0x66, 0x8f, 0x0a, 0xa0, 0x3e, 0x42, 0x16, 0xd5, 0x95, 0xf5, 0x57,
+ 0xb8, 0xda, 0x52, 0x97, 0x97, 0x3b, 0xf5, 0xd2, 0xfb, 0x87, 0x04, 0x0c,
+ 0x9e, 0x71, 0x2b, 0x35, 0x9a, 0x91, 0x56, 0x84, 0xdd, 0x24, 0xb8, 0x76,
+ 0xf3, 0x62, 0x30, 0xcf, 0xe6, 0x04, 0xe0, 0xe3, 0x07, 0x8d, 0x40, 0x2c,
+ 0x49, 0x0b, 0xd7, 0xdd, 0xc8, 0xeb, 0xc3, 0x86, 0x78, 0x23, 0x81, 0xef,
+ 0x29, 0x27, 0x88, 0xd0, 0x37, 0x43, 0x44, 0x53, 0x59, 0x08, 0x7e, 0x86,
+ 0x4c, 0x2c, 0xfb, 0x75, 0x38, 0xca, 0x3e, 0x18, 0x15, 0xba, 0xe8, 0xd3,
+ 0xcf, 0x91, 0x0a, 0xa4, 0xb3, 0x4f, 0x9d, 0x6d, 0xb2, 0x22, 0x86, 0x9f,
+ 0x6f, 0x79, 0x9f, 0xe5, 0x39, 0xcf, 0x97, 0xf2, 0x36, 0x6b, 0x24, 0x2a,
+ 0xca, 0x7d, 0x97, 0xf0, 0x9d, 0xc0, 0xea, 0x4d, 0x27, 0x3a, 0xcd, 0x81,
+ 0xbf, 0x24, 0x6b, 0x9c, 0x4f, 0x48, 0x7d, 0x4b, 0xa9, 0x92, 0x36, 0x90,
+ 0xd7, 0xb3, 0x6f, 0xce, 0x41, 0x4f, 0x5d, 0xb0, 0xdc, 0xfd, 0xb8, 0x44,
+ 0xd0, 0x0e, 0x91, 0xab, 0xa7, 0x99, 0xc6, 0xf6, 0xa4, 0xe4, 0x5f, 0x06,
+ 0x29, 0x8f, 0x02, 0x2e, 0x37, 0xba, 0x04, 0x62, 0x94, 0xe2, 0x3a, 0xc6,
+ 0x18, 0x04, 0x65, 0xc2, 0xaa, 0x43, 0x37, 0x13, 0xca, 0xe5, 0xf4, 0x50,
+ 0x7c, 0xb8, 0x9a, 0xaa, 0x73, 0x44, 0x3b, 0x6a, 0xa4, 0xb0, 0x98, 0x46,
+ 0x77, 0x29, 0xb6, 0x9a, 0xfd, 0x04, 0xc4, 0x4d, 0x78, 0xa8, 0x14, 0xdc,
+ 0x33, 0x18, 0xbb, 0xed, 0xec, 0xf2, 0xb9, 0xa3, 0xae, 0x59, 0x79, 0x88,
+ 0xf6, 0xbc, 0xb9, 0x58, 0x36, 0x21, 0x59, 0x24, 0xaf, 0x07, 0x29, 0xd2,
+ 0x76, 0x52, 0x78, 0x0a, 0xef, 0x6e, 0xca, 0x19, 0x5b, 0xc6, 0x41, 0x84,
+ 0x45, 0x13, 0xae, 0x8c, 0x76, 0x45, 0xed, 0x10, 0x5a, 0x0d, 0x8e, 0xe5,
+ 0x5b, 0x00, 0xe1, 0x5a, 0x61, 0x12, 0xa3, 0xe3, 0x65, 0x29, 0xe1, 0xbc,
+ 0x15, 0x0a, 0x7a, 0x1b, 0xa6, 0xa7, 0x98, 0x73, 0x3e, 0x2e, 0x6b, 0xd9,
+ 0x2f, 0x94, 0xd4, 0x64, 0xb6, 0x58, 0x5a, 0x41, 0x2c, 0x0b, 0x65, 0x83,
+ 0x12, 0x4c, 0x59, 0xb5, 0x4c, 0xe4, 0x13, 0xe9, 0x82, 0x5d, 0x14, 0x6f,
+ 0x4e, 0xa9, 0x80, 0x66, 0x9b, 0x18, 0x1d, 0x80, 0xdc, 0xb4, 0xd8, 0x3b,
+ 0x68, 0x94, 0x09, 0x19, 0x6e, 0x40, 0x97, 0x26, 0xf9, 0x82, 0xe6, 0x14,
+ 0xde, 0xa4, 0x64, 0xb5, 0x37, 0xcb, 0x74, 0xd5, 0xd4, 0xb5, 0x91, 0x3b,
+ 0x0f, 0x8a, 0x27, 0xa7, 0xc1, 0x44, 0x42, 0x09, 0xd8, 0xb6, 0x2b, 0xa2,
+ 0x86, 0xfe, 0x42, 0xbe, 0xa0, 0x73, 0xb6, 0x42, 0x1e, 0x9d, 0x83, 0x59,
+ 0xe6, 0xa6, 0x4d, 0x4d, 0x80, 0x2c, 0x28, 0xb9, 0x46, 0x34, 0xd1, 0x80,
+ 0x9b, 0xd2, 0x5b, 0xfe, 0xa4, 0x09, 0x81, 0x75, 0x1c, 0x76, 0x33, 0xdd,
+ 0x98, 0xdd, 0xbb, 0x16, 0xbd, 0x0c, 0x25, 0xc5, 0x2b, 0x7a, 0xbc, 0x2d,
+ 0xf6, 0x13, 0x69, 0x57, 0xab, 0x19, 0x19, 0xe5, 0x9b, 0xbf, 0x79, 0xd0,
+ 0x4b, 0x94, 0x52, 0x8b, 0xef, 0x72, 0xb4, 0xab, 0xf0, 0x78, 0xe8, 0x59,
+ 0xb0, 0x53, 0x45, 0x75, 0xe4, 0x63, 0xdf, 0x6d, 0x8e, 0x78, 0x1a, 0xf7,
+ 0x5e, 0x7e, 0x77, 0x78, 0xfa, 0xee, 0x78, 0xef, 0xf3, 0x84, 0xfe, 0xb5,
+ 0xcf, 0xff, 0xda, 0xef, 0x45, 0x57, 0xc9, 0x08, 0xa7, 0xcd, 0x97, 0x9b,
+ 0x49, 0x7d, 0x3f, 0x1f, 0x97, 0x33, 0xbb, 0x4a, 0x32, 0x17, 0x1a, 0x2a,
+ 0xeb, 0xcb, 0xed, 0xad, 0x09, 0x73, 0xe2, 0x21, 0xef, 0x4a, 0xea, 0x5a,
+ 0x80, 0x34, 0x2a, 0x65, 0x10, 0xa7, 0xf3, 0x33, 0xb7, 0x1a, 0x24, 0xb7,
+ 0xa9, 0xf0, 0x42, 0xbc, 0xee, 0x72, 0x25, 0xb8, 0x89, 0xf9, 0xa7, 0xf4,
+ 0x40, 0xd7, 0x49, 0x54, 0x6a, 0xf0, 0xd5, 0xe2, 0x18, 0xff, 0x3c, 0x59,
+ 0x11, 0x08, 0x7e, 0x23, 0x97, 0x00, 0xe6, 0x50, 0x4e, 0x42, 0x7e, 0x57,
+ 0xb0, 0x42, 0x44, 0x92, 0x73, 0xaf, 0xbc, 0x25, 0x9b, 0x04, 0x92, 0xb6,
+ 0x38, 0x6e, 0xa0, 0x47, 0x03, 0x37, 0x5f, 0x39, 0x1f, 0x8b, 0xd6, 0xe2,
+ 0xe5, 0xcb, 0x99, 0xfd, 0x78, 0x4a, 0xfb, 0x71, 0x56, 0x8a, 0x75, 0xa2,
+ 0xf9, 0x39, 0x55, 0x8b, 0xa5, 0xc7, 0xe3, 0x05, 0xb4, 0x74, 0x46, 0xc2,
+ 0x07, 0xd4, 0x0a, 0xfa, 0xb1, 0x9b, 0x39, 0x9a, 0xc5, 0xa3, 0xc9, 0x50,
+ 0x04, 0xde, 0x2b, 0xaf, 0x9c, 0x84, 0xb7, 0xe1, 0x51, 0xff, 0x1a, 0x94,
+ 0x2d, 0x44, 0x50, 0xa1, 0x59, 0x1a, 0x0c, 0x85, 0x53, 0x01, 0x25, 0x39,
+ 0x98, 0x02, 0xed, 0x76, 0x47, 0x9a, 0x15, 0xbb, 0x9f, 0x65, 0xdb, 0x1a,
+ 0x3b, 0xd4, 0xeb, 0x67, 0xe7, 0x4d, 0xf9, 0x0f, 0x33, 0xe3, 0xa9, 0x7c,
+ 0x24, 0x76, 0x87, 0xc9, 0x9d, 0xb4, 0xb2, 0xe7, 0xee, 0xb8, 0x73, 0xba,
+ 0x9c, 0x7f, 0x8a, 0x5b, 0xc6, 0x6a, 0x8a, 0xc9, 0x37, 0x6a, 0x12, 0x70,
+ 0x81, 0xc1, 0x22, 0xc8, 0x6d, 0x6b, 0x33, 0x2e, 0xbd, 0x2b, 0x4a, 0xa7,
+ 0xc4, 0xec, 0xb1, 0x92, 0xb7, 0x9e, 0x5b, 0x7a, 0xb9, 0x06, 0xba, 0x22,
+ 0xb5, 0xab, 0xe3, 0xac, 0xb8, 0x18, 0x8e, 0x3f, 0x66, 0xd5, 0x84, 0x12,
+ 0x6f, 0x27, 0x46, 0x53, 0x84, 0xee, 0xc5, 0xc9, 0xc2, 0x4c, 0xdc, 0xd3,
+ 0xda, 0x37, 0x2a, 0xfe, 0x60, 0x92, 0xea, 0xfa, 0xaf, 0x5c, 0x7b, 0x60,
+ 0x0f, 0x26, 0x66, 0x0f, 0x0f, 0x2d, 0x47, 0x8a, 0x5e, 0x58, 0xed, 0x73,
+ 0xad, 0x89, 0x0c, 0xf0, 0xf0, 0x07, 0x50, 0x21, 0xcc, 0xb0, 0xbe, 0xe8,
+ 0xad, 0xa6, 0x6c, 0x17, 0xf4, 0x85, 0x19, 0x2f, 0x1c, 0xba, 0x84, 0x12,
+ 0x26, 0x41, 0x1b, 0xb0, 0x1a, 0x17, 0x65, 0x57, 0x07, 0xd9, 0xcc, 0x08,
+ 0x60, 0x14, 0xf7, 0x4a, 0x36, 0xb0, 0x85, 0x5b, 0x8c, 0x95, 0x35, 0x25,
+ 0xa5, 0x41, 0xb8, 0x30, 0x4c, 0xca, 0x9a, 0x95, 0x77, 0x14, 0x17, 0x69,
+ 0x53, 0x44, 0xcd, 0xcb, 0x29, 0xef, 0x87, 0xf1, 0xbd, 0xe5, 0x77, 0x1d,
+ 0x90, 0xee, 0xc2, 0x9f, 0x1d, 0x6a, 0x36, 0x6e, 0x74, 0x07, 0x58, 0x71,
+ 0xd0, 0xc1, 0xbb, 0xa7, 0x0e, 0xbb, 0xd0, 0xb0, 0x7f, 0x97, 0xef, 0x7b,
+ 0xc7, 0xcf, 0x10, 0xbb, 0x68, 0x30, 0xe2, 0x71, 0xd9, 0xdc, 0xd8, 0x2b,
+ 0x07, 0x03, 0x26, 0xf7, 0x98, 0xb1, 0x54, 0x1b, 0x28, 0xe5, 0x6a, 0x99,
+ 0x35, 0x82, 0x6b, 0x13, 0xff, 0x4d, 0x10, 0x02, 0xfc, 0xc0, 0xec, 0x20,
+ 0x65, 0xa3, 0xcc, 0x6f, 0xc2, 0x8a, 0xd4, 0x20, 0xcb, 0x9c, 0xfc, 0x47,
+ 0x30, 0x4a, 0x41, 0x42, 0x63, 0xbe, 0x4b, 0x60, 0xa1, 0xba, 0x26, 0xc2,
+ 0x11, 0x1a, 0x7a, 0x1a, 0x24, 0x1b, 0x63, 0xaa, 0x09, 0xf0, 0xe2, 0x16,
+ 0x75, 0x8b, 0xe9, 0x00, 0x9c, 0x21, 0xc7, 0x59, 0xc2, 0xe4, 0x66, 0x5f,
+ 0x8e, 0xf5, 0x9d, 0x7a, 0x9b, 0x8c, 0xed, 0x08, 0x08, 0xac, 0xa5, 0x55,
+ 0xae, 0x38, 0xb4, 0xff, 0xb4, 0xa1, 0x11, 0x18, 0x5e, 0x55, 0xcd, 0x2c,
+ 0x6b, 0xe0, 0xa9, 0xb3, 0x48, 0x4c, 0x4c, 0x79, 0x28, 0xbc, 0x52, 0x17,
+ 0x16, 0x83, 0x9a, 0xdf, 0x1d, 0xc5, 0x62, 0x0a, 0x55, 0x4c, 0xdf, 0x81,
+ 0xf2, 0xe2, 0xb1, 0x25, 0xd5, 0xa5, 0x9c, 0x48, 0x34, 0x4f, 0x82, 0xc6,
+ 0x49, 0x9a, 0x18, 0x6d, 0x40, 0x57, 0x06, 0xf8, 0x71, 0x8f, 0x96, 0x66,
+ 0x2b, 0x9a, 0xae, 0x2f, 0x1f, 0xcc, 0x8b, 0xb8, 0x19, 0x07, 0x66, 0xff,
+ 0xd7, 0xb1, 0xf8, 0xa1, 0x5e, 0xae, 0x93, 0xb2, 0xf8, 0xdb, 0xb2, 0x98,
+ 0x34, 0x16, 0x13, 0x07, 0x9d, 0xb4, 0xec, 0x7b, 0xa4, 0x4d, 0x12, 0x30,
+ 0xb5, 0x40, 0x9a, 0xee, 0xc6, 0xc7, 0x87, 0xc4, 0x7d, 0x47, 0x99, 0x47,
+ 0x04, 0x17, 0xa6, 0x6b, 0x67, 0xe6, 0xe5, 0x28, 0xdd, 0xe4, 0x66, 0x85,
+ 0xaa, 0xc9, 0x0d, 0xb2, 0x2a, 0xe1, 0xde, 0xc9, 0xd4, 0x67, 0xb9, 0x02,
+ 0xfe, 0xc3, 0xcd, 0x8a, 0xa2, 0x94, 0x93, 0x48, 0xa2, 0xbc, 0xe9, 0xb2,
+ 0x50, 0x41, 0xbd, 0xaa, 0x9f, 0x21, 0xba, 0xea, 0x86, 0xe6, 0x3c, 0x9b,
+ 0xd5, 0x99, 0x0d, 0xe1, 0xdb, 0x77, 0x9c, 0x29, 0x02, 0xb3, 0xb8, 0x28,
+ 0x39, 0x06, 0x47, 0xde, 0xa0, 0x3c, 0x7a, 0xca, 0xd1, 0x13, 0xa3, 0x82,
+ 0x48, 0x67, 0xc8, 0xd0, 0xa3, 0x7d, 0x72, 0xaf, 0x59, 0xf7, 0xd2, 0x82,
+ 0xee, 0x3a, 0xcd, 0xba, 0x0f, 0x6e, 0x9f, 0xd2, 0xce, 0x9b, 0x64, 0xb2,
+ 0xeb, 0x54, 0xe5, 0x4a, 0xca, 0xc9, 0x5b, 0x85, 0x9c, 0x0b, 0xa6, 0x37,
+ 0xcc, 0xdf, 0x4c, 0x41, 0xa9, 0xc1, 0xe0, 0xaa, 0x59, 0x0c, 0xa2, 0x4b,
+ 0x80, 0xb5, 0x6e, 0x6f, 0x81, 0xd9, 0x95, 0xb0, 0x16, 0xbc, 0x51, 0xc2,
+ 0x96, 0x5b, 0x02, 0x8d, 0x27, 0xa7, 0xaf, 0xd9, 0x07, 0x7d, 0x74, 0x41,
+ 0x7f, 0xcb, 0x2d, 0x67, 0xc3, 0x10, 0x87, 0x82, 0x08, 0x99, 0x39, 0x82,
+ 0xfa, 0xe6, 0xbb, 0x6e, 0xc2, 0xcf, 0xd6, 0xd9, 0x68, 0xe7, 0xc9, 0x67,
+ 0xbb, 0x61, 0xea, 0xf9, 0x16, 0x7d, 0xc3, 0x91, 0xd9, 0x7c, 0x32, 0x7c,
+ 0xba, 0x3b, 0xdc, 0xdd, 0xee, 0xf4, 0x86, 0xa6, 0x7b, 0x4d, 0x32, 0xb9,
+ 0x52, 0x70, 0xda, 0x8b, 0x83, 0xa6, 0xc0, 0xe5, 0x6b, 0x2b, 0x68, 0xd3,
+ 0x4f, 0x5b, 0xba, 0xc8, 0x6e, 0xcd, 0x56, 0x8b, 0x19, 0xc3, 0xc9, 0x69,
+ 0x0e, 0x2c, 0xbb, 0x79, 0x8f, 0x6e, 0x33, 0xbd, 0x5f, 0x28, 0x2f, 0xb0,
+ 0x9d, 0xab, 0x87, 0x47, 0xe8, 0xc2, 0x64, 0xc0, 0x70, 0x24, 0x08, 0x52,
+ 0x9b, 0x4e, 0x55, 0x00, 0xc7, 0x21, 0xd8, 0xfe, 0xbb, 0x3b, 0x40, 0x3c,
+ 0x87, 0xde, 0xde, 0x67, 0xc3, 0x4f, 0xfc, 0x35, 0x25, 0x4d, 0x7c, 0x90,
+ 0xd6, 0x93, 0x3c, 0x5f, 0x6b, 0x63, 0x28, 0xea, 0xf0, 0x6f, 0x4b, 0xd0,
+ 0xb2, 0x98, 0x6d, 0x9a, 0xa7, 0x1c, 0x41, 0x75, 0x6c, 0x56, 0x41, 0xb3,
+ 0xa4, 0x46, 0x9a, 0x2d, 0xb6, 0xae, 0x5d, 0x49, 0x61, 0x22, 0x92, 0x6d,
+ 0x21, 0xe0, 0x83, 0x3b, 0x6f, 0x86, 0x73, 0xdd, 0x51, 0xa5, 0xcc, 0x59,
+ 0x60, 0x02, 0x97, 0x45, 0x15, 0x26, 0x94, 0x10, 0x3e, 0x92, 0xe8, 0x3c,
+ 0xcd, 0xdc, 0xd7, 0x25, 0xcd, 0x53, 0x6c, 0x52, 0xe1, 0x35, 0x00, 0x85,
+ 0x99, 0x35, 0x6e, 0xec, 0xd9, 0x17, 0x80, 0xce, 0x97, 0x1e, 0xa0, 0xa6,
+ 0x65, 0xa0, 0xa4, 0x11, 0x65, 0x90, 0x19, 0x58, 0x13, 0x44, 0xad, 0xd9,
+ 0x7e, 0xa2, 0x81, 0x30, 0x65, 0x4c, 0x02, 0x57, 0x04, 0x23, 0x37, 0x84,
+ 0x19, 0x98, 0x08, 0x19, 0xec, 0x6c, 0x45, 0xe8, 0x36, 0xfa, 0x66, 0x7c,
+ 0xe0, 0x77, 0xc2, 0x0e, 0x2a, 0xb2, 0x3b, 0x92, 0xc6, 0xb5, 0xa8, 0x13,
+ 0x55, 0x95, 0x93, 0x33, 0xc7, 0x06, 0xfd, 0x59, 0x25, 0x23, 0x20, 0x24,
+ 0x5d, 0xd0, 0xd3, 0x48, 0x16, 0xe1, 0x04, 0xa7, 0xb3, 0xb6, 0x84, 0x59,
+ 0x05, 0x18, 0x8a, 0x88, 0x71, 0xe7, 0x71, 0x56, 0xed, 0xca, 0x4d, 0x07,
+ 0x06, 0x67, 0x07, 0xbc, 0x68, 0x22, 0xce, 0x1e, 0x02, 0x4f, 0xb0, 0x67,
+ 0x84, 0x19, 0x4b, 0x30, 0xd7, 0x69, 0x2d, 0x6c, 0xdf, 0x63, 0xde, 0x8d,
+ 0x6b, 0xb6, 0x4e, 0x95, 0xde, 0x3d, 0xbc, 0x1f, 0xbd, 0x5d, 0x23, 0x33,
+ 0x3d, 0x83, 0xab, 0xc4, 0x23, 0x58, 0x83, 0x8f, 0x40, 0xf1, 0x7a, 0x91,
+ 0x9e, 0x0a, 0xb1, 0x2f, 0xb3, 0xea, 0x9a, 0xc9, 0x6c, 0xc4, 0xb8, 0x61,
+ 0xb9, 0xfe, 0xe5, 0x1a, 0x90, 0xbe, 0x73, 0x2a, 0xba, 0x51, 0xb4, 0x3c,
+ 0xe7, 0x1d, 0x96, 0x26, 0x0c, 0xcb, 0x5c, 0x79, 0x8c, 0x72, 0x7f, 0xc4,
+ 0xa1, 0x70, 0xa3, 0xeb, 0x7b, 0x10, 0x20, 0x5e, 0x00, 0x38, 0x86, 0xbc,
+ 0x61, 0x0a, 0x9d, 0x57, 0x0c, 0x09, 0xc8, 0x74, 0x66, 0xb4, 0xad, 0x10,
+ 0xde, 0xb5, 0x34, 0x2d, 0x8b, 0xac, 0x22, 0x29, 0x08, 0xd4, 0xf4, 0x40,
+ 0xc1, 0xae, 0xb1, 0x8b, 0xc5, 0x6c, 0xfe, 0xa3, 0xaf, 0x4f, 0x80, 0xfe,
+ 0x35, 0x87, 0xbe, 0x90, 0xd4, 0x56, 0xee, 0x3f, 0xd3, 0xaa, 0x5b, 0x23,
+ 0xec, 0x3a, 0xb7, 0x26, 0x63, 0x9a, 0xb4, 0x28, 0xd3, 0x3a, 0x3a, 0x72,
+ 0xa2, 0xca, 0xb0, 0xe0, 0x1b, 0x45, 0xa7, 0xa5, 0xc8, 0x02, 0x29, 0xa4,
+ 0x1a, 0x21, 0x4c, 0x1d, 0xa4, 0x3c, 0x3a, 0x5f, 0xf8, 0xba, 0xa6, 0x60,
+ 0xa7, 0xb5, 0x84, 0x00, 0xa1, 0x58, 0x04, 0x70, 0x63, 0xb7, 0x5f, 0x99,
+ 0xa6, 0x3e, 0x0b, 0xa1, 0x53, 0xf2, 0xf9, 0x78, 0x1d, 0x09, 0xac, 0x49,
+ 0xc7, 0x1c, 0xb7, 0x53, 0x97, 0x69, 0x38, 0x1c, 0xdd, 0x47, 0xd2, 0x02,
+ 0x39, 0x65, 0x62, 0x9e, 0x3f, 0x55, 0x4b, 0x28, 0x24, 0xf0, 0x1f, 0xc0,
+ 0xc1, 0xd3, 0x1d, 0x61, 0xce, 0x27, 0xdd, 0x92, 0x9a, 0x4c, 0xe2, 0xb7,
+ 0xa6, 0x44, 0x3c, 0x02, 0x9c, 0x8c, 0x37, 0x47, 0xf6, 0xca, 0x4b, 0xba,
+ 0xd9, 0xbf, 0x14, 0x87, 0x07, 0x01, 0xa7, 0xfd, 0x20, 0x88, 0x64, 0x12,
+ 0x31, 0xc4, 0x4e, 0x58, 0x03, 0x68, 0x1a, 0xe2, 0xcd, 0x71, 0x98, 0xcc,
+ 0x9b, 0x3d, 0xde, 0x71, 0xc4, 0xa3, 0x59, 0x73, 0xa9, 0x82, 0x3f, 0x74,
+ 0x27, 0xef, 0xe5, 0xc3, 0xb3, 0xf7, 0x4b, 0xa7, 0x6f, 0xfd, 0xec, 0x31,
+ 0x1f, 0xad, 0x62, 0x2d, 0x5f, 0x7a, 0x8e, 0x1e, 0xc0, 0x05, 0xd8, 0x56,
+ 0xb0, 0x0e, 0x9f, 0xb6, 0x94, 0xf1, 0x8c, 0xa2, 0x97, 0xbf, 0xd5, 0xaa,
+ 0x63, 0x33, 0xc2, 0x02, 0xa5, 0xce, 0xc7, 0x9b, 0x63, 0x6f, 0x25, 0xd6,
+ 0xde, 0x67, 0x4d, 0x12, 0x9d, 0x11, 0x2d, 0x90, 0xa1, 0xf7, 0xd1, 0xec,
+ 0xff, 0x86, 0x37, 0xf3, 0x18, 0x3e, 0x95, 0x41, 0xbc, 0x39, 0xcd, 0x98,
+ 0x11, 0xa5, 0x31, 0x18, 0xdf, 0x97, 0x7a, 0x49, 0x3d, 0x34, 0xb8, 0x16,
+ 0xf4, 0x92, 0xe1, 0x29, 0xec, 0xa2, 0x83, 0x9d, 0xd2, 0x8a, 0xd0, 0x45,
+ 0x9c, 0x98, 0x36, 0x6d, 0xc9, 0xb2, 0x38, 0x31, 0xf2, 0x55, 0x6f, 0xb0,
+ 0xed, 0x7e, 0x7b, 0xce, 0x88, 0xa5, 0x06, 0xf7, 0x81, 0x2c, 0x74, 0xbc,
+ 0xb9, 0x1c, 0x86, 0xa9, 0x2c, 0x1f, 0x51, 0xcd, 0x46, 0x97, 0xef, 0xff,
+ 0xcf, 0x86, 0xc8, 0xee, 0x51, 0xec, 0x06, 0x29, 0x59, 0x71, 0xcd, 0xac,
+ 0x4f, 0xa6, 0x5b, 0x80, 0x69, 0x27, 0x2d, 0x52, 0xf8, 0x00, 0x3c, 0x00,
+ 0xe3, 0xbb, 0x8f, 0x98, 0xdd, 0x0c, 0x91, 0xcd, 0x9c, 0x11, 0xef, 0x2f,
+ 0xed, 0xcd, 0x33, 0x1d, 0xd0, 0xf0, 0x06, 0xb2, 0x6b, 0x87, 0xd8, 0x87,
+ 0x6b, 0x36, 0xab, 0xdd, 0x9c, 0xf1, 0x7d, 0x19, 0xec, 0xc0, 0xd5, 0xb7,
+ 0xa3, 0x12, 0xa4, 0xc9, 0xf5, 0xde, 0xba, 0x2c, 0xf7, 0x3e, 0x6d, 0x5d,
+ 0x96, 0xee, 0x9d, 0x75, 0xd7, 0xe4, 0x08, 0x69, 0x1b, 0xed, 0x84, 0x66,
+ 0xbc, 0x04, 0x28, 0x09, 0xc8, 0x89, 0x43, 0x80, 0x0c, 0xbd, 0xda, 0xd5,
+ 0x01, 0x04, 0xa1, 0xe2, 0xb0, 0xff, 0x9c, 0x97, 0x40, 0x81, 0x17, 0x51,
+ 0xe6, 0x93, 0x71, 0x55, 0xde, 0xd5, 0xd0, 0x9e, 0xd4, 0x9e, 0x4a, 0x19,
+ 0x47, 0x79, 0x13, 0x44, 0xf3, 0xcd, 0xf4, 0xce, 0x2c, 0x91, 0xdb, 0x37,
+ 0x97, 0x6f, 0x4e, 0x99, 0xac, 0x96, 0x33, 0xd9, 0x28, 0x6d, 0x45, 0xfa,
+ 0xbc, 0x1c, 0xcf, 0xcd, 0xfa, 0x1b, 0x05, 0xa5, 0x61, 0x69, 0xa6, 0x02,
+ 0x32, 0x48, 0xb7, 0x43, 0x54, 0x48, 0x82, 0x8a, 0x8b, 0x98, 0xaf, 0x5f,
+ 0x5c, 0x41, 0x2e, 0x9a, 0x26, 0x8b, 0x8b, 0xdc, 0xaf, 0xd5, 0x00, 0x93,
+ 0x9d, 0x8f, 0x83, 0xbb, 0xbb, 0xbb, 0x01, 0xf5, 0xce, 0x29, 0x26, 0x64,
+ 0xb2, 0x1d, 0x31, 0xae, 0x02, 0xaa, 0xd4, 0x6b, 0x5a, 0x0a, 0x7a, 0x24,
+ 0x38, 0x7d, 0x9e, 0xa6, 0x86, 0x9a, 0x0a, 0xe0, 0x84, 0xb4, 0x0e, 0x05,
+ 0x52, 0xbc, 0x2c, 0xa1, 0x32, 0xc8, 0x44, 0xd2, 0xb6, 0xb2, 0xd5, 0x15,
+ 0x69, 0x4e, 0xf9, 0x72, 0xd4, 0xc8, 0xbe, 0xfe, 0x45, 0xaa, 0x08, 0xa9,
+ 0x44, 0x12, 0x93, 0x58, 0x56, 0xe4, 0x7f, 0x62, 0x0b, 0x23, 0x86, 0xdc,
+ 0x16, 0x9d, 0x44, 0xfd, 0xfa, 0x36, 0x3a, 0xd6, 0xb2, 0x4c, 0x94, 0x03,
+ 0x96, 0xda, 0xf6, 0x8e, 0x6f, 0x44, 0x4f, 0x64, 0xea, 0x0e, 0xe0, 0xf1,
+ 0xb1, 0x9a, 0x66, 0xb3, 0x99, 0xd6, 0x51, 0xe2, 0x20, 0x85, 0x3f, 0x37,
+ 0xd0, 0xf0, 0xa2, 0x3a, 0xb6, 0x23, 0x48, 0xae, 0x1d, 0x27, 0xae, 0x9a,
+ 0x77, 0x60, 0x30, 0x01, 0x67, 0x09, 0x48, 0x71, 0xcb, 0xb6, 0x7b, 0x66,
+ 0x10, 0x44, 0x10, 0xc5, 0x5d, 0xd3, 0xf7, 0x22, 0x35, 0x39, 0x39, 0x4c,
+ 0xfc, 0xfc, 0x7e, 0x47, 0xd8, 0x37, 0xcf, 0xaa, 0x6b, 0xfa, 0x89, 0xb2,
+ 0xb9, 0x45, 0xb3, 0x46, 0xd2, 0xc4, 0xa3, 0xaf, 0x49, 0x92, 0x7f, 0x1b,
+ 0xf0, 0xa5, 0x0a, 0xcf, 0xca, 0x92, 0x60, 0xad, 0xe2, 0x02, 0xde, 0x1c,
+ 0x4c, 0x59, 0xac, 0x4c, 0xd3, 0xc2, 0xcc, 0x84, 0x39, 0xb1, 0x21, 0xc4,
+ 0x62, 0x36, 0x7b, 0x39, 0x2b, 0x97, 0xf5, 0xfd, 0x66, 0x22, 0xfc, 0xe4,
+ 0x42, 0xe9, 0xdb, 0x70, 0x82, 0x26, 0xd6, 0xd2, 0xac, 0xef, 0xb2, 0xf8,
+ 0xa0, 0xf7, 0x22, 0xa1, 0xdd, 0x6b, 0xf6, 0x2d, 0x76, 0x9a, 0xdb, 0xf4,
+ 0x3e, 0xf6, 0x6f, 0x7e, 0xdb, 0xd1, 0x59, 0x86, 0x27, 0x92, 0xed, 0xbc,
+ 0xc7, 0x19, 0x7a, 0x2e, 0x8a, 0x10, 0xb3, 0xf2, 0x92, 0x56, 0xd4, 0xc7,
+ 0x36, 0x48, 0xf7, 0x06, 0x33, 0xe8, 0xa9, 0x97, 0xdc, 0x85, 0xff, 0x21,
+ 0x6f, 0x56, 0xa4, 0x30, 0xb8, 0x9a, 0x5f, 0x9c, 0xc2, 0xe0, 0x28, 0x85,
+ 0x38, 0xc5, 0xdb, 0xf2, 0x79, 0xfb, 0x19, 0x53, 0xc3, 0xe4, 0xdc, 0xcc,
+ 0xd7, 0x20, 0x88, 0xfc, 0x5c, 0x7b, 0xcd, 0xa5, 0x3e, 0x5f, 0x99, 0x5c,
+ 0x6b, 0x36, 0x13, 0x96, 0xf1, 0xc9, 0x00, 0x9d, 0x27, 0xd6, 0x9a, 0x0c,
+ 0x90, 0x1e, 0x6c, 0x5a, 0xd2, 0xce, 0xb2, 0xd6, 0xa7, 0xf5, 0x14, 0x13,
+ 0x51, 0x2a, 0x25, 0x3e, 0x53, 0x74, 0x5c, 0x8d, 0x69, 0xf6, 0xb5, 0xb3,
+ 0x9b, 0x33, 0x38, 0x33, 0xde, 0xe9, 0xa5, 0xf9, 0x80, 0x10, 0xb0, 0xac,
+ 0xa9, 0x74, 0x93, 0x75, 0x8c, 0x2e, 0xce, 0xdd, 0x75, 0x62, 0x25, 0x18,
+ 0x2c, 0x23, 0x13, 0xd7, 0x40, 0x9a, 0xfc, 0xb3, 0xed, 0xdd, 0x36, 0xce,
+ 0xea, 0xea, 0x5e, 0x41, 0xab, 0xfd, 0x85, 0x8e, 0x77, 0xce, 0x89, 0x40,
+ 0x7e, 0xfd, 0x44, 0xa1, 0x52, 0xd2, 0x9a, 0x78, 0xba, 0x7c, 0x53, 0x2f,
+ 0x9b, 0x65, 0xd7, 0x3c, 0xa6, 0x17, 0xa7, 0xc7, 0xdf, 0x1d, 0x9f, 0x06,
+ 0x17, 0xd8, 0xd7, 0xa3, 0xd1, 0xce, 0x87, 0xac, 0x1a, 0xa3, 0x0a, 0x13,
+ 0xf9, 0xbc, 0x13, 0x3c, 0x67, 0xf1, 0x3a, 0x9e, 0x54, 0xbf, 0x73, 0xc9,
+ 0xe5, 0x09, 0xa3, 0x76, 0x03, 0x63, 0x9f, 0x10, 0x99, 0xfc, 0x49, 0x61,
+ 0x4c, 0x45, 0xfe, 0x88, 0x00, 0xc3, 0x70, 0x4b, 0x4d, 0xaa, 0x6c, 0xca,
+ 0x55, 0x8a, 0x42, 0x48, 0x58, 0x41, 0x6a, 0x7e, 0x92, 0xbc, 0xc2, 0x52,
+ 0x32, 0x2c, 0x18, 0xd1, 0x0f, 0x3b, 0x88, 0xe0, 0x8d, 0x45, 0x69, 0xae,
+ 0x90, 0xfb, 0xe4, 0x95, 0x7c, 0xb3, 0x66, 0xe7, 0x26, 0xcd, 0x06, 0x73,
+ 0xcf, 0xb0, 0xc9, 0x70, 0xf6, 0xed, 0xe0, 0x70, 0x34, 0x78, 0x75, 0x7c,
+ 0x7a, 0xfc, 0xf5, 0xe1, 0xe5, 0xb1, 0xd2, 0x82, 0x92, 0xfb, 0x7f, 0x85,
+ 0x32, 0xc4, 0xf2, 0xee, 0x5b, 0x99, 0x16, 0x8c, 0x9f, 0x68, 0x65, 0x9b,
+ 0x9c, 0xc9, 0x9e, 0x95, 0x3d, 0x97, 0x4b, 0xe9, 0x91, 0x89, 0x22, 0xc8,
+ 0xd0, 0x78, 0x73, 0xe6, 0xf4, 0xcd, 0xe6, 0xd2, 0xd5, 0x60, 0x04, 0xe9,
+ 0xec, 0x8e, 0xca, 0x3e, 0xbc, 0x2b, 0x08, 0x17, 0x9d, 0xdb, 0x34, 0x40,
+ 0x1e, 0xbd, 0x37, 0xf9, 0xde, 0xcc, 0xb6, 0x16, 0x18, 0xf4, 0x99, 0x2b,
+ 0x8c, 0x77, 0xcd, 0xe1, 0x45, 0xf0, 0xf1, 0x15, 0x9e, 0xec, 0xd0, 0x74,
+ 0x0e, 0x5d, 0x12, 0x6f, 0x61, 0x7f, 0x15, 0x49, 0xb3, 0xa7, 0x0d, 0x54,
+ 0x4f, 0x6e, 0xb2, 0xb9, 0x68, 0x94, 0x14, 0x70, 0x46, 0x7a, 0x27, 0xe7,
+ 0xcb, 0x09, 0xb3, 0x01, 0x1f, 0xf4, 0x71, 0x06, 0xc1, 0x8c, 0x78, 0x0e,
+ 0x36, 0x6f, 0x0c, 0xba, 0x79, 0x47, 0xe4, 0xbd, 0xe4, 0xa4, 0x27, 0x08,
+ 0x06, 0xb2, 0x42, 0x87, 0x40, 0x8b, 0x71, 0x9e, 0x40, 0xd1, 0x0a, 0xfd,
+ 0x5a, 0x79, 0xc9, 0xb5, 0x49, 0xba, 0x97, 0xbf, 0x65, 0x01, 0xf5, 0x78,
+ 0xfc, 0x28, 0xb2, 0x83, 0x1f, 0x41, 0x60, 0xaa, 0xea, 0x4b, 0x9d, 0xfc,
+ 0x95, 0x1e, 0x4e, 0xde, 0x4f, 0xdc, 0x77, 0x49, 0xc8, 0xc1, 0x66, 0x8d,
+ 0xa2, 0x70, 0xa3, 0x82, 0x41, 0x62, 0xed, 0xd4, 0x5d, 0xed, 0x2f, 0xdb,
+ 0x68, 0x4a, 0x51, 0xca, 0x4b, 0x99, 0xc8, 0x59, 0x16, 0x5e, 0xdf, 0x47,
+ 0x0a, 0x86, 0x16, 0xf1, 0x2f, 0x11, 0xad, 0xea, 0x5f, 0x43, 0x7a, 0x66,
+ 0x9b, 0x3e, 0x35, 0xc8, 0x16, 0x01, 0xef, 0xe5, 0xd6, 0x6b, 0xa5, 0xb2,
+ 0xb5, 0x7a, 0x9e, 0x5f, 0xcb, 0xc1, 0x23, 0x5e, 0x3f, 0x3e, 0xbf, 0xe0,
+ 0x82, 0x8a, 0xa7, 0xf4, 0x17, 0x09, 0xda, 0xd4, 0x31, 0xae, 0x1e, 0xa1,
+ 0xd2, 0x26, 0x8c, 0x41, 0x06, 0xaf, 0xbf, 0x8d, 0xc5, 0x2a, 0xb0, 0x8c,
+ 0xe1, 0x84, 0xc2, 0x57, 0x2a, 0x07, 0x22, 0x96, 0x8b, 0xe8, 0x15, 0x00,
+ 0xa2, 0x9e, 0x50, 0x17, 0x84, 0x9e, 0x10, 0x9d, 0x60, 0x48, 0xa4, 0xfa,
+ 0xd6, 0xcf, 0xe8, 0x97, 0xa4, 0xfb, 0x29, 0x70, 0x60, 0xc5, 0x34, 0xb6,
+ 0xf8, 0x84, 0xa9, 0x59, 0x7a, 0x33, 0xa9, 0x50, 0x2e, 0x2a, 0x35, 0x5d,
+ 0x19, 0x76, 0x86, 0x0a, 0xc2, 0x7f, 0xe2, 0x06, 0x0b, 0x5d, 0xe9, 0x28,
+ 0x75, 0x20, 0x7e, 0x31, 0xc1, 0x19, 0x63, 0xc0, 0x0a, 0x9f, 0xee, 0x4b,
+ 0x88, 0x3a, 0xb5, 0xe1, 0x4a, 0x94, 0x9a, 0x44, 0xec, 0x3a, 0xd0, 0xb6,
+ 0x05, 0x63, 0xce, 0x63, 0xa0, 0xcc, 0x68, 0x89, 0xba, 0xb2, 0x72, 0x76,
+ 0x25, 0x91, 0xad, 0x14, 0x74, 0x90, 0x30, 0x33, 0xc6, 0xac, 0x4d, 0x00,
+ 0xa4, 0x75, 0x93, 0x16, 0x91, 0x53, 0x67, 0x26, 0xde, 0xd6, 0x5c, 0xc0,
+ 0x28, 0x65, 0xd9, 0x22, 0x0a, 0x35, 0xed, 0x8d, 0x16, 0xc6, 0x97, 0x00,
+ 0xed, 0x1f, 0x49, 0x61, 0xcf, 0xc9, 0x25, 0x2e, 0x5d, 0xe1, 0x99, 0x21,
+ 0xf2, 0x0f, 0xdd, 0x6f, 0x65, 0x6c, 0x57, 0x89, 0x78, 0x71, 0x8e, 0xfa,
+ 0xd6, 0x16, 0x5c, 0xe1, 0x02, 0xce, 0x12, 0x8b, 0xe8, 0xa9, 0x91, 0x33,
+ 0xe1, 0x11, 0xff, 0x51, 0x0d, 0xb3, 0x76, 0x52, 0x05, 0x96, 0x0f, 0xf7,
+ 0x7a, 0xd1, 0x05, 0x30, 0x64, 0x8c, 0xa4, 0x37, 0xdf, 0x46, 0x77, 0xc9,
+ 0x2b, 0x63, 0x83, 0x79, 0xb4, 0x79, 0x82, 0xef, 0xbf, 0x42, 0xe7, 0xe8,
+ 0x3b, 0x78, 0x01, 0x27, 0xdf, 0xe8, 0x0f, 0x5c, 0x02, 0x8f, 0x10, 0x3b,
+ 0xbc, 0x95, 0xc7, 0x99, 0xf9, 0x5e, 0x4e, 0x35, 0x36, 0xfc, 0x1a, 0x35,
+ 0x21, 0x6a, 0xb5, 0x36, 0x1b, 0x90, 0x6e, 0x0b, 0x52, 0xc4, 0x48, 0x0a,
+ 0xd1, 0xbb, 0x14, 0x8a, 0xcf, 0x12, 0xbf, 0x40, 0x0d, 0x36, 0x04, 0xb4,
+ 0xf7, 0xf3, 0xbe, 0x84, 0xc2, 0x00, 0x56, 0x0b, 0x22, 0xca, 0x66, 0x02,
+ 0x27, 0x96, 0x23, 0x44, 0x9f, 0x4c, 0xeb, 0xdb, 0xf8, 0x09, 0xaf, 0x6f,
+ 0xa3, 0x27, 0xfc, 0x11, 0xe7, 0xdc, 0xd9, 0x3e, 0xc7, 0xe7, 0xa3, 0xef,
+ 0x56, 0xa5, 0xfb, 0x33, 0x2d, 0x3a, 0x1f, 0x71, 0x37, 0x3a, 0xda, 0xf4,
+ 0xfe, 0x31, 0x5f, 0x7d, 0xce, 0xa3, 0xee, 0xfa, 0xe0, 0x9c, 0x9b, 0xef,
+ 0xcb, 0xe1, 0x3e, 0x3f, 0x1c, 0x7d, 0xe7, 0x1d, 0x6b, 0x6f, 0x0b, 0xe0,
+ 0x1c, 0xc7, 0xb2, 0x8d, 0x51, 0x7f, 0xa7, 0x52, 0x72, 0x40, 0x6a, 0x2c,
+ 0xba, 0xdf, 0xeb, 0xdb, 0xc7, 0xec, 0x77, 0xd3, 0x93, 0x60, 0xbf, 0x07,
+ 0x73, 0xbc, 0x6e, 0xbf, 0xfb, 0x0b, 0xd5, 0xc6, 0x40, 0x7a, 0xbb, 0xbd,
+ 0xe0, 0x2a, 0x7d, 0x37, 0x28, 0xf8, 0x1a, 0xdf, 0xe6, 0x40, 0xc2, 0xf2,
+ 0xd6, 0x0e, 0x21, 0x62, 0xe8, 0xe7, 0x2f, 0xdb, 0xe8, 0xe6, 0x85, 0x60,
+ 0xa3, 0xeb, 0x7a, 0xc6, 0x77, 0xfa, 0xaa, 0x8d, 0xae, 0x08, 0xd1, 0x8c,
+ 0x37, 0xb9, 0xbf, 0xc7, 0xc3, 0xfd, 0xed, 0xed, 0x5a, 0x3f, 0xb5, 0x37,
+ 0x9c, 0x21, 0x05, 0x2a, 0xd9, 0x3c, 0x75, 0x2f, 0x4d, 0x3f, 0x42, 0x0b,
+ 0xd1, 0x57, 0x28, 0x1b, 0x12, 0x1c, 0x43, 0xef, 0xba, 0x25, 0x54, 0x68,
+ 0x81, 0xd9, 0x2b, 0xd5, 0xa5, 0x71, 0x8b, 0xe3, 0xda, 0x86, 0xa9, 0xee,
+ 0x67, 0x89, 0x5f, 0x05, 0x27, 0xb2, 0x45, 0xfe, 0x92, 0x45, 0xf3, 0x8d,
+ 0xeb, 0x8c, 0x20, 0x02, 0xe0, 0x1d, 0x6a, 0x9d, 0xd3, 0xa2, 0x1e, 0xb8,
+ 0x2a, 0x8a, 0x2f, 0xec, 0x5f, 0x03, 0x2d, 0xfd, 0xd5, 0xdb, 0x51, 0xe7,
+ 0xb8, 0xd6, 0x19, 0x23, 0xe6, 0xaf, 0x71, 0xf4, 0xcc, 0xef, 0x6d, 0x9e,
+ 0x4b, 0xed, 0xaa, 0x96, 0x48, 0x93, 0x41, 0x22, 0x33, 0x7d, 0xc2, 0x72,
+ 0xcb, 0x3b, 0xc5, 0x27, 0xd5, 0xc2, 0x9f, 0xf0, 0xf7, 0x91, 0xcf, 0xc5,
+ 0xeb, 0x9d, 0x64, 0xfa, 0x92, 0x27, 0x25, 0x46, 0xf3, 0xc2, 0x42, 0x96,
+ 0xfa, 0xa9, 0x05, 0xd4, 0x84, 0x75, 0x55, 0xe8, 0x9d, 0x6c, 0xc1, 0x85,
+ 0x22, 0xf1, 0x0a, 0x47, 0xc6, 0x22, 0x33, 0x5b, 0x42, 0x1b, 0x23, 0x90,
+ 0x9d, 0xed, 0xb5, 0xda, 0x14, 0x4f, 0xe1, 0xe2, 0xf6, 0xe9, 0x80, 0x1e,
+ 0x57, 0xe5, 0x49, 0x7e, 0xf8, 0x1c, 0x3f, 0x1c, 0x76, 0x27, 0x3a, 0xb0,
+ 0x35, 0xa5, 0xca, 0x91, 0xf5, 0x32, 0x2e, 0x8b, 0x29, 0xf1, 0x3f, 0x53,
+ 0xb7, 0xb5, 0x62, 0xf1, 0x5d, 0xea, 0x78, 0xab, 0x49, 0x90, 0x0b, 0x3b,
+ 0x8b, 0xd9, 0x4b, 0xdd, 0xc9, 0x4d, 0x51, 0xba, 0xd8, 0xf3, 0x28, 0x3e,
+ 0xe9, 0x86, 0xdf, 0x5a, 0x3d, 0x7e, 0x21, 0xc3, 0x8c, 0x2f, 0x39, 0xaf,
+ 0xb9, 0x67, 0xc9, 0x8f, 0x73, 0x2e, 0xba, 0xf0, 0x22, 0x5f, 0x0c, 0xf4,
+ 0x4d, 0x16, 0xc2, 0xf3, 0xf4, 0x83, 0x5c, 0x8d, 0x4f, 0x69, 0x19, 0x22,
+ 0x83, 0xe4, 0xa2, 0x68, 0x7e, 0x60, 0x87, 0xb6, 0x8d, 0xdd, 0x35, 0xa2,
+ 0xb2, 0x34, 0x96, 0xa3, 0x0d, 0xe6, 0x0d, 0x7f, 0x23, 0x96, 0x06, 0xa3,
+ 0xc0, 0x55, 0xdf, 0x67, 0xa1, 0x90, 0x77, 0xf4, 0xc2, 0xbe, 0xfb, 0xe0,
+ 0xfa, 0xb9, 0xfd, 0xb0, 0x6e, 0xfd, 0x74, 0xce, 0xfe, 0x7b, 0xac, 0xdf,
+ 0xf3, 0xdf, 0x6d, 0xfd, 0x9e, 0xff, 0xb7, 0x58, 0xbf, 0xe7, 0xff, 0xfc,
+ 0xfa, 0x3d, 0xed, 0xae, 0xdf, 0xf3, 0xff, 0x2e, 0xeb, 0xa7, 0xe5, 0x3e,
+ 0x74, 0xf5, 0xb2, 0x60, 0xfd, 0xc8, 0x13, 0xc2, 0x57, 0x08, 0x08, 0xbe,
+ 0xa0, 0x0d, 0xd1, 0x74, 0xeb, 0x9b, 0x1c, 0x78, 0x10, 0xac, 0x19, 0x7b,
+ 0x76, 0x15, 0xf2, 0x88, 0xcc, 0xfb, 0x38, 0x4f, 0xa3, 0x70, 0x27, 0x29,
+ 0xe1, 0xd9, 0xc9, 0x79, 0x62, 0x3b, 0xe0, 0x2d, 0x83, 0xa3, 0x19, 0x82,
+ 0x92, 0x13, 0x75, 0xb9, 0xd6, 0xe4, 0x87, 0x33, 0x13, 0xc0, 0xc9, 0x66,
+ 0xb5, 0x4b, 0x95, 0x8c, 0x71, 0x09, 0x99, 0xc9, 0x3b, 0x78, 0x41, 0xf3,
+ 0x35, 0xe0, 0xc7, 0xbf, 0x88, 0xe6, 0xff, 0xa0, 0xaa, 0x9a, 0xeb, 0x52,
+ 0xcc, 0xcd, 0xee, 0x4d, 0xdd, 0xa3, 0x97, 0x6d, 0x55, 0xe1, 0x09, 0x5d,
+ 0xc2, 0xc9, 0xe0, 0xa1, 0x25, 0x7b, 0x05, 0xcd, 0x60, 0x39, 0x5f, 0x48,
+ 0x5e, 0xe0, 0x03, 0x79, 0x51, 0xd0, 0x3f, 0xb7, 0x93, 0xef, 0x91, 0xf5,
+ 0xc4, 0x9e, 0x55, 0xc9, 0x15, 0xb0, 0x25, 0x81, 0x15, 0x88, 0xad, 0x61,
+ 0x8b, 0x15, 0x04, 0x46, 0x51, 0x2e, 0x99, 0x4e, 0xce, 0x2f, 0x83, 0xda,
+ 0x6d, 0x8d, 0xdd, 0xac, 0xf0, 0x35, 0x24, 0xc1, 0x44, 0x4b, 0x1a, 0x2f,
+ 0x7f, 0x34, 0x4a, 0x1b, 0x49, 0xd7, 0x22, 0x27, 0x4a, 0x50, 0xa7, 0x99,
+ 0x06, 0xcc, 0xbc, 0x6e, 0x9a, 0x1a, 0x4a, 0xb6, 0x84, 0x57, 0xa1, 0x56,
+ 0x7b, 0x0f, 0x66, 0x96, 0x18, 0x94, 0x58, 0x55, 0x19, 0xd8, 0x85, 0x92,
+ 0x73, 0x6f, 0x49, 0x51, 0x8b, 0x5b, 0x05, 0xce, 0x83, 0x1e, 0xc6, 0xa7,
+ 0x52, 0x1f, 0x8c, 0xc3, 0x0c, 0x18, 0x85, 0x71, 0xf2, 0x88, 0xff, 0x80,
+ 0xfd, 0xbb, 0x02, 0xc4, 0xcd, 0x3a, 0x84, 0x6f, 0x87, 0x06, 0x6b, 0xee,
+ 0x43, 0xc4, 0x87, 0x1b, 0xeb, 0xe0, 0x9b, 0x8c, 0x0b, 0xbc, 0xc9, 0xfc,
+ 0x2c, 0x44, 0x4b, 0xe1, 0xc6, 0x0e, 0x61, 0x06, 0x1e, 0x99, 0xc1, 0x09,
+ 0x8a, 0x2d, 0xa0, 0xa5, 0x47, 0xa2, 0xb1, 0xcc, 0x56, 0x4f, 0x88, 0x51,
+ 0x96, 0x0c, 0x41, 0x22, 0x1e, 0xb7, 0x29, 0x53, 0x77, 0xfc, 0x0b, 0xb3,
+ 0xfe, 0x3c, 0x54, 0xa7, 0x2f, 0x92, 0xb2, 0x6b, 0x8e, 0x85, 0xae, 0x43,
+ 0x10, 0xda, 0x64, 0x3f, 0xbf, 0x4c, 0x1c, 0x87, 0x67, 0x65, 0x17, 0x1f,
+ 0x17, 0x4d, 0x55, 0x2e, 0xee, 0x93, 0xaf, 0x53, 0x1a, 0x16, 0xd4, 0xc2,
+ 0x34, 0x9b, 0x07, 0x39, 0x1f, 0x5c, 0x3b, 0x4e, 0xb4, 0x34, 0xae, 0x23,
+ 0xa7, 0x23, 0x84, 0x5e, 0xc9, 0xd3, 0x92, 0x50, 0xd1, 0xf7, 0x29, 0xf9,
+ 0xf3, 0x34, 0x77, 0x0c, 0xb0, 0xc9, 0xd1, 0xe8, 0x34, 0x54, 0xa6, 0x95,
+ 0xfe, 0x7e, 0x6d, 0x8e, 0x2f, 0x5a, 0x1b, 0xb4, 0x4f, 0x94, 0x19, 0x39,
+ 0x37, 0xfe, 0x22, 0x7a, 0x98, 0x65, 0xdc, 0xd9, 0x4c, 0x33, 0xe1, 0x85,
+ 0x38, 0x3c, 0x99, 0x54, 0xf7, 0x0b, 0x32, 0xd0, 0xf8, 0x65, 0x39, 0x7b,
+ 0xd4, 0x3f, 0x26, 0x51, 0x5c, 0x9b, 0x46, 0xf8, 0x0e, 0x11, 0x32, 0x79,
+ 0x15, 0x82, 0x98, 0x82, 0x99, 0x66, 0xba, 0x28, 0xb8, 0xaa, 0x82, 0x99,
+ 0x64, 0xd6, 0x14, 0x04, 0x09, 0xae, 0x22, 0x47, 0xc0, 0x02, 0x86, 0x12,
+ 0x1b, 0x1d, 0x2a, 0x65, 0xb8, 0x75, 0x90, 0x69, 0x49, 0x74, 0xbd, 0xf0,
+ 0x68, 0x6f, 0xeb, 0xc5, 0x20, 0x6f, 0x74, 0x6a, 0x81, 0xaa, 0x08, 0xb6,
+ 0x4c, 0xbb, 0x29, 0x65, 0x4c, 0x17, 0x01, 0x3b, 0x03, 0x87, 0xbc, 0xf7,
+ 0x76, 0x77, 0x1f, 0xa4, 0xdd, 0x10, 0xf7, 0xaf, 0xb2, 0x6f, 0x60, 0x14,
+ 0x54, 0xaa, 0x50, 0xa8, 0x37, 0x1a, 0xad, 0x03, 0xee, 0x88, 0x37, 0x90,
+ 0x24, 0x9a, 0xe6, 0x92, 0x70, 0xd0, 0x25, 0x2a, 0x32, 0x9f, 0xb4, 0x24,
+ 0x18, 0xee, 0x08, 0xb2, 0xac, 0x63, 0x76, 0x1a, 0xd0, 0x70, 0x18, 0x11,
+ 0x76, 0x8c, 0x3e, 0xd6, 0x07, 0xad, 0x77, 0xa2, 0x05, 0xf2, 0xa8, 0x43,
+ 0xf4, 0x92, 0x68, 0x2f, 0xc3, 0xe4, 0xab, 0x7b, 0x67, 0x38, 0x79, 0x45,
+ 0xde, 0xd1, 0x2b, 0x76, 0xb5, 0x4a, 0x79, 0xe6, 0x28, 0xf1, 0xfc, 0x5a,
+ 0x6a, 0x8d, 0x3f, 0x78, 0xbc, 0x52, 0x46, 0x00, 0x2d, 0x6a, 0xb4, 0x8a,
+ 0x0c, 0xfd, 0xb8, 0xc7, 0xc0, 0x8e, 0xd6, 0xd2, 0x12, 0xba, 0x61, 0x7b,
+ 0xac, 0xfa, 0x7c, 0xa9, 0xac, 0xe5, 0x43, 0x6d, 0x13, 0xa5, 0xb4, 0x51,
+ 0x79, 0x9f, 0xb4, 0xd5, 0x12, 0xca, 0x54, 0x1c, 0x20, 0x1f, 0xb1, 0x9b,
+ 0x85, 0x4d, 0x29, 0x8c, 0xa8, 0x8b, 0xfd, 0x91, 0x51, 0x1a, 0xce, 0x04,
+ 0x26, 0x82, 0x1e, 0x86, 0x41, 0x68, 0xae, 0x44, 0x87, 0xff, 0x31, 0xc6,
+ 0xab, 0xa5, 0x27, 0xdd, 0x4f, 0x96, 0x0a, 0x52, 0xa3, 0xd4, 0x96, 0x66,
+ 0x63, 0x3a, 0x4c, 0x33, 0x97, 0xe5, 0x51, 0x4f, 0x0d, 0x74, 0x32, 0x4e,
+ 0xbe, 0x44, 0xb8, 0x18, 0xaa, 0x04, 0xeb, 0x1e, 0xef, 0x2e, 0x4e, 0xfb,
+ 0x89, 0xd4, 0x56, 0x24, 0xc0, 0xa7, 0x59, 0xe9, 0xb8, 0x6e, 0xe4, 0xa8,
+ 0xcc, 0x99, 0x97, 0x8e, 0xc7, 0x52, 0x3b, 0x86, 0x25, 0x12, 0xdb, 0x70,
+ 0x7e, 0x9a, 0x26, 0x6b, 0x45, 0xc8, 0x84, 0x2e, 0x29, 0x56, 0xda, 0x48,
+ 0x30, 0xd3, 0x83, 0x9b, 0x48, 0x25, 0x84, 0xfb, 0x50, 0x3b, 0x6d, 0x69,
+ 0x8d, 0x34, 0x6d, 0x9f, 0x93, 0x41, 0xc9, 0x59, 0x11, 0x49, 0x29, 0x95,
+ 0x50, 0x24, 0xd1, 0xa1, 0x25, 0x58, 0x1e, 0xe4, 0x94, 0x2e, 0x2b, 0x2f,
+ 0x20, 0xd9, 0xbb, 0xc9, 0xcd, 0xba, 0x16, 0x3d, 0xa6, 0x5b, 0x5b, 0x8e,
+ 0x99, 0xca, 0xaf, 0xc1, 0x87, 0x63, 0xf0, 0x60, 0xc2, 0xd7, 0x39, 0xef,
+ 0x58, 0xbc, 0x70, 0x62, 0x0b, 0x04, 0xdb, 0x4f, 0x5a, 0x87, 0x42, 0x15,
+ 0x4e, 0xee, 0x9a, 0xcb, 0x67, 0x8d, 0x72, 0xbe, 0xf3, 0x4e, 0x71, 0xc9,
+ 0x34, 0x74, 0xfa, 0x51, 0xc3, 0xa1, 0xef, 0xf3, 0xa8, 0x3b, 0x6f, 0x9f,
+ 0x5f, 0xb1, 0x9d, 0x26, 0x3a, 0xae, 0xae, 0x54, 0x36, 0xcb, 0x3e, 0x42,
+ 0xc9, 0x29, 0x58, 0xa7, 0xf4, 0x1e, 0x59, 0x03, 0xf6, 0xd3, 0xd8, 0xe1,
+ 0x01, 0xaf, 0x12, 0x91, 0x8c, 0x95, 0xd0, 0x1d, 0x65, 0x2f, 0x53, 0xe1,
+ 0x9a, 0x49, 0x95, 0x2f, 0x1a, 0x0e, 0xff, 0x06, 0x65, 0xb5, 0xe3, 0x6a,
+ 0xd8, 0xf5, 0xac, 0x1c, 0xa7, 0x7c, 0x4e, 0x2c, 0xd8, 0x43, 0xdd, 0x4e,
+ 0x2d, 0xc2, 0x4f, 0x94, 0x0a, 0x36, 0xdb, 0x33, 0x92, 0xa8, 0x63, 0x86,
+ 0x3c, 0x38, 0x40, 0xbd, 0x4b, 0x8a, 0x47, 0xad, 0xfb, 0xa0, 0xfd, 0x04,
+ 0x73, 0x6a, 0x0d, 0xae, 0xfa, 0x72, 0x82, 0x35, 0xe3, 0x11, 0x58, 0x99,
+ 0xda, 0x3b, 0x57, 0x81, 0x2a, 0x84, 0xcc, 0xe4, 0xe9, 0x32, 0x6b, 0x43,
+ 0x67, 0x36, 0x25, 0x5a, 0x27, 0xc5, 0x4f, 0x00, 0xdf, 0xb0, 0xb5, 0xb5,
+ 0x25, 0x2a, 0x16, 0x85, 0x85, 0x10, 0xbd, 0xa6, 0xad, 0x3e, 0xad, 0x35,
+ 0x60, 0x0b, 0xba, 0x99, 0x5c, 0xe7, 0x14, 0x91, 0xe8, 0xcd, 0x15, 0xb3,
+ 0xf7, 0x57, 0x41, 0x19, 0xd3, 0x2b, 0xd6, 0xd3, 0x80, 0xf3, 0xe4, 0x35,
+ 0x59, 0x33, 0x33, 0x3e, 0x53, 0xef, 0x7e, 0x4b, 0xaa, 0xd9, 0x4f, 0xc7,
+ 0xaf, 0x28, 0x88, 0x36, 0x2e, 0xf8, 0x6d, 0x66, 0x71, 0x8b, 0xaa, 0x08,
+ 0x73, 0xf6, 0x4a, 0x8a, 0xf8, 0x2f, 0x38, 0xe7, 0xb4, 0xf0, 0x0b, 0x4b,
+ 0x83, 0x78, 0x66, 0x0d, 0x9d, 0x14, 0xa9, 0x6b, 0x8c, 0x32, 0xae, 0x58,
+ 0x73, 0x68, 0xa1, 0xe2, 0xb8, 0xd5, 0x0d, 0x95, 0x35, 0x13, 0xef, 0x97,
+ 0xd3, 0x2c, 0x9d, 0xc5, 0xa8, 0xb6, 0xa9, 0xc3, 0xe4, 0x6d, 0x64, 0xe1,
+ 0x46, 0x8c, 0xa7, 0x85, 0xf8, 0xad, 0x05, 0x77, 0xca, 0xb0, 0xab, 0x42,
+ 0xb2, 0x3a, 0xb5, 0x87, 0x38, 0x55, 0x11, 0x43, 0x87, 0x08, 0xdf, 0x6f,
+ 0x85, 0x5f, 0x41, 0x59, 0x82, 0x25, 0xea, 0xe4, 0x20, 0xf4, 0xd0, 0xff,
+ 0xdf, 0x9c, 0xda, 0x07, 0xb0, 0x03, 0x80, 0x11, 0xee, 0x36, 0x27, 0x8e,
+ 0x38, 0xce, 0xeb, 0xe2, 0x72, 0xeb, 0x02, 0x65, 0xa7, 0x8e, 0x31, 0xdc,
+ 0x80, 0xc4, 0xe4, 0xb6, 0x9c, 0x43, 0x84, 0xbb, 0x45, 0x72, 0x2c, 0xc2,
+ 0x95, 0xbe, 0xcd, 0x14, 0x2a, 0x02, 0xfb, 0x82, 0x17, 0xa0, 0xb1, 0xe9,
+ 0x6e, 0xd4, 0x9a, 0xc8, 0x19, 0x16, 0x32, 0xfb, 0xfb, 0x2b, 0x8a, 0xbf,
+ 0x48, 0xc5, 0x47, 0xd9, 0x63, 0x38, 0xec, 0x75, 0x7a, 0x65, 0x8b, 0xb1,
+ 0x8a, 0x00, 0x2f, 0x27, 0x66, 0x0a, 0xb9, 0x50, 0x34, 0x7e, 0x56, 0x44,
+ 0x72, 0x52, 0x58, 0x5c, 0x93, 0x94, 0xb4, 0xd7, 0x2e, 0x1d, 0x04, 0x85,
+ 0x4f, 0xd6, 0xb3, 0x7c, 0x61, 0x7d, 0x9c, 0x7d, 0x22, 0x50, 0x65, 0x18,
+ 0x07, 0x05, 0x68, 0xef, 0x42, 0xb2, 0xc0, 0x4e, 0x61, 0x4a, 0x61, 0x96,
+ 0x9c, 0x91, 0xfa, 0xbf, 0xd5, 0x69, 0xff, 0xe9, 0xee, 0x1e, 0xba, 0xfb,
+ 0x74, 0xf7, 0x93, 0xed, 0xf6, 0xdd, 0x3c, 0xab, 0xb3, 0x01, 0x70, 0x3c,
+ 0x71, 0x1d, 0x95, 0xab, 0x9b, 0x38, 0x3f, 0x0f, 0xf4, 0x51, 0x7a, 0x49,
+ 0xc0, 0x3f, 0xd3, 0x65, 0xa5, 0x88, 0x38, 0x2a, 0x78, 0x43, 0x36, 0x63,
+ 0x7d, 0x43, 0x74, 0x66, 0xc1, 0x5d, 0xef, 0xde, 0x81, 0x31, 0x05, 0x17,
+ 0x3a, 0xcf, 0x94, 0xd9, 0x3d, 0xf4, 0xae, 0x2d, 0x94, 0x22, 0x93, 0xc1,
+ 0xe0, 0x22, 0xb2, 0x18, 0x43, 0x6a, 0x59, 0x9f, 0xc3, 0x89, 0x93, 0x10,
+ 0x38, 0x8a, 0xd2, 0x2e, 0x9d, 0x66, 0x25, 0xcf, 0xeb, 0xbc, 0xc8, 0xeb,
+ 0x1b, 0x94, 0x5c, 0xab, 0xeb, 0xf4, 0x3a, 0x0b, 0xd3, 0x54, 0x8d, 0x48,
+ 0x32, 0x86, 0x93, 0x94, 0x46, 0x06, 0xb1, 0x33, 0x61, 0x71, 0xf8, 0x3c,
+ 0x08, 0x8c, 0x5f, 0xca, 0xb2, 0x80, 0x6d, 0xc8, 0x0d, 0x73, 0x45, 0x59,
+ 0x63, 0x57, 0x2c, 0x68, 0x55, 0xad, 0x20, 0x2a, 0x60, 0x01, 0xe2, 0x19,
+ 0x2e, 0x2d, 0xc0, 0xb5, 0x05, 0x02, 0xc4, 0x1e, 0xf9, 0x11, 0xb6, 0x68,
+ 0x71, 0xcf, 0x46, 0x46, 0x08, 0xed, 0x12, 0x16, 0x6a, 0x96, 0x82, 0x93,
+ 0xd6, 0xfc, 0xcd, 0xfc, 0xec, 0x07, 0xa3, 0x91, 0x0e, 0x3f, 0xb3, 0x3f,
+ 0xde, 0x7e, 0x5c, 0x71, 0xa1, 0xfd, 0x8e, 0x86, 0x46, 0xf0, 0x44, 0x71,
+ 0x67, 0xc3, 0x60, 0x79, 0xc9, 0xff, 0x58, 0xe1, 0x84, 0x40, 0xd6, 0x58,
+ 0x72, 0xf2, 0xe6, 0x90, 0xa0, 0x18, 0x23, 0x49, 0x9b, 0x68, 0x23, 0x19,
+ 0x5b, 0x59, 0x36, 0xa8, 0xb4, 0x44, 0x0a, 0x6b, 0x94, 0x39, 0xcb, 0x92,
+ 0x5d, 0x32, 0xa8, 0xaa, 0xc5, 0x65, 0xcc, 0x5c, 0xe2, 0x33, 0xaa, 0x29,
+ 0x41, 0xa7, 0xc0, 0xc8, 0xc8, 0x53, 0xa9, 0xe2, 0x4d, 0x25, 0xc1, 0x23,
+ 0xf9, 0x38, 0x9b, 0x2f, 0x3c, 0xde, 0x5e, 0x21, 0x36, 0x07, 0x3d, 0xe6,
+ 0xe7, 0x84, 0xd3, 0x24, 0xaa, 0x02, 0xfe, 0xa6, 0xac, 0x01, 0x43, 0x0e,
+ 0xe3, 0xd1, 0x55, 0x85, 0x50, 0x09, 0xf7, 0x56, 0x1b, 0xc5, 0xc1, 0x45,
+ 0xfc, 0x88, 0xd5, 0xb8, 0x33, 0x6e, 0xd5, 0xe9, 0x36, 0x03, 0x26, 0x1a,
+ 0x82, 0x32, 0x33, 0x07, 0x86, 0x54, 0x3a, 0x74, 0x25, 0xaf, 0xb8, 0x4f,
+ 0xdc, 0x19, 0xb8, 0xbb, 0x26, 0x93, 0x9c, 0x74, 0x17, 0x9c, 0x7c, 0xf3,
+ 0xcb, 0xeb, 0xeb, 0x28, 0xd6, 0xc4, 0x4c, 0x01, 0x2d, 0x3c, 0x8d, 0xf9,
+ 0x2a, 0x4b, 0x1b, 0x68, 0x1c, 0x74, 0xd3, 0xaf, 0xc6, 0x93, 0x3a, 0x0d,
+ 0x3e, 0xf2, 0x8c, 0x37, 0x8a, 0x17, 0x3e, 0x6a, 0x3f, 0xbe, 0x0b, 0xb0,
+ 0x09, 0x78, 0x0f, 0x10, 0x55, 0x1e, 0x7e, 0x66, 0xbd, 0x50, 0x57, 0xa9,
+ 0xd9, 0x14, 0xf7, 0x7d, 0x2d, 0xbc, 0xde, 0x58, 0x09, 0x92, 0xcd, 0x97,
+ 0xdd, 0x2d, 0x3e, 0x53, 0xb4, 0x22, 0x83, 0x7a, 0x89, 0x91, 0x9f, 0xf1,
+ 0x9f, 0x09, 0x33, 0x58, 0x13, 0x9b, 0x97, 0xc5, 0x01, 0x27, 0xca, 0x4a,
+ 0xef, 0xe0, 0xbd, 0x41, 0x81, 0x53, 0x0f, 0xec, 0x2b, 0xca, 0x8a, 0x5a,
+ 0x82, 0xc0, 0x2b, 0x0b, 0x24, 0xdd, 0xf7, 0x0e, 0x1d, 0x09, 0x96, 0xf7,
+ 0x32, 0xc4, 0xf2, 0xb2, 0x21, 0x61, 0x24, 0xd1, 0x0e, 0x0e, 0x09, 0x83,
+ 0xac, 0x27, 0xc4, 0x10, 0x01, 0x21, 0x53, 0x26, 0x17, 0xaf, 0x8f, 0x92,
+ 0xfd, 0x27, 0x9f, 0x7e, 0x3a, 0x8c, 0x12, 0x08, 0x72, 0x82, 0xa5, 0xd9,
+ 0x84, 0x34, 0x53, 0x8e, 0x6d, 0xae, 0x6f, 0x69, 0x43, 0x51, 0xe9, 0x3d,
+ 0x4b, 0x0b, 0xa6, 0xed, 0x9e, 0x13, 0x31, 0x08, 0x09, 0xc7, 0xe5, 0x2c,
+ 0x34, 0xf2, 0x11, 0xbb, 0x9a, 0x93, 0x62, 0x21, 0x52, 0x0c, 0x0a, 0x16,
+ 0x49, 0x8d, 0x79, 0xbe, 0x42, 0xa9, 0xcb, 0x04, 0x27, 0x65, 0xab, 0x7b,
+ 0xc3, 0x05, 0xc0, 0xe0, 0x3d, 0x46, 0x42, 0x1a, 0xbd, 0x01, 0xb0, 0x5f,
+ 0x0e, 0xbe, 0xf3, 0x74, 0x6c, 0x46, 0xd2, 0x29, 0x69, 0x7e, 0x36, 0x13,
+ 0x0d, 0x9f, 0x8d, 0x33, 0x9b, 0x21, 0xcd, 0x85, 0x3b, 0x3a, 0x24, 0x41,
+ 0x9c, 0xf4, 0x59, 0x50, 0xa6, 0x0c, 0x51, 0xc5, 0x9b, 0x0f, 0x74, 0x9a,
+ 0x43, 0x8e, 0xe3, 0x75, 0xd6, 0x84, 0xd9, 0x1d, 0x1e, 0xcc, 0x72, 0x4d,
+ 0xe3, 0x31, 0xcb, 0x48, 0x92, 0x53, 0x92, 0x17, 0xca, 0xe3, 0xaf, 0x35,
+ 0x9c, 0x27, 0x60, 0x15, 0x63, 0x7a, 0xf5, 0x2f, 0xb1, 0x1a, 0x2f, 0x64,
+ 0xea, 0x25, 0x59, 0xeb, 0xcb, 0x28, 0x73, 0x90, 0x60, 0x3d, 0x41, 0x63,
+ 0xd3, 0x34, 0x46, 0xb1, 0x76, 0xb2, 0x1b, 0xc0, 0x5a, 0x30, 0x96, 0x08,
+ 0xf4, 0x53, 0x8b, 0x89, 0xd3, 0x86, 0x9d, 0xc5, 0x28, 0xfd, 0x5e, 0xd8,
+ 0x46, 0xa5, 0x50, 0x00, 0x61, 0x9b, 0xa9, 0x2b, 0xb1, 0x99, 0x50, 0x02,
+ 0x60, 0x92, 0x0f, 0xe6, 0xe9, 0xc0, 0xee, 0xa1, 0x77, 0xbd, 0x79, 0x8a,
+ 0x50, 0x4c, 0x80, 0xeb, 0xee, 0xc0, 0x86, 0x53, 0xa9, 0x52, 0xdf, 0x5c,
+ 0x76, 0x8c, 0x6a, 0x77, 0x0a, 0xc9, 0xe7, 0x3b, 0x78, 0xd3, 0xec, 0x4d,
+ 0x6a, 0x6b, 0x33, 0x82, 0xfc, 0x6a, 0x5c, 0xbe, 0x84, 0x35, 0xa6, 0x70,
+ 0x1a, 0xb8, 0x27, 0x96, 0xa3, 0x8b, 0x2e, 0xab, 0x2a, 0x35, 0x7b, 0xf1,
+ 0x6f, 0x8b, 0x6b, 0xc7, 0x87, 0x7e, 0x13, 0x16, 0x1e, 0x30, 0x7a, 0x58,
+ 0x58, 0x44, 0x04, 0x87, 0x74, 0xf0, 0x3a, 0x91, 0x8e, 0xbc, 0xfc, 0xb2,
+ 0xd5, 0x9c, 0x72, 0x6d, 0xfb, 0x54, 0xb2, 0x82, 0x0a, 0x9d, 0x5c, 0xe7,
+ 0x91, 0x94, 0x3a, 0xa1, 0x02, 0xe0, 0x9d, 0xe5, 0xa0, 0xc0, 0x7e, 0x4c,
+ 0x43, 0x77, 0x19, 0x82, 0xf7, 0x2e, 0x04, 0x3f, 0xcb, 0x62, 0x15, 0x8b,
+ 0x6c, 0x54, 0xf9, 0x9a, 0x2c, 0x24, 0x29, 0x62, 0x4b, 0xa4, 0x00, 0xba,
+ 0xa3, 0xc8, 0x5b, 0xdb, 0x54, 0xcb, 0x49, 0xc3, 0x85, 0x04, 0xe4, 0x6b,
+ 0xd0, 0x19, 0x43, 0xb4, 0x17, 0xef, 0x26, 0x10, 0x0d, 0x54, 0xd9, 0xf5,
+ 0x92, 0x2e, 0x50, 0xee, 0x0b, 0x53, 0xe5, 0x8c, 0x97, 0xd8, 0xb9, 0x53,
+ 0x0b, 0xc9, 0x23, 0x2f, 0x84, 0xb5, 0xee, 0x03, 0xa7, 0x05, 0x79, 0x02,
+ 0xf2, 0x7f, 0x48, 0x90, 0x4a, 0xbc, 0x5f, 0xc4, 0x07, 0xc8, 0x8c, 0x4b,
+ 0xf0, 0xf1, 0x64, 0x44, 0x03, 0xfe, 0x8a, 0x8a, 0x72, 0xb1, 0x1a, 0x43,
+ 0x67, 0x6d, 0x93, 0x53, 0x1f, 0xbb, 0xdb, 0x8b, 0x37, 0x16, 0xdf, 0xc6,
+ 0xa4, 0xc4, 0xfa, 0x1d, 0x74, 0x65, 0xcf, 0xf5, 0x89, 0x45, 0xbe, 0x40,
+ 0x15, 0x04, 0x35, 0x67, 0xb7, 0x23, 0x16, 0xcc, 0xb2, 0x30, 0xd3, 0xd5,
+ 0x2c, 0x29, 0x84, 0x67, 0x09, 0x2d, 0x8c, 0xf0, 0xfe, 0x9b, 0x50, 0xa5,
+ 0xca, 0x70, 0xb9, 0x7c, 0xdc, 0xd4, 0xee, 0x1c, 0x60, 0x40, 0x42, 0x31,
+ 0x78, 0x9b, 0x81, 0x24, 0x89, 0xf0, 0x0c, 0x8d, 0x8a, 0x3f, 0x14, 0x6e,
+ 0x81, 0x3f, 0xf0, 0x73, 0x0a, 0xf4, 0x4d, 0x32, 0x47, 0x0c, 0x89, 0x89,
+ 0x21, 0x55, 0xa2, 0x00, 0xa1, 0x5a, 0xe0, 0x49, 0xbf, 0x72, 0x61, 0x0c,
+ 0x6b, 0xcf, 0x43, 0xf5, 0x34, 0x42, 0x9a, 0x33, 0x5d, 0x84, 0xb2, 0x84,
+ 0x4a, 0x4b, 0x13, 0x92, 0xbe, 0x26, 0x9b, 0x11, 0x27, 0x28, 0xf4, 0xd0,
+ 0x54, 0xd9, 0xdf, 0xac, 0xa9, 0x4f, 0x12, 0x3f, 0x38, 0x99, 0x6a, 0xf0,
+ 0x72, 0x90, 0xb1, 0xf1, 0x62, 0xa8, 0x4c, 0xf0, 0xe1, 0xdf, 0x44, 0xbc,
+ 0xea, 0x40, 0x2c, 0xd9, 0x70, 0x46, 0x17, 0xb3, 0xcf, 0x5a, 0x4d, 0x9f,
+ 0xe3, 0x21, 0x92, 0x02, 0xed, 0x12, 0x59, 0x57, 0x1f, 0xb2, 0xde, 0x5d,
+ 0x36, 0x7e, 0xf9, 0x25, 0xb9, 0x49, 0x3e, 0x82, 0xe1, 0x99, 0xd5, 0x23,
+ 0x12, 0x36, 0x3b, 0x20, 0x7c, 0x4e, 0xbc, 0x73, 0xd6, 0x6d, 0xa4, 0xac,
+ 0x56, 0x37, 0xeb, 0xe5, 0x10, 0x78, 0x4d, 0x5e, 0x95, 0xe5, 0xda, 0x16,
+ 0x69, 0x56, 0xd8, 0x0f, 0x80, 0x79, 0xf1, 0xe0, 0x49, 0x0c, 0xda, 0x71,
+ 0x19, 0x52, 0x2c, 0x71, 0xec, 0xd9, 0x15, 0xb9, 0x1b, 0x4b, 0x59, 0x45,
+ 0x95, 0x60, 0x36, 0xf7, 0x34, 0xa6, 0xf6, 0xb2, 0xcf, 0x10, 0xfd, 0x28,
+ 0xa7, 0xbf, 0x1b, 0x03, 0x4b, 0x1f, 0xb0, 0x61, 0xd0, 0x5f, 0x3f, 0xb7,
+ 0xaf, 0xd3, 0x7f, 0x8c, 0xf0, 0x02, 0x67, 0xea, 0x9a, 0xd1, 0x98, 0xc3,
+ 0xaf, 0xaf, 0xec, 0x70, 0x01, 0x5e, 0xad, 0x75, 0xb6, 0xd9, 0x67, 0x85,
+ 0xed, 0xf3, 0x4d, 0x1c, 0x74, 0x45, 0x8e, 0xa0, 0x96, 0x06, 0xf6, 0x0c,
+ 0x95, 0xd7, 0xe8, 0xee, 0x78, 0x42, 0x57, 0x71, 0xb5, 0x0d, 0xf4, 0x7e,
+ 0x45, 0xc7, 0x49, 0x7d, 0x4b, 0xb4, 0xef, 0x3f, 0xf5, 0x6c, 0xef, 0x7f,
+ 0xea, 0xb9, 0xfe, 0xff, 0xd4, 0x73, 0x23, 0xf8, 0xa9, 0xd7, 0x03, 0xad,
+ 0x67, 0x10, 0x80, 0xfd, 0xe5, 0x8b, 0xbe, 0xc9, 0x1f, 0x75, 0xdf, 0xf4,
+ 0x3e, 0xe9, 0x7d, 0xb1, 0xb7, 0xb9, 0x6e, 0xd2, 0x5c, 0xaa, 0x66, 0x7e,
+ 0xe5, 0x11, 0x81, 0xf1, 0x04, 0x92, 0x0c, 0x91, 0x49, 0xd2, 0x59, 0x72,
+ 0xb3, 0x82, 0xb2, 0x10, 0x81, 0xe7, 0xd5, 0x7b, 0x82, 0xa6, 0xdc, 0xd5,
+ 0x0e, 0xf1, 0x58, 0xb1, 0x2d, 0xdb, 0x98, 0x2e, 0x84, 0xd6, 0x9d, 0x0b,
+ 0x8a, 0x11, 0xda, 0xd7, 0x83, 0x03, 0xfd, 0x3f, 0xcc, 0x17, 0x2c, 0x0a,
+ 0x48, 0x53, 0x4a, 0x52, 0x41, 0x08, 0x01, 0xfc, 0x58, 0x70, 0x00, 0x4c,
+ 0xd4, 0x4e, 0x42, 0xf1, 0x93, 0x7f, 0x44, 0xf7, 0x44, 0x80, 0x8d, 0x9d,
+ 0xe7, 0xa8, 0x19, 0x63, 0x86, 0x35, 0x63, 0x53, 0x67, 0x87, 0x2e, 0x41,
+ 0x60, 0xd9, 0x50, 0xc9, 0xa5, 0x86, 0xad, 0x27, 0x56, 0x90, 0x54, 0x63,
+ 0xe1, 0x89, 0x58, 0xb5, 0x33, 0x68, 0x63, 0x6c, 0x52, 0xa3, 0x55, 0xfd,
+ 0xb2, 0x67, 0x2e, 0x95, 0xcf, 0xcd, 0x1d, 0x56, 0x19, 0x5d, 0xe8, 0x73,
+ 0xda, 0x5b, 0x4b, 0xb3, 0x5a, 0xee, 0xa0, 0x7e, 0x1c, 0xcc, 0xef, 0x4d,
+ 0xe7, 0x37, 0x7f, 0xc9, 0xce, 0xb0, 0x22, 0x6d, 0x4a, 0x65, 0x95, 0xea,
+ 0xc6, 0xdc, 0x1e, 0x9d, 0x20, 0xb4, 0x9c, 0x5a, 0x76, 0x22, 0xcb, 0x99,
+ 0xd4, 0x67, 0x5e, 0xc6, 0x58, 0x8f, 0x82, 0x81, 0xb8, 0xc3, 0xc9, 0x3a,
+ 0xff, 0xcb, 0xb3, 0x6f, 0x3f, 0xd7, 0x06, 0x7e, 0xea, 0xfd, 0x30, 0xe0,
+ 0x9f, 0x22, 0x17, 0xef, 0x20, 0x39, 0xfb, 0x96, 0x36, 0xf7, 0x2f, 0x13,
+ 0x60, 0xeb, 0x3e, 0xf0, 0x25, 0xff, 0x05, 0x3b, 0x7b, 0x5d, 0xb3, 0x97,
+ 0x5e, 0x28, 0xfc, 0x25, 0xaa, 0xf6, 0x21, 0x77, 0x00, 0x06, 0xdd, 0x62,
+ 0x41, 0xd9, 0x00, 0x9a, 0x7d, 0xd6, 0x70, 0xf6, 0x19, 0x12, 0xf2, 0xc7,
+ 0x25, 0x8c, 0xcf, 0x26, 0xa4, 0x2e, 0x05, 0x75, 0xe2, 0xdf, 0x65, 0x7f,
+ 0xd1, 0x96, 0x32, 0xf6, 0x2f, 0xe2, 0x1d, 0x3a, 0xbd, 0x5c, 0x8d, 0x37,
+ 0x9d, 0xb6, 0xf3, 0x90, 0xcc, 0x79, 0x38, 0x8e, 0xd0, 0x54, 0x3b, 0x9e,
+ 0x0b, 0xfe, 0x1b, 0xee, 0x38, 0xd0, 0x79, 0x90, 0xae, 0x4e, 0xf5, 0x6e,
+ 0xd2, 0x2a, 0xd3, 0x1a, 0x06, 0x52, 0x5d, 0x89, 0xab, 0xe8, 0x7c, 0x1e,
+ 0xf3, 0x2a, 0x4b, 0xb0, 0x4b, 0x80, 0xa5, 0x57, 0xe5, 0x4c, 0x2b, 0xb3,
+ 0x9b, 0x9d, 0xcf, 0x2b, 0x6c, 0x0b, 0x1a, 0xdd, 0x95, 0x04, 0x07, 0x9f,
+ 0x8a, 0xd3, 0x5b, 0x3e, 0x1b, 0x53, 0x31, 0x25, 0x3a, 0x25, 0x21, 0x7c,
+ 0xae, 0xb7, 0x25, 0xf4, 0x31, 0xd8, 0xfa, 0xa6, 0x23, 0xf3, 0x71, 0x06,
+ 0x37, 0x86, 0x66, 0x57, 0x0d, 0xc4, 0xcf, 0x18, 0x71, 0x05, 0x74, 0x8f,
+ 0x0d, 0x62, 0xe3, 0x92, 0x60, 0x45, 0x84, 0x22, 0xdf, 0x90, 0xda, 0xcb,
+ 0x99, 0x2e, 0x45, 0x62, 0x2b, 0x0f, 0x40, 0xc3, 0x4d, 0xe3, 0x83, 0xb5,
+ 0x85, 0xcb, 0x69, 0x86, 0xc2, 0xd3, 0x96, 0xfc, 0x51, 0xdc, 0x92, 0x5e,
+ 0x7d, 0x73, 0x8c, 0x5e, 0xd6, 0x6b, 0x18, 0xbc, 0xf0, 0x83, 0xc0, 0x3e,
+ 0x06, 0x7b, 0x07, 0x5e, 0x1d, 0x09, 0xfe, 0x59, 0xbc, 0x79, 0x9f, 0x63,
+ 0x41, 0xe3, 0x8d, 0xb5, 0x4c, 0xff, 0x9a, 0xf6, 0xf7, 0x6d, 0xfb, 0x1b,
+ 0x11, 0x5a, 0x03, 0x26, 0x1e, 0x88, 0x7f, 0xf6, 0xd2, 0x87, 0x24, 0x89,
+ 0x2f, 0xce, 0xb3, 0x8a, 0x13, 0x36, 0x48, 0xd5, 0x22, 0xad, 0xfb, 0x2d,
+ 0xe2, 0x83, 0xf0, 0x7b, 0xc8, 0x2f, 0x98, 0x32, 0xe0, 0x95, 0x47, 0x62,
+ 0x26, 0xb2, 0x03, 0xcc, 0x90, 0x02, 0xa1, 0xbc, 0xb3, 0xca, 0x39, 0x51,
+ 0xf2, 0x4d, 0x0f, 0x5c, 0xf9, 0x31, 0x98, 0x94, 0x6a, 0x3a, 0xb3, 0x7a,
+ 0xec, 0x72, 0xe0, 0xc2, 0x54, 0xa5, 0x16, 0x13, 0x65, 0xf0, 0x29, 0xc8,
+ 0x63, 0x61, 0xca, 0x84, 0xd2, 0x27, 0xc7, 0x61, 0x6b, 0x53, 0x4c, 0x74,
+ 0xfa, 0x18, 0x15, 0xee, 0x02, 0xe2, 0x05, 0xec, 0x03, 0x94, 0xb6, 0xc7,
+ 0x13, 0x30, 0x88, 0xe8, 0x1d, 0x07, 0x48, 0x0c, 0xb3, 0xa7, 0x82, 0x99,
+ 0x38, 0x40, 0xc4, 0xa1, 0xb6, 0x08, 0xaa, 0x48, 0xb6, 0xd9, 0x37, 0x82,
+ 0x6e, 0xa5, 0xde, 0x0c, 0x4b, 0x63, 0x52, 0xe1, 0xd8, 0x62, 0xa7, 0xd2,
+ 0x64, 0xf3, 0xe5, 0xf6, 0xa6, 0x1d, 0xda, 0x1a, 0x1b, 0xb0, 0xb5, 0x69,
+ 0x34, 0x9c, 0x65, 0xeb, 0xf1, 0xb1, 0x33, 0x6f, 0x8e, 0x3a, 0x16, 0xd9,
+ 0x80, 0x57, 0x33, 0x4a, 0xa7, 0x54, 0x6b, 0xae, 0x3b, 0xca, 0xbe, 0xe3,
+ 0x74, 0x32, 0x99, 0x02, 0x6f, 0xf2, 0x74, 0x66, 0x7a, 0x48, 0x79, 0x4d,
+ 0xb7, 0x4a, 0x05, 0x57, 0x1f, 0x30, 0x61, 0x64, 0xcc, 0x86, 0xa5, 0x2e,
+ 0x50, 0x54, 0x00, 0x1c, 0xd7, 0x62, 0x0f, 0xd5, 0x7e, 0xa5, 0xbe, 0xd5,
+ 0xfa, 0xd9, 0xe6, 0xcb, 0x2d, 0xbe, 0xb1, 0x9c, 0x6b, 0xc6, 0xfb, 0xf6,
+ 0x66, 0xf2, 0x53, 0x3c, 0x57, 0x2d, 0xe1, 0x77, 0x5d, 0x8f, 0x74, 0xcf,
+ 0x3e, 0xf4, 0x46, 0xf2, 0x62, 0x5c, 0x4e, 0xef, 0xbf, 0x40, 0x0c, 0x43,
+ 0x5e, 0x79, 0xb1, 0x83, 0x1f, 0x75, 0x94, 0xe6, 0x55, 0x0d, 0xa1, 0x15,
+ 0xb3, 0x54, 0xf8, 0xf3, 0x4b, 0x7a, 0x1c, 0x46, 0x7b, 0xf3, 0xb1, 0xd9,
+ 0x4c, 0x86, 0x43, 0x23, 0x8a, 0xea, 0x39, 0x4a, 0xa6, 0xac, 0xb9, 0x5a,
+ 0x40, 0x7e, 0x24, 0x1b, 0xc1, 0x32, 0x52, 0x48, 0xc1, 0x24, 0x35, 0x5a,
+ 0xd4, 0xa3, 0xc5, 0xbf, 0xae, 0x5e, 0x52, 0x05, 0x35, 0x85, 0x5e, 0x6c,
+ 0x44, 0x38, 0x2d, 0xcc, 0xc3, 0x0a, 0x34, 0xf2, 0xd2, 0x39, 0x3f, 0x1d,
+ 0xe7, 0xe2, 0xb5, 0x9d, 0x96, 0x2d, 0x22, 0x36, 0xce, 0x9a, 0x36, 0x97,
+ 0x7c, 0x5c, 0x78, 0x4f, 0xca, 0x8a, 0x43, 0x0e, 0x10, 0x10, 0xd6, 0x8c,
+ 0x91, 0xce, 0x0d, 0x8e, 0xe5, 0x8b, 0x2a, 0x4b, 0x8d, 0x9c, 0xf8, 0x84,
+ 0xbe, 0x14, 0xe3, 0x1f, 0xe1, 0x84, 0x34, 0x36, 0xa5, 0x4c, 0x0f, 0x3f,
+ 0x1d, 0xe0, 0x41, 0xaf, 0x82, 0x9f, 0x1e, 0x80, 0x36, 0x36, 0xa0, 0x2f,
+ 0x2a, 0x62, 0x98, 0xf4, 0x9e, 0x17, 0x5c, 0x55, 0x83, 0xc6, 0x47, 0xc5,
+ 0xa9, 0x9f, 0x3f, 0xe5, 0x11, 0xf2, 0x4c, 0x09, 0xbb, 0x51, 0xcb, 0xa9,
+ 0xa7, 0xf7, 0x51, 0x15, 0x46, 0x95, 0xec, 0x18, 0x39, 0x6b, 0x90, 0xf4,
+ 0x34, 0x2a, 0xd6, 0xc2, 0xd8, 0x40, 0xba, 0x58, 0x8d, 0x4e, 0x79, 0x8d,
+ 0x22, 0xbc, 0xc9, 0x27, 0xcf, 0xbd, 0x5e, 0xaf, 0x3e, 0xa0, 0xec, 0xa2,
+ 0xf1, 0x4e, 0x3c, 0x0e, 0xa1, 0x8c, 0x51, 0xc6, 0xe4, 0x06, 0xa1, 0x5b,
+ 0x37, 0xe8, 0x17, 0xb9, 0x77, 0x98, 0xe2, 0x47, 0xc6, 0x68, 0xdd, 0x0c,
+ 0x0f, 0x9d, 0x27, 0xff, 0x34, 0x7c, 0xae, 0xdb, 0xa7, 0xfb, 0xe1, 0xb5,
+ 0xbb, 0xdb, 0xb3, 0x96, 0xf4, 0x7d, 0xee, 0x04, 0xef, 0xf0, 0x87, 0x37,
+ 0x38, 0x39, 0xa6, 0xaf, 0x96, 0x15, 0x17, 0x8e, 0xe7, 0xc7, 0x58, 0x5f,
+ 0xd0, 0x14, 0x04, 0x51, 0xd9, 0xdf, 0x1c, 0xbe, 0x7d, 0x77, 0x78, 0x3a,
+ 0xfc, 0x75, 0x75, 0x81, 0xd6, 0xbe, 0xe6, 0xe5, 0x1c, 0x76, 0xe8, 0x34,
+ 0x1e, 0x4e, 0x46, 0xa6, 0x9c, 0x0f, 0xda, 0x3f, 0x04, 0x2f, 0x88, 0xb3,
+ 0x69, 0x30, 0x6e, 0x53, 0x82, 0xab, 0x1e, 0xee, 0x2f, 0xad, 0xa5, 0x48,
+ 0x56, 0x4f, 0xdf, 0xa7, 0xd7, 0x7b, 0x82, 0x5b, 0xb5, 0x89, 0x9e, 0x11,
+ 0xe9, 0xe9, 0x92, 0x53, 0x2d, 0x70, 0x47, 0xab, 0x89, 0xca, 0xd5, 0xd5,
+ 0xf2, 0x5e, 0x94, 0x57, 0x57, 0x8e, 0xbc, 0xa2, 0x1b, 0x19, 0x3a, 0x3a,
+ 0x5a, 0x9d, 0x31, 0xf7, 0x7b, 0xf2, 0xe4, 0x75, 0xf0, 0xcb, 0x98, 0x46,
+ 0x27, 0xca, 0x07, 0x4d, 0xc9, 0xd9, 0xa4, 0x2f, 0xa4, 0x6f, 0xf1, 0x59,
+ 0x35, 0x1d, 0xf4, 0x03, 0xa1, 0xaa, 0xd1, 0x52, 0x8f, 0xa8, 0x24, 0x1a,
+ 0x26, 0xeb, 0xfc, 0x90, 0xaa, 0xc5, 0x6b, 0x2e, 0xa7, 0x04, 0xb4, 0xfb,
+ 0x81, 0xed, 0xc5, 0x35, 0x6b, 0x49, 0x25, 0xd4, 0xd9, 0x50, 0x88, 0x91,
+ 0x05, 0x03, 0x22, 0x66, 0x60, 0x04, 0xc4, 0xe5, 0x72, 0x6e, 0x0e, 0x85,
+ 0x51, 0x70, 0xa7, 0x9b, 0xb5, 0x84, 0xf0, 0xba, 0x9b, 0x4b, 0x6b, 0x85,
+ 0xeb, 0x5a, 0xd3, 0x0e, 0xa3, 0xb5, 0x1f, 0xa9, 0xa4, 0x4e, 0x5d, 0xc8,
+ 0xd3, 0x23, 0x37, 0xec, 0xc7, 0x5d, 0x3d, 0xbd, 0xd1, 0xc9, 0xe5, 0xb1,
+ 0x99, 0xbe, 0x77, 0x97, 0xdf, 0xf4, 0x24, 0x44, 0xda, 0x4d, 0x63, 0x07,
+ 0x7d, 0x02, 0x55, 0xdd, 0xbb, 0xb5, 0xc9, 0x6e, 0x15, 0x7b, 0x4d, 0x8c,
+ 0x7d, 0x10, 0x93, 0xd9, 0xee, 0xa3, 0xc3, 0x35, 0xab, 0xf4, 0x6c, 0xf8,
+ 0xac, 0xbb, 0x4a, 0xab, 0x89, 0x4a, 0x99, 0xba, 0x32, 0xd8, 0xee, 0xc2,
+ 0x87, 0x49, 0xb8, 0x9b, 0x1d, 0x47, 0x65, 0x8f, 0xe0, 0x0c, 0x88, 0x2a,
+ 0x52, 0xce, 0x64, 0x0d, 0xee, 0x02, 0x25, 0xe6, 0xf2, 0xe2, 0xa9, 0x60,
+ 0xed, 0xb4, 0xcc, 0x1d, 0xe2, 0xc4, 0xe6, 0x30, 0x9a, 0x59, 0xb1, 0xb4,
+ 0x9a, 0xda, 0xac, 0xae, 0x50, 0x19, 0x54, 0xa4, 0x18, 0x15, 0xc8, 0x30,
+ 0x5b, 0x40, 0xf9, 0xf1, 0x5b, 0xc9, 0x76, 0xae, 0xf8, 0xb0, 0xba, 0x8a,
+ 0x5d, 0xd6, 0x5e, 0x9c, 0x46, 0x15, 0xfe, 0x47, 0xf0, 0xe6, 0x5b, 0x3e,
+ 0xd0, 0xb5, 0xd8, 0xb9, 0x38, 0xf3, 0x27, 0xcd, 0xab, 0x20, 0x0d, 0x5e,
+ 0xf0, 0x9f, 0xf1, 0xfd, 0x8e, 0xcb, 0xb5, 0x2a, 0x67, 0xec, 0x31, 0x94,
+ 0x37, 0x18, 0x02, 0xc8, 0x38, 0x7b, 0xf0, 0xb0, 0xc0, 0x01, 0x8e, 0xd0,
+ 0x19, 0xcc, 0x11, 0x54, 0x93, 0x0d, 0x8b, 0xa0, 0x6c, 0x8d, 0xb6, 0x65,
+ 0x0a, 0x19, 0x35, 0x2b, 0xad, 0x45, 0x12, 0x28, 0x3c, 0x9e, 0x32, 0xd1,
+ 0x26, 0x63, 0x44, 0x19, 0xde, 0xe9, 0x0d, 0x0d, 0x24, 0x08, 0xe3, 0xc9,
+ 0xdd, 0x34, 0xae, 0x6d, 0xb1, 0xaf, 0x02, 0xf0, 0x23, 0x40, 0xbb, 0x39,
+ 0x5d, 0xe3, 0xe8, 0xfb, 0x57, 0x5e, 0xe9, 0x03, 0x45, 0x38, 0xf1, 0x7e,
+ 0x11, 0xed, 0x73, 0x15, 0xb1, 0x52, 0xe6, 0x60, 0x7a, 0x43, 0x04, 0xe3,
+ 0xa6, 0x59, 0xb6, 0xb0, 0xa4, 0xb6, 0x28, 0x4d, 0x49, 0xcb, 0x4e, 0xc1,
+ 0x37, 0x21, 0x14, 0x46, 0x71, 0x9f, 0x15, 0xbd, 0x13, 0xd1, 0x61, 0xa3,
+ 0x00, 0xf4, 0xff, 0x54, 0xcb, 0x85, 0xc2, 0x7f, 0x7b, 0x9f, 0x3c, 0xf9,
+ 0xd4, 0xdc, 0xbf, 0xf7, 0x60, 0x99, 0x75, 0x53, 0xc6, 0x2c, 0x90, 0xab,
+ 0x29, 0xb3, 0xc4, 0x84, 0x51, 0x70, 0xa8, 0x64, 0x43, 0x27, 0x35, 0xd9,
+ 0x0c, 0xf0, 0x47, 0x49, 0x6e, 0x62, 0x48, 0x26, 0x61, 0x26, 0x51, 0x26,
+ 0x4c, 0xe0, 0x5a, 0x98, 0x27, 0x86, 0x16, 0x0d, 0xbd, 0x0d, 0x6c, 0x54,
+ 0x38, 0xd4, 0xb5, 0x31, 0x22, 0xe5, 0xe2, 0xf8, 0xf2, 0xc2, 0xfc, 0x31,
+ 0xba, 0x3c, 0xbb, 0x58, 0xc1, 0x73, 0xd6, 0x70, 0x96, 0x3d, 0x4d, 0x9a,
+ 0xc2, 0x1c, 0x30, 0xcd, 0x6d, 0x02, 0x24, 0xe0, 0x68, 0x59, 0xec, 0xd4,
+ 0x51, 0xce, 0x1c, 0x8f, 0x3a, 0xa7, 0x1e, 0xb6, 0x06, 0x7a, 0x65, 0xee,
+ 0x87, 0xb5, 0x03, 0xe3, 0x35, 0x5f, 0xbf, 0x43, 0x30, 0x60, 0xda, 0x8c,
+ 0x34, 0x62, 0x2b, 0xe8, 0xd1, 0x5b, 0x63, 0x9e, 0x51, 0x1c, 0xcd, 0x11,
+ 0x18, 0x6b, 0xbd, 0xd0, 0x15, 0xfc, 0x76, 0x0c, 0xea, 0xac, 0x39, 0x4d,
+ 0x5d, 0xfc, 0x54, 0xe4, 0x01, 0xe8, 0x69, 0x26, 0x6f, 0x2f, 0xd9, 0x82,
+ 0xbf, 0x58, 0x74, 0x8f, 0x07, 0xf6, 0xaf, 0xd1, 0x77, 0xb6, 0xdd, 0x80,
+ 0xeb, 0x72, 0x9e, 0xb1, 0x4b, 0x1f, 0x4e, 0x1f, 0x2b, 0x9c, 0x6a, 0xa9,
+ 0x44, 0x93, 0x73, 0x4a, 0x75, 0x98, 0xce, 0x6e, 0xd9, 0x78, 0x68, 0x95,
+ 0x37, 0x6d, 0x42, 0xb0, 0xd6, 0xc2, 0xe6, 0x75, 0xc9, 0x8c, 0x4d, 0xda,
+ 0x80, 0xe6, 0x68, 0x53, 0x7b, 0xe5, 0xd1, 0xf4, 0xb4, 0x85, 0xf7, 0x5e,
+ 0x57, 0xc8, 0x50, 0x4e, 0x75, 0x5c, 0xb2, 0x10, 0xc2, 0xc1, 0xe6, 0xc6,
+ 0x02, 0xa0, 0xa3, 0xd8, 0x0c, 0xe8, 0x12, 0x7e, 0x45, 0xb7, 0x73, 0x79,
+ 0x8a, 0xd7, 0x36, 0x10, 0x05, 0x10, 0x03, 0x33, 0xb7, 0xb7, 0x65, 0xc9,
+ 0x39, 0xc1, 0x79, 0xd9, 0x15, 0xba, 0x2d, 0x9d, 0x2d, 0x14, 0xb3, 0xaa,
+ 0x9a, 0xf9, 0x25, 0xae, 0xba, 0xc9, 0xe4, 0x8b, 0xc7, 0x57, 0x12, 0x91,
+ 0xcf, 0x74, 0x34, 0x18, 0x58, 0x1d, 0xce, 0xa5, 0x80, 0xa2, 0xa5, 0x51,
+ 0x0a, 0x8c, 0xe4, 0x5d, 0x21, 0xc4, 0x0f, 0x85, 0xb1, 0x20, 0x10, 0x37,
+ 0x9f, 0xda, 0x49, 0x23, 0x46, 0x14, 0x82, 0xfb, 0xf0, 0xa5, 0x35, 0x2d,
+ 0xa1, 0xb2, 0x33, 0x43, 0x6a, 0xc8, 0x9f, 0x05, 0x9f, 0x31, 0xa2, 0xd0,
+ 0x7a, 0xd3, 0x48, 0x7b, 0xce, 0xa2, 0x9a, 0x34, 0xdd, 0x91, 0x22, 0x49,
+ 0x3b, 0x18, 0xe8, 0xb9, 0xbf, 0x68, 0x2c, 0xd2, 0x60, 0xe2, 0x38, 0x59,
+ 0xd0, 0x70, 0xae, 0x34, 0x27, 0x44, 0xab, 0x17, 0x40, 0xb2, 0xd2, 0x8b,
+ 0x68, 0xae, 0x0d, 0x67, 0xa4, 0x6b, 0x7d, 0xe2, 0x56, 0xa6, 0xb7, 0xaa,
+ 0x81, 0xc3, 0x35, 0x3c, 0x41, 0x7e, 0x62, 0x78, 0x6b, 0x4b, 0xee, 0xb5,
+ 0xb4, 0xbe, 0xf6, 0xe8, 0x56, 0x26, 0x1d, 0x62, 0x83, 0x5e, 0xd0, 0x92,
+ 0x29, 0xb9, 0x9b, 0xee, 0x2d, 0xae, 0x0e, 0x6f, 0x0e, 0xfc, 0x0e, 0xe5,
+ 0x38, 0x10, 0xfd, 0x95, 0x31, 0x1e, 0xcb, 0x19, 0x0a, 0x3b, 0xa8, 0xea,
+ 0x16, 0xab, 0x90, 0x09, 0x15, 0x8c, 0x29, 0x34, 0x4c, 0xe3, 0xed, 0x8a,
+ 0x87, 0x5e, 0xe9, 0x20, 0xba, 0x4d, 0xbd, 0xac, 0xef, 0x61, 0x0c, 0x49,
+ 0xcd, 0x48, 0x02, 0x20, 0xe5, 0xda, 0xea, 0x98, 0x16, 0x8a, 0x53, 0x5a,
+ 0x79, 0xac, 0x2b, 0x54, 0x3e, 0xa0, 0xb7, 0x57, 0x24, 0x67, 0x29, 0xa5,
+ 0x3f, 0xd8, 0x5d, 0xcc, 0xac, 0xf4, 0x19, 0x55, 0xd0, 0x3e, 0x99, 0xb0,
+ 0x1c, 0xda, 0x5f, 0xab, 0xb3, 0x66, 0xb9, 0x08, 0xef, 0x79, 0x97, 0xf8,
+ 0x66, 0x5b, 0xe4, 0xea, 0xce, 0x8d, 0xdf, 0xc5, 0xa6, 0x34, 0x77, 0x9b,
+ 0x9d, 0x7e, 0x9f, 0x97, 0x39, 0x30, 0xcf, 0x49, 0x13, 0x08, 0x6e, 0xf7,
+ 0x55, 0x49, 0xc8, 0xfa, 0xeb, 0x21, 0x49, 0x56, 0xa3, 0x5e, 0xec, 0xf6,
+ 0x24, 0xcf, 0x51, 0x92, 0x7e, 0x18, 0x3a, 0x60, 0xdf, 0x36, 0xf3, 0xe2,
+ 0xf5, 0x37, 0x3c, 0x33, 0x9a, 0xcd, 0x20, 0x59, 0x68, 0xb4, 0x3a, 0x5b,
+ 0x54, 0x1c, 0x18, 0xe7, 0x77, 0x7b, 0x63, 0xe5, 0xd0, 0x57, 0xf7, 0xaa,
+ 0xb7, 0xf7, 0xd9, 0xfe, 0x70, 0xef, 0xf9, 0xa7, 0xc3, 0x3d, 0x94, 0x15,
+ 0xf4, 0x2a, 0x91, 0x33, 0xad, 0x2f, 0x55, 0xbe, 0xf3, 0xda, 0x89, 0xd4,
+ 0x57, 0x4c, 0x56, 0x73, 0x63, 0xe2, 0x03, 0xf3, 0xfb, 0x21, 0x3d, 0x36,
+ 0xe4, 0x6a, 0x0a, 0xc1, 0x27, 0xe6, 0x46, 0xa3, 0xa1, 0xa8, 0x7e, 0xe8,
+ 0x9c, 0x54, 0x2c, 0x0a, 0xef, 0xc4, 0x45, 0x4e, 0x9b, 0x48, 0xe9, 0xea,
+ 0xbc, 0x59, 0xe2, 0xb0, 0x19, 0xa8, 0xab, 0x98, 0xd8, 0x1e, 0x67, 0x33,
+ 0xde, 0x21, 0x15, 0xe8, 0x13, 0x51, 0x22, 0x9d, 0x4c, 0xb7, 0xdf, 0x0f,
+ 0x84, 0xe6, 0x2f, 0xb6, 0xf9, 0x88, 0x7f, 0xc1, 0x1e, 0xb9, 0x2e, 0xc7,
+ 0x0e, 0xf8, 0x59, 0xba, 0x14, 0x1f, 0xc2, 0xd8, 0xc0, 0x0f, 0xb6, 0x72,
+ 0x2f, 0x10, 0xff, 0xf6, 0xae, 0x18, 0x30, 0x97, 0xb8, 0x2c, 0x0e, 0x95,
+ 0x9c, 0xb6, 0xe5, 0xb1, 0xf2, 0x61, 0x74, 0xb8, 0x58, 0x2c, 0x47, 0x0a,
+ 0x8b, 0x68, 0x6d, 0x8e, 0xde, 0xf9, 0xcb, 0x5f, 0x9c, 0x3c, 0xe2, 0x2a,
+ 0xb7, 0xe0, 0x70, 0x7f, 0x06, 0xce, 0x43, 0x8e, 0x6d, 0x31, 0xc3, 0x76,
+ 0xd2, 0x3b, 0xf8, 0x11, 0x5e, 0xe0, 0x9f, 0x07, 0x3f, 0x9a, 0x7f, 0xff,
+ 0xdc, 0xf3, 0x48, 0x2f, 0x99, 0x57, 0x47, 0x01, 0x32, 0x1b, 0xed, 0xa3,
+ 0xdc, 0x4f, 0xda, 0x65, 0x02, 0xa1, 0x19, 0x5c, 0x1e, 0x9d, 0xf3, 0x61,
+ 0xac, 0x38, 0xc6, 0x8d, 0xdd, 0x4c, 0x72, 0x08, 0x6a, 0x3d, 0x89, 0x70,
+ 0x70, 0xa9, 0x2f, 0x3c, 0x10, 0x04, 0x6d, 0x99, 0xd4, 0x7b, 0xa9, 0xaf,
+ 0x68, 0x0d, 0xd2, 0x19, 0x2b, 0xc6, 0x93, 0x18, 0x15, 0xf7, 0x9a, 0xdc,
+ 0x28, 0x92, 0x40, 0x4b, 0x6e, 0x40, 0xab, 0x4e, 0xcb, 0xcf, 0xb4, 0x39,
+ 0x62, 0xe9, 0xa9, 0xc1, 0xab, 0x71, 0x67, 0xba, 0xd6, 0x17, 0x42, 0x49,
+ 0x06, 0xd7, 0x37, 0xc2, 0x89, 0x66, 0xe6, 0xc3, 0xcc, 0x98, 0x0a, 0xdd,
+ 0x2a, 0xaf, 0x3f, 0xd0, 0x18, 0x25, 0x53, 0x84, 0xc1, 0x16, 0x1b, 0x9e,
+ 0xce, 0x8d, 0xbe, 0x51, 0xc8, 0x4b, 0x88, 0x27, 0x6c, 0xf6, 0x97, 0x37,
+ 0xc5, 0xee, 0x92, 0xd0, 0xf5, 0xd7, 0xec, 0xea, 0x28, 0x79, 0x8e, 0x3c,
+ 0x56, 0x65, 0x8f, 0xe0, 0x74, 0x62, 0xb4, 0x53, 0x72, 0x6e, 0xd4, 0x5d,
+ 0xbb, 0x47, 0x3c, 0x82, 0x15, 0xf3, 0x0e, 0x76, 0x0d, 0x5d, 0x82, 0xdb,
+ 0xdd, 0xcb, 0x8b, 0x4a, 0x14, 0x90, 0x73, 0x98, 0x49, 0x5e, 0x2c, 0x4b,
+ 0x11, 0xb9, 0xe3, 0x48, 0x37, 0x98, 0x56, 0xa6, 0x1b, 0xe0, 0x7d, 0x45,
+ 0x7a, 0x30, 0x1f, 0x11, 0x0a, 0xef, 0xaa, 0x6a, 0xb7, 0x11, 0x35, 0x19,
+ 0x70, 0xe2, 0x9c, 0x4e, 0x3a, 0x63, 0x3f, 0x7a, 0xad, 0x93, 0x4e, 0x7f,
+ 0x1a, 0xa1, 0xad, 0x65, 0x75, 0xee, 0x0a, 0xd4, 0xac, 0x8c, 0x94, 0x8c,
+ 0x42, 0xf7, 0xe7, 0x31, 0xd2, 0x4b, 0xef, 0x6e, 0xdd, 0xdf, 0x0d, 0x3d,
+ 0x2a, 0x54, 0x89, 0x13, 0x93, 0x3c, 0xc8, 0x17, 0x0f, 0x4f, 0xa0, 0x92,
+ 0xf5, 0xd0, 0x5a, 0xb6, 0x44, 0x8c, 0xbd, 0x68, 0xea, 0xe5, 0xf5, 0x35,
+ 0xd2, 0xf2, 0x83, 0x2e, 0x72, 0xda, 0x9b, 0xe0, 0xce, 0x85, 0x24, 0xdc,
+ 0xc8, 0x73, 0xf4, 0x5c, 0x67, 0xc3, 0xe5, 0xd6, 0x89, 0xe4, 0xe1, 0xb6,
+ 0x63, 0x40, 0x24, 0x5f, 0xdd, 0x4c, 0x4e, 0xf4, 0x9c, 0xfb, 0xe9, 0x42,
+ 0x55, 0x36, 0x50, 0xf1, 0x10, 0x08, 0xc5, 0x00, 0x18, 0xaa, 0xc2, 0x11,
+ 0x4e, 0x87, 0xd5, 0x62, 0x70, 0xad, 0x93, 0x90, 0x5c, 0x6d, 0x54, 0x22,
+ 0x81, 0x39, 0x41, 0xf2, 0x2b, 0x21, 0xe3, 0x62, 0x36, 0xa5, 0xca, 0xb2,
+ 0xd3, 0xb0, 0x82, 0x29, 0xa2, 0xa9, 0x7b, 0x7d, 0x5e, 0x61, 0x42, 0xd6,
+ 0x39, 0x08, 0x9c, 0x54, 0xf4, 0xd5, 0xa6, 0xa7, 0xc3, 0xfd, 0x60, 0x69,
+ 0xeb, 0xd9, 0x60, 0x32, 0x99, 0x0c, 0xa0, 0x10, 0xbc, 0x60, 0x2d, 0x65,
+ 0x47, 0xb4, 0x84, 0x15, 0xce, 0x83, 0x51, 0x26, 0x33, 0x7e, 0x74, 0x74,
+ 0x24, 0x0a, 0xcd, 0xe5, 0x4d, 0x47, 0xb5, 0xb0, 0xc4, 0x31, 0xa2, 0x5a,
+ 0xc5, 0x40, 0x7c, 0xf5, 0xcd, 0xb2, 0x99, 0xa2, 0x40, 0x25, 0x09, 0x0d,
+ 0x95, 0xc2, 0x36, 0xd5, 0xb2, 0xc3, 0xef, 0x47, 0xe5, 0x82, 0xfb, 0x0e,
+ 0xdc, 0x15, 0x42, 0xe2, 0xaa, 0x6c, 0xc1, 0x75, 0x05, 0xf0, 0xa2, 0xb4,
+ 0xdd, 0xad, 0x80, 0xc7, 0x5d, 0xf5, 0x29, 0x78, 0xb4, 0x83, 0x31, 0xc4,
+ 0xa2, 0x6d, 0x05, 0x9f, 0x4d, 0x73, 0x41, 0x55, 0xa6, 0xf2, 0xad, 0x6e,
+ 0xdb, 0x0f, 0xac, 0x87, 0x4c, 0x75, 0x7b, 0x49, 0x9e, 0xaf, 0x5c, 0x92,
+ 0xe8, 0xe4, 0x93, 0x79, 0x45, 0xd3, 0xbe, 0x75, 0x04, 0x6e, 0xc0, 0x23,
+ 0x39, 0x12, 0x47, 0x37, 0x84, 0xdb, 0x9a, 0xd1, 0xe2, 0x98, 0x2e, 0xd7,
+ 0x2c, 0x06, 0xe4, 0x56, 0x19, 0x8d, 0x4e, 0x77, 0x2e, 0x4f, 0x47, 0x01,
+ 0x64, 0xfa, 0x9e, 0x7c, 0xc7, 0xf0, 0x11, 0xb7, 0x7d, 0x9f, 0x3c, 0x45,
+ 0x20, 0x5c, 0x2d, 0xaf, 0xda, 0x3b, 0x9c, 0xbf, 0x12, 0xe5, 0x5c, 0x58,
+ 0x16, 0x9a, 0x4b, 0x61, 0xaf, 0xf1, 0x22, 0x2b, 0x90, 0x8b, 0x4c, 0xb7,
+ 0x39, 0x4e, 0x00, 0x50, 0x85, 0x75, 0xf2, 0xf6, 0xf0, 0x92, 0xf2, 0x23,
+ 0x1a, 0x81, 0x77, 0x90, 0x2f, 0x28, 0x00, 0x74, 0x0b, 0xbf, 0xa3, 0x65,
+ 0xc4, 0x4b, 0x27, 0xae, 0xc6, 0x80, 0x6a, 0xed, 0xbc, 0x7c, 0xb5, 0x6e,
+ 0xbc, 0x75, 0xd3, 0x6f, 0xa6, 0x54, 0xee, 0x87, 0xee, 0x9e, 0xef, 0xae,
+ 0xc6, 0x5e, 0x74, 0x35, 0x78, 0x02, 0xe2, 0xc7, 0xe1, 0x42, 0x84, 0xb9,
+ 0x4e, 0xb4, 0x06, 0xd5, 0xa4, 0xfb, 0xb3, 0xf2, 0x3a, 0x27, 0x97, 0x20,
+ 0xd6, 0x0b, 0xfb, 0x5a, 0x6b, 0xf3, 0x76, 0x65, 0x30, 0xcf, 0x4e, 0xcd,
+ 0xb9, 0x1c, 0xed, 0xc4, 0x1c, 0x3e, 0x22, 0x74, 0x53, 0xd8, 0x39, 0xd5,
+ 0x98, 0xb3, 0xcd, 0xa2, 0x0b, 0x93, 0xd4, 0xc0, 0x81, 0x95, 0x4f, 0x8c,
+ 0xad, 0x30, 0xa1, 0xbc, 0x07, 0x64, 0x94, 0xd5, 0x4a, 0x76, 0xc7, 0x61,
+ 0xaf, 0xbc, 0x45, 0xaf, 0xa5, 0xae, 0xd2, 0x7a, 0xb9, 0x88, 0x66, 0x91,
+ 0xc8, 0x08, 0xd7, 0x3a, 0xe4, 0x9f, 0xb7, 0xae, 0x8f, 0xaf, 0xc9, 0x34,
+ 0xbb, 0x0e, 0xae, 0x5d, 0x4b, 0x66, 0x10, 0x61, 0xf0, 0x82, 0xb6, 0x8a,
+ 0x2c, 0x71, 0x09, 0xaa, 0xfb, 0x34, 0xc9, 0x64, 0x6a, 0x0d, 0xa6, 0xfd,
+ 0x28, 0xc7, 0x75, 0xbf, 0x5b, 0xd1, 0x86, 0xd9, 0xc5, 0xda, 0xd4, 0xb2,
+ 0x2d, 0x6a, 0x12, 0x05, 0x32, 0x77, 0x9a, 0xfb, 0xfa, 0xd8, 0x51, 0x92,
+ 0x77, 0xf8, 0x4b, 0x5a, 0x74, 0xe5, 0x0c, 0xc3, 0xa1, 0x80, 0xd3, 0x1d,
+ 0x15, 0xe3, 0xbb, 0x5b, 0x61, 0xed, 0xb0, 0x3e, 0x7b, 0xe9, 0x18, 0x8e,
+ 0xf9, 0x7c, 0x28, 0x0d, 0xbc, 0x8a, 0xac, 0x77, 0x17, 0xa7, 0x36, 0x2c,
+ 0xff, 0xef, 0x9b, 0xae, 0xe8, 0xc6, 0x30, 0xe2, 0x90, 0xd0, 0xdb, 0x21,
+ 0x5a, 0x06, 0x92, 0xa2, 0x4d, 0x12, 0x6e, 0xea, 0xbb, 0x4e, 0xdb, 0x6f,
+ 0xc7, 0xf9, 0x7a, 0x1f, 0xe8, 0xd1, 0x37, 0xc7, 0x87, 0xaf, 0x6c, 0x3e,
+ 0xfa, 0xbf, 0x82, 0x25, 0xd4, 0x39, 0x38, 0xc7, 0x19, 0x73, 0xab, 0x2f,
+ 0xd5, 0x67, 0x82, 0xf5, 0xd1, 0xad, 0x8a, 0xdd, 0x62, 0x54, 0xb6, 0x3a,
+ 0xe3, 0x33, 0xb2, 0x92, 0x62, 0x7c, 0xa5, 0x93, 0xc4, 0x47, 0x1d, 0x88,
+ 0xf3, 0x9a, 0x94, 0x66, 0x4e, 0xcf, 0xf1, 0xb6, 0xf2, 0x35, 0xb6, 0xf2,
+ 0xac, 0x1c, 0x97, 0x57, 0x57, 0x6b, 0xee, 0x77, 0x26, 0x7a, 0x43, 0x1a,
+ 0x0d, 0x6f, 0x99, 0x1e, 0x4d, 0x23, 0xbd, 0x37, 0xa6, 0xde, 0x9b, 0x45,
+ 0x35, 0x87, 0xad, 0x27, 0x30, 0x2c, 0xa9, 0x8f, 0x1c, 0x5c, 0x3d, 0x7e,
+ 0x76, 0xb3, 0x1a, 0x10, 0x6a, 0xef, 0x21, 0xc1, 0x9b, 0x3d, 0x33, 0x0a,
+ 0x10, 0xb2, 0x74, 0xd9, 0x75, 0xf2, 0x9f, 0xff, 0xf5, 0xe3, 0xcf, 0x11,
+ 0xce, 0x70, 0xf2, 0xfd, 0xdd, 0x70, 0x72, 0x9a, 0x79, 0x7a, 0x2e, 0xf4,
+ 0x1f, 0x96, 0xd9, 0xd9, 0x95, 0x29, 0x27, 0x0d, 0x2c, 0x9b, 0x5d, 0x0d,
+ 0x3d, 0xe2, 0x86, 0xf0, 0x62, 0x24, 0x85, 0x49, 0x3f, 0x88, 0x92, 0x45,
+ 0x94, 0x4f, 0xcc, 0x39, 0xa0, 0xc4, 0xc2, 0x8b, 0xda, 0x1b, 0x2e, 0x11,
+ 0xc1, 0x72, 0x74, 0xf2, 0x4a, 0x04, 0xf0, 0x69, 0x57, 0x1f, 0xc3, 0x8f,
+ 0x9f, 0xf3, 0x06, 0x3c, 0xb1, 0x5e, 0x4f, 0x6f, 0x25, 0x6c, 0x34, 0x35,
+ 0x9a, 0x55, 0x44, 0x42, 0xf7, 0xf5, 0xc9, 0xe9, 0xf1, 0x76, 0xf2, 0x3a,
+ 0x03, 0xe5, 0x9e, 0x47, 0x0a, 0x43, 0x5b, 0xf0, 0x0f, 0x38, 0xf2, 0x96,
+ 0xaa, 0x47, 0xd2, 0x9e, 0xa2, 0xa5, 0x1d, 0xc5, 0x40, 0xc4, 0xe6, 0x67,
+ 0x27, 0x03, 0x96, 0x86, 0xb3, 0x97, 0x4b, 0xa4, 0x5c, 0x28, 0xbe, 0x41,
+ 0x5d, 0xef, 0x82, 0xa8, 0x22, 0x78, 0x71, 0x10, 0x87, 0xe2, 0xe4, 0xd5,
+ 0xa1, 0x47, 0xe5, 0x52, 0xfa, 0xd1, 0x2d, 0xea, 0xb4, 0xc2, 0xef, 0x24,
+ 0x94, 0xc1, 0x55, 0x94, 0xeb, 0x24, 0x9a, 0xba, 0x4e, 0xa9, 0xbb, 0x84,
+ 0x4c, 0x07, 0x20, 0x8f, 0x8c, 0x68, 0x2e, 0x61, 0x29, 0xd7, 0x30, 0x98,
+ 0x2d, 0x68, 0xbc, 0xde, 0xc4, 0x7d, 0xa3, 0x13, 0x47, 0x11, 0x51, 0xfe,
+ 0x73, 0xe7, 0xcb, 0x28, 0xab, 0x8a, 0x92, 0x24, 0xa3, 0x90, 0x97, 0xbc,
+ 0x61, 0x46, 0xac, 0xa5, 0x1d, 0x65, 0xd3, 0xa9, 0x20, 0x84, 0x46, 0xae,
+ 0xc8, 0xae, 0x88, 0x40, 0xe5, 0x82, 0xdf, 0xa2, 0x80, 0xfd, 0x55, 0xd8,
+ 0xf8, 0x75, 0x3f, 0x53, 0x56, 0x1b, 0xdb, 0x94, 0x34, 0x6b, 0x5c, 0x3a,
+ 0xcc, 0xe2, 0xdd, 0x92, 0x58, 0xe1, 0x0b, 0xc5, 0xf8, 0xe2, 0xf4, 0xf0,
+ 0xe9, 0x26, 0xe4, 0x68, 0xda, 0xc6, 0x8e, 0xf2, 0x63, 0x37, 0x92, 0x93,
+ 0x01, 0xdd, 0x9e, 0x09, 0x8f, 0xeb, 0xa8, 0x37, 0x0a, 0x4f, 0x59, 0xaf,
+ 0x33, 0x6a, 0x67, 0xb1, 0x9d, 0xcd, 0x52, 0x7d, 0x49, 0x02, 0x86, 0xbe,
+ 0x58, 0x31, 0x02, 0xad, 0x62, 0x16, 0xa9, 0xc8, 0xe9, 0x95, 0xaf, 0xfb,
+ 0xde, 0x8c, 0xee, 0x2d, 0xe2, 0x7f, 0xa6, 0xad, 0x1b, 0x85, 0xe2, 0xcb,
+ 0xcc, 0x1d, 0x64, 0x1c, 0xca, 0x9b, 0x36, 0x55, 0x3e, 0xf9, 0x90, 0x23,
+ 0xbd, 0x60, 0x09, 0xf1, 0x92, 0x16, 0x6a, 0xcd, 0x70, 0x37, 0x2d, 0x83,
+ 0xa8, 0xd9, 0x6e, 0x43, 0x00, 0x6b, 0xe3, 0xd2, 0x90, 0x13, 0x28, 0x48,
+ 0x8d, 0x25, 0x66, 0x32, 0xed, 0xcf, 0x0c, 0x80, 0x77, 0x7b, 0x5a, 0x54,
+ 0x70, 0x50, 0xd6, 0x03, 0x64, 0x57, 0x84, 0x2d, 0x31, 0x43, 0x15, 0x38,
+ 0x98, 0xa1, 0x77, 0xc2, 0x9d, 0x42, 0xc5, 0x8b, 0x21, 0xaa, 0x87, 0x46,
+ 0x37, 0x9a, 0x13, 0x36, 0x15, 0x70, 0x2f, 0x19, 0xb2, 0x4c, 0x8f, 0x11,
+ 0x37, 0xd7, 0xf9, 0x6d, 0x2c, 0x00, 0x48, 0xfe, 0x07, 0xe9, 0xd8, 0x5c,
+ 0x72, 0x79, 0xa5, 0x2e, 0x98, 0xc2, 0xdf, 0x6c, 0xb4, 0x85, 0x1d, 0x26,
+ 0x44, 0x70, 0x24, 0x33, 0x1b, 0x9c, 0xe0, 0x19, 0x49, 0x50, 0x62, 0x2a,
+ 0x29, 0x0e, 0xcc, 0xf6, 0x4f, 0x7a, 0xdf, 0x94, 0x75, 0x73, 0xd0, 0xb3,
+ 0x5c, 0x9d, 0xb0, 0xf5, 0xa1, 0xe2, 0xb6, 0x76, 0x8e, 0xd4, 0xb1, 0x1b,
+ 0x44, 0xab, 0x4b, 0xc8, 0x4d, 0x62, 0x04, 0x9b, 0x3c, 0xad, 0xd0, 0xef,
+ 0x10, 0x5e, 0x67, 0xa1, 0xd8, 0x7d, 0xca, 0xdb, 0xbe, 0x09, 0xb9, 0x48,
+ 0xa9, 0x4b, 0x3f, 0x0c, 0x8e, 0xf0, 0xf1, 0xc1, 0x37, 0x68, 0xee, 0xf3,
+ 0x9e, 0x75, 0x42, 0x74, 0x7f, 0x75, 0x10, 0x56, 0xd0, 0x76, 0xce, 0x79,
+ 0xbe, 0x08, 0x97, 0x8a, 0x0e, 0x46, 0x8c, 0x53, 0x3a, 0x28, 0xb5, 0x81,
+ 0xa7, 0xd3, 0x1d, 0x5d, 0x70, 0x2e, 0x22, 0x1e, 0x96, 0x53, 0xb2, 0xd1,
+ 0xb0, 0x45, 0x45, 0xb1, 0x2d, 0x23, 0x99, 0xa7, 0x83, 0xf2, 0x6a, 0x00,
+ 0xa4, 0xde, 0x3c, 0xad, 0x3e, 0x50, 0x9c, 0xdc, 0x3b, 0x75, 0xc8, 0x79,
+ 0x06, 0x23, 0xe5, 0x74, 0x1a, 0xbb, 0x2a, 0x90, 0xe3, 0x83, 0x18, 0xab,
+ 0x6c, 0x7c, 0x85, 0xfc, 0xf2, 0x42, 0x1e, 0x88, 0xa7, 0x08, 0xaf, 0xdb,
+ 0x4a, 0x06, 0x44, 0x37, 0xb2, 0xb6, 0xf0, 0x41, 0x9f, 0x6f, 0x13, 0x8c,
+ 0x1a, 0x3a, 0xc5, 0x9c, 0xdd, 0x0b, 0xf0, 0x89, 0x2c, 0x17, 0xd0, 0x7c,
+ 0x89, 0x1b, 0x2c, 0xb0, 0x07, 0x14, 0xae, 0x0c, 0xc5, 0xe9, 0x93, 0xe1,
+ 0xb3, 0x67, 0xc3, 0xdd, 0x7e, 0x10, 0x43, 0x6a, 0xa0, 0x7e, 0x16, 0x2e,
+ 0x80, 0x6d, 0x1e, 0xfe, 0x72, 0x55, 0x46, 0x17, 0xd7, 0xa7, 0xee, 0xdb,
+ 0xcb, 0x21, 0x03, 0xbc, 0xcd, 0x21, 0x70, 0x5d, 0xb8, 0x99, 0x2b, 0xb6,
+ 0xb2, 0xd8, 0xe4, 0xf4, 0xb5, 0x18, 0x9d, 0x9a, 0x80, 0x09, 0xbe, 0x1c,
+ 0x84, 0x15, 0xc5, 0xa5, 0xa6, 0x85, 0x8f, 0x23, 0xf6, 0xaa, 0x53, 0xac,
+ 0xb4, 0x7d, 0x40, 0xd1, 0x7a, 0xa8, 0x2c, 0xf0, 0x03, 0x33, 0xa9, 0x52,
+ 0xba, 0x6b, 0x90, 0xd1, 0x0f, 0x39, 0x07, 0x59, 0x39, 0xca, 0xea, 0xd5,
+ 0x73, 0xc6, 0xd4, 0x73, 0x9f, 0xd0, 0x8c, 0x59, 0xd2, 0x5a, 0x25, 0x67,
+ 0x77, 0xf7, 0x03, 0xb6, 0xad, 0x77, 0x96, 0xba, 0x73, 0x46, 0x52, 0x45,
+ 0x6b, 0x0f, 0x8b, 0x29, 0x8d, 0x26, 0x56, 0x22, 0xdb, 0x56, 0x40, 0xce,
+ 0x70, 0x6c, 0x5e, 0x93, 0x12, 0x39, 0x78, 0x6b, 0x96, 0xe1, 0x20, 0xf9,
+ 0x8f, 0x32, 0xeb, 0x21, 0xc1, 0xaf, 0x93, 0xdf, 0x17, 0x90, 0xfd, 0x1c,
+ 0x5e, 0xbc, 0x3d, 0x79, 0xfb, 0xf5, 0x81, 0x95, 0x71, 0x24, 0xef, 0x3c,
+ 0x16, 0x74, 0x17, 0xe5, 0x73, 0x25, 0x59, 0xf0, 0x48, 0x1e, 0xe5, 0x21,
+ 0x77, 0xac, 0xb2, 0x83, 0x84, 0x25, 0xb4, 0x98, 0xd4, 0xed, 0x12, 0xd4,
+ 0x16, 0xc6, 0x2b, 0xd9, 0x43, 0xb8, 0x2f, 0x9b, 0x32, 0xd0, 0x85, 0xd8,
+ 0xa5, 0xdd, 0x2a, 0xe0, 0x6e, 0xb3, 0x90, 0x0b, 0x64, 0x6c, 0xa8, 0x66,
+ 0xa4, 0x52, 0xd4, 0x2f, 0x27, 0x10, 0x06, 0x3d, 0x81, 0x85, 0x43, 0x7c,
+ 0xa1, 0xe6, 0xbb, 0xa2, 0xc5, 0xbe, 0xce, 0x0c, 0xca, 0x35, 0x56, 0xad,
+ 0xce, 0xa1, 0xff, 0xda, 0x59, 0x59, 0xa1, 0xa9, 0xe1, 0x32, 0x63, 0xde,
+ 0x45, 0xa9, 0x3c, 0x2e, 0xac, 0x2b, 0xf2, 0x53, 0x07, 0x12, 0xb6, 0xe3,
+ 0x7f, 0x34, 0xd0, 0xce, 0x21, 0xed, 0xd8, 0x62, 0x60, 0xc7, 0xb8, 0x27,
+ 0xb5, 0x76, 0x2a, 0xdc, 0x26, 0xd1, 0xec, 0xea, 0x59, 0xe6, 0x20, 0xf2,
+ 0x56, 0xdd, 0xb9, 0x61, 0x75, 0x67, 0xb6, 0x08, 0x48, 0x84, 0x50, 0xa2,
+ 0x93, 0x7e, 0xa3, 0x76, 0x06, 0xf9, 0x54, 0x71, 0x09, 0x2b, 0x4a, 0xa8,
+ 0x5d, 0x6a, 0x59, 0x6b, 0x00, 0xb1, 0x5c, 0x0f, 0xaf, 0x54, 0x62, 0xb1,
+ 0xc8, 0x98, 0x47, 0xc5, 0x07, 0x63, 0x9b, 0xaf, 0x9b, 0x39, 0x5e, 0x2c,
+ 0xc7, 0xf3, 0xe9, 0xb3, 0xe4, 0x85, 0xf9, 0x4f, 0xa0, 0x67, 0x01, 0xd1,
+ 0x34, 0x3a, 0x32, 0xba, 0x16, 0x85, 0x5f, 0xe9, 0xca, 0xe0, 0x44, 0x7e,
+ 0x51, 0xed, 0xe9, 0xaf, 0x4f, 0xf6, 0x4d, 0x4f, 0x3f, 0xa6, 0x4a, 0xdb,
+ 0x65, 0x94, 0xc2, 0xeb, 0xbc, 0x61, 0x14, 0xc9, 0x0a, 0x36, 0x04, 0xbf,
+ 0x20, 0x2a, 0xad, 0xf8, 0xde, 0xfe, 0xa7, 0x09, 0x01, 0x60, 0xdf, 0xbc,
+ 0x7a, 0x96, 0x18, 0xd3, 0x64, 0xf2, 0xa1, 0x5e, 0xce, 0x55, 0x22, 0x4b,
+ 0x1d, 0x62, 0xea, 0x67, 0xc0, 0x37, 0x60, 0x3a, 0x3e, 0xcb, 0x27, 0x94,
+ 0x85, 0xe2, 0x43, 0x9a, 0xa8, 0x04, 0x62, 0x6d, 0x6b, 0xea, 0x89, 0xcb,
+ 0xd3, 0xdd, 0x1c, 0x88, 0x66, 0x71, 0xc4, 0x37, 0xe2, 0x51, 0x33, 0x73,
+ 0x60, 0x3e, 0x5e, 0x73, 0xe5, 0xc2, 0xb5, 0x7e, 0x84, 0x4f, 0x5a, 0xae,
+ 0x98, 0x5d, 0x2c, 0xa5, 0x39, 0xdf, 0x7b, 0xc3, 0xdd, 0x55, 0xd5, 0x38,
+ 0x3d, 0x9a, 0x11, 0x09, 0xeb, 0xc1, 0x1e, 0x90, 0xe2, 0xaa, 0x89, 0x79,
+ 0xd3, 0xd7, 0xc3, 0x38, 0xc2, 0x63, 0x66, 0x72, 0x05, 0xf0, 0xc0, 0xdc,
+ 0x2b, 0x6c, 0x02, 0x52, 0x0e, 0xad, 0xdf, 0xd0, 0x63, 0x21, 0xa0, 0xd2,
+ 0xdd, 0x3d, 0x71, 0x3c, 0xd1, 0xbf, 0x5a, 0xae, 0x3e, 0xf9, 0xf5, 0x8a,
+ 0xc2, 0xa9, 0x18, 0xcc, 0x9a, 0xb1, 0xec, 0xad, 0xed, 0x86, 0xd7, 0x0f,
+ 0xcc, 0x9d, 0x9b, 0x3c, 0x5b, 0x57, 0x83, 0xfb, 0xa3, 0x73, 0x1e, 0x7a,
+ 0xe2, 0x43, 0x6e, 0x58, 0xbc, 0x41, 0x68, 0xde, 0xb2, 0x1a, 0x90, 0x4a,
+ 0x38, 0xcb, 0xa6, 0xc1, 0x15, 0x1d, 0x5b, 0x0c, 0x9c, 0x63, 0x54, 0x95,
+ 0x97, 0x44, 0x63, 0xf2, 0x63, 0x91, 0xa3, 0x0c, 0x43, 0xb2, 0x22, 0x34,
+ 0x86, 0x58, 0xa4, 0x27, 0x76, 0xf6, 0xad, 0x06, 0x88, 0x7f, 0xd2, 0x94,
+ 0xbe, 0x5b, 0x5c, 0x57, 0x29, 0x39, 0xef, 0x08, 0xfb, 0xef, 0xd8, 0x56,
+ 0x13, 0x74, 0x2e, 0x49, 0x56, 0xf5, 0x8e, 0xf9, 0xb9, 0xfc, 0xf2, 0x09,
+ 0x9a, 0x98, 0x52, 0xeb, 0xa7, 0x6a, 0xca, 0xf9, 0x71, 0xe5, 0x2d, 0xe8,
+ 0xa7, 0x8e, 0x46, 0x38, 0xc6, 0x87, 0x57, 0x37, 0x02, 0x93, 0x92, 0x06,
+ 0x5a, 0x30, 0x42, 0xe2, 0xf9, 0xe4, 0xcb, 0xc5, 0x16, 0x1b, 0x21, 0xd8,
+ 0xad, 0x70, 0x38, 0x04, 0x64, 0x43, 0xbc, 0xb8, 0xa2, 0x25, 0x74, 0xb8,
+ 0x70, 0x02, 0x97, 0x57, 0x74, 0x39, 0x1e, 0xcd, 0x3c, 0x1b, 0x50, 0x5e,
+ 0x10, 0x0f, 0x2d, 0xdd, 0xe0, 0x92, 0xa8, 0xc3, 0xa3, 0x19, 0x3e, 0x6e,
+ 0x73, 0xef, 0xf6, 0xa3, 0xbd, 0xa3, 0xed, 0xe6, 0x6f, 0xfe, 0x16, 0x7f,
+ 0xcc, 0x67, 0x91, 0xcd, 0xf5, 0xab, 0xce, 0xc2, 0xfe, 0x3a, 0xc7, 0xaf,
+ 0x51, 0xe2, 0xd3, 0xd9, 0xa2, 0x18, 0xea, 0x17, 0x1e, 0x35, 0x3f, 0xdd,
+ 0x65, 0xb6, 0x3c, 0xbd, 0xbf, 0x6e, 0x7e, 0xba, 0x73, 0xe3, 0xcb, 0x32,
+ 0x7f, 0x7e, 0xba, 0x6b, 0xb9, 0x96, 0xa8, 0x99, 0x13, 0xeb, 0xb4, 0x3e,
+ 0xe4, 0x80, 0x33, 0x06, 0x62, 0x40, 0xda, 0x44, 0x4e, 0xa4, 0x32, 0xac,
+ 0xf4, 0x93, 0x13, 0x66, 0x10, 0x44, 0x04, 0x47, 0x5e, 0x3f, 0xe5, 0x84,
+ 0x03, 0xbe, 0x42, 0x2d, 0x02, 0x2d, 0x92, 0x9b, 0x94, 0x4f, 0x96, 0x5c,
+ 0xbf, 0x79, 0xc9, 0xf5, 0xe2, 0x49, 0x87, 0xb3, 0xa4, 0xc7, 0xcb, 0x02,
+ 0x17, 0xd6, 0xe1, 0x82, 0x72, 0x06, 0x8c, 0x8c, 0xfa, 0xe8, 0xaa, 0x41,
+ 0x45, 0x1c, 0x8f, 0xe6, 0x56, 0x47, 0x46, 0x58, 0x5e, 0x28, 0x4c, 0xa9,
+ 0xdb, 0x1d, 0xb4, 0xce, 0x1c, 0x23, 0x33, 0x02, 0xe6, 0x55, 0xac, 0xc4,
+ 0xec, 0x1b, 0xcb, 0xf1, 0x3a, 0x60, 0x30, 0x1d, 0xdf, 0x37, 0x11, 0xcc,
+ 0x2c, 0x8d, 0x9a, 0x66, 0x61, 0xab, 0x96, 0xa0, 0xfc, 0xd3, 0xe7, 0xc3,
+ 0xdd, 0xed, 0x3e, 0x15, 0xbe, 0x5b, 0x60, 0x06, 0x08, 0xd4, 0x68, 0xef,
+ 0x7a, 0xc2, 0xf4, 0xe6, 0xd7, 0x64, 0x43, 0xad, 0xaa, 0x43, 0x4d, 0xfe,
+ 0x16, 0x09, 0x06, 0x6b, 0xa4, 0x55, 0x38, 0x9d, 0xda, 0xdc, 0xad, 0x79,
+ 0x1f, 0xf5, 0x01, 0xe0, 0x2d, 0xe9, 0x7a, 0x4b, 0xc5, 0x87, 0xe2, 0x0a,
+ 0x5d, 0xfa, 0xc4, 0xa1, 0xaa, 0x81, 0xb9, 0x2a, 0x97, 0xc2, 0x88, 0x0b,
+ 0x07, 0x72, 0xc4, 0xb7, 0xe2, 0xc8, 0x37, 0x95, 0xf8, 0x18, 0xd6, 0x36,
+ 0x7f, 0x43, 0x8c, 0x22, 0x28, 0x9d, 0x2a, 0xf1, 0xc8, 0x6e, 0x21, 0x0f,
+ 0x13, 0xf3, 0x0c, 0x77, 0x4f, 0xee, 0x14, 0x24, 0x95, 0xac, 0x1b, 0x38,
+ 0x3e, 0xb6, 0xd6, 0x81, 0x53, 0x0e, 0xb5, 0xe1, 0x30, 0x56, 0x87, 0xfa,
+ 0x36, 0xcf, 0xee, 0x5a, 0xce, 0x21, 0xe9, 0x57, 0xdf, 0x72, 0x11, 0xb3,
+ 0x4d, 0x72, 0x4b, 0x33, 0x64, 0x9a, 0x1c, 0x97, 0xb6, 0xc6, 0xe2, 0x9a,
+ 0x83, 0xec, 0x3f, 0xed, 0x4d, 0xf3, 0x07, 0x9e, 0xe6, 0x3a, 0x06, 0x9e,
+ 0x67, 0xf6, 0x31, 0x47, 0x9d, 0xda, 0x27, 0x05, 0xbd, 0xba, 0x4f, 0xc0,
+ 0x91, 0xeb, 0x14, 0x17, 0xc8, 0x15, 0x06, 0x6b, 0xe5, 0x35, 0x93, 0x7f,
+ 0x71, 0xde, 0x75, 0xa8, 0xfd, 0xf2, 0x67, 0xda, 0x67, 0x5e, 0xfc, 0x36,
+ 0xb6, 0xf0, 0x67, 0x55, 0x4e, 0xc8, 0x34, 0xc2, 0x25, 0xab, 0x9c, 0x9f,
+ 0xb0, 0x0c, 0x22, 0xe1, 0x19, 0x59, 0x11, 0x8f, 0x24, 0xd8, 0x8b, 0x26,
+ 0x38, 0xe6, 0xe6, 0x44, 0x07, 0x38, 0x8c, 0xa6, 0x0b, 0xeb, 0xba, 0x7a,
+ 0x63, 0x6a, 0x8d, 0x64, 0x7c, 0xaf, 0xf4, 0xf9, 0xe2, 0x1d, 0x70, 0xa4,
+ 0x66, 0x01, 0xfd, 0xa6, 0x05, 0xf3, 0x3b, 0xc2, 0x01, 0xe7, 0x67, 0x61,
+ 0xfa, 0x16, 0x8c, 0x4c, 0x1a, 0xaf, 0x7d, 0x3e, 0xba, 0x80, 0x9b, 0xd5,
+ 0x2b, 0x74, 0x9a, 0x51, 0x0a, 0x03, 0xd1, 0x5b, 0x47, 0x97, 0x98, 0x4d,
+ 0x70, 0xce, 0x07, 0x34, 0xdb, 0xb9, 0x5c, 0x92, 0x6b, 0x1e, 0x67, 0x5f,
+ 0xd2, 0x79, 0x24, 0x83, 0xa7, 0x9b, 0xe6, 0x69, 0x19, 0x5d, 0x68, 0xf6,
+ 0x87, 0x37, 0xe9, 0xc7, 0x8f, 0xc3, 0x3a, 0xdb, 0x31, 0xbb, 0xb6, 0xde,
+ 0xa9, 0xeb, 0x19, 0x7d, 0xb4, 0x06, 0x33, 0xc5, 0xea, 0xeb, 0x81, 0xed,
+ 0x57, 0x9d, 0x5f, 0x11, 0xc6, 0x93, 0x94, 0x5e, 0x6d, 0x09, 0x5b, 0x57,
+ 0x86, 0x84, 0xb9, 0x98, 0xbb, 0xc0, 0x0a, 0x66, 0x77, 0x43, 0x1a, 0xb0,
+ 0x9f, 0x9a, 0xc0, 0xa2, 0xc1, 0x05, 0xb0, 0x6c, 0x3b, 0x8e, 0xb6, 0x92,
+ 0xf8, 0xdc, 0xaa, 0x55, 0x38, 0x38, 0x39, 0xab, 0x1e, 0x24, 0xc1, 0x4c,
+ 0x8a, 0x85, 0x8b, 0x99, 0xfb, 0xa1, 0x70, 0x49, 0xc7, 0x13, 0x56, 0xf9,
+ 0xa9, 0x38, 0x67, 0x24, 0x1d, 0x7e, 0x95, 0x21, 0xed, 0x0d, 0x8d, 0x80,
+ 0x75, 0x07, 0x7b, 0x76, 0x4e, 0xef, 0xee, 0xee, 0x86, 0xeb, 0x2c, 0xe9,
+ 0x7f, 0x3a, 0xa9, 0xa7, 0xdd, 0xdc, 0x99, 0xd9, 0xb5, 0xa7, 0x79, 0xb1,
+ 0xfc, 0x98, 0x78, 0xd9, 0xaf, 0x96, 0x77, 0x5b, 0x5d, 0xc5, 0xc9, 0x77,
+ 0x17, 0xaf, 0x6d, 0xd1, 0x2f, 0xcd, 0x39, 0x24, 0x5f, 0x44, 0x1d, 0x7a,
+ 0x4d, 0xb3, 0x9c, 0x73, 0x92, 0x89, 0x99, 0xed, 0xe8, 0xf0, 0xfc, 0xfd,
+ 0xdb, 0xe3, 0xcb, 0xf7, 0x17, 0x87, 0xdf, 0xd3, 0x14, 0x72, 0x10, 0xb0,
+ 0x4a, 0x41, 0xfe, 0x5f, 0x95, 0x25, 0x95, 0x1e, 0x78, 0x03, 0x8c, 0x75,
+ 0x5e, 0x20, 0xf1, 0x34, 0x46, 0x8f, 0x6d, 0xf3, 0xe9, 0xb5, 0x9f, 0xa6,
+ 0x2f, 0x07, 0x49, 0x6b, 0xbe, 0x3e, 0x18, 0xcb, 0x21, 0x9b, 0x0d, 0xcb,
+ 0xea, 0x9a, 0x76, 0xe1, 0xce, 0x2b, 0x91, 0x9f, 0xd1, 0xe6, 0x76, 0x8a,
+ 0xac, 0x21, 0xf0, 0x14, 0xd1, 0x33, 0xdc, 0x56, 0x57, 0x94, 0xcb, 0xb9,
+ 0xae, 0x64, 0xa6, 0x5f, 0x49, 0xc2, 0xdb, 0x9a, 0x4f, 0x21, 0x00, 0x17,
+ 0xb7, 0x4f, 0xd7, 0x18, 0x03, 0x4d, 0x4b, 0x7f, 0xa2, 0x03, 0x36, 0xbb,
+ 0xe5, 0xad, 0x85, 0x28, 0x86, 0x5f, 0x8e, 0x84, 0xa1, 0xec, 0xb3, 0xfb,
+ 0x7e, 0x24, 0x5b, 0x0c, 0xc4, 0x95, 0xa5, 0xcd, 0xad, 0x03, 0x1a, 0x98,
+ 0x4a, 0x61, 0xac, 0x2f, 0x81, 0xa1, 0x7a, 0x50, 0xd7, 0xec, 0x68, 0x51,
+ 0x53, 0xfb, 0x9a, 0xd3, 0xf3, 0x50, 0x97, 0xa4, 0xe2, 0x18, 0xde, 0x98,
+ 0x9f, 0xcb, 0x98, 0x9f, 0xff, 0x53, 0x63, 0x7e, 0xfe, 0x4f, 0x8c, 0xf9,
+ 0xe9, 0xbf, 0x7c, 0xcc, 0x7f, 0xa3, 0x31, 0xff, 0x6d, 0x59, 0x7c, 0x18,
+ 0x98, 0xfe, 0xd2, 0x2d, 0x2c, 0x05, 0x06, 0xea, 0xb8, 0xca, 0xdc, 0xe2,
+ 0xb4, 0x26, 0x47, 0x93, 0xad, 0x8b, 0x3b, 0xf1, 0xeb, 0x25, 0xa4, 0x92,
+ 0xdf, 0xc2, 0x41, 0xa7, 0x95, 0x55, 0x00, 0x93, 0x56, 0x69, 0x76, 0xca,
+ 0xa4, 0x9d, 0xe6, 0xf5, 0x84, 0xec, 0x1b, 0x72, 0x98, 0xf4, 0xa4, 0x47,
+ 0xda, 0x74, 0x6f, 0xe8, 0xca, 0xb9, 0x07, 0x1c, 0x28, 0xb5, 0xb9, 0x5d,
+ 0xc8, 0xb4, 0xc6, 0xa9, 0xb4, 0x71, 0x19, 0x57, 0x85, 0x0e, 0xcc, 0x2d,
+ 0x94, 0x1d, 0xaf, 0x8d, 0xb2, 0xa7, 0x9a, 0xbc, 0x90, 0xa1, 0xcc, 0xb8,
+ 0xbc, 0x5f, 0x50, 0x73, 0x89, 0x96, 0xfd, 0xae, 0x6d, 0xc5, 0x50, 0xdb,
+ 0xc1, 0xa4, 0xd3, 0x39, 0x71, 0xbd, 0xdd, 0x64, 0xf7, 0x9b, 0x81, 0xc2,
+ 0x30, 0x99, 0x95, 0x24, 0x6f, 0x48, 0xaf, 0x5b, 0xa3, 0x89, 0x8c, 0x5d,
+ 0x75, 0x07, 0xbe, 0x2f, 0x3a, 0xe5, 0x1e, 0xfc, 0x7b, 0xe3, 0x43, 0x96,
+ 0x2d, 0xd2, 0x19, 0xf2, 0x10, 0x29, 0x1a, 0xb7, 0x8a, 0x93, 0xbe, 0x15,
+ 0x3e, 0x56, 0x70, 0x15, 0xde, 0x48, 0xdb, 0xd7, 0x3a, 0x24, 0x9d, 0x56,
+ 0x2d, 0x9e, 0x03, 0x68, 0x98, 0x4f, 0x83, 0xd4, 0x6c, 0x25, 0xa4, 0xd2,
+ 0x80, 0x9c, 0xed, 0x05, 0x69, 0x27, 0x63, 0x49, 0x8a, 0xb5, 0x9f, 0x50,
+ 0x8e, 0x8d, 0xdc, 0x3c, 0x7c, 0x9b, 0x4f, 0x97, 0x41, 0x0d, 0xd1, 0xee,
+ 0xeb, 0xc8, 0xb7, 0x6f, 0xd1, 0x93, 0xf2, 0xf2, 0xd1, 0x13, 0xa5, 0xbd,
+ 0xff, 0x48, 0xdd, 0x40, 0xad, 0x97, 0x60, 0x4b, 0x29, 0x4f, 0x17, 0x6b,
+ 0xb7, 0x97, 0x47, 0xe7, 0xef, 0xbf, 0x3d, 0x3e, 0x3e, 0x3f, 0x79, 0x75,
+ 0x7a, 0x2c, 0x07, 0xc6, 0xfe, 0xe8, 0xed, 0xe5, 0x77, 0xa7, 0x5a, 0x92,
+ 0x41, 0xf7, 0x62, 0xb0, 0xe1, 0x85, 0x5b, 0x93, 0x85, 0x72, 0x1f, 0xcc,
+ 0xf3, 0x45, 0x93, 0x1c, 0x9e, 0xfc, 0x60, 0xb4, 0xd6, 0xf3, 0xc1, 0xbb,
+ 0x1f, 0x02, 0xca, 0x5f, 0x0f, 0x87, 0xb7, 0xb2, 0x1e, 0xa2, 0xd9, 0x86,
+ 0xb0, 0x1d, 0xdd, 0xd8, 0x6d, 0xb6, 0xc2, 0xef, 0x7b, 0x0d, 0x52, 0x31,
+ 0xb7, 0xc2, 0x2a, 0x0c, 0xfc, 0xa2, 0xd2, 0x6a, 0xb3, 0x1a, 0x0b, 0xf9,
+ 0xf5, 0x7c, 0x57, 0x2b, 0x16, 0xac, 0xf5, 0xa1, 0x7d, 0xda, 0xb6, 0x19,
+ 0x3f, 0x64, 0xf7, 0xe0, 0xb7, 0x49, 0x5e, 0xd0, 0x7f, 0xe3, 0x15, 0x25,
+ 0xce, 0xab, 0xfc, 0x96, 0xf4, 0x3f, 0xf3, 0x2c, 0x07, 0x19, 0xe8, 0xd1,
+ 0xa1, 0xad, 0xaf, 0x21, 0x81, 0x0e, 0x6a, 0x04, 0xb1, 0x50, 0x34, 0x0a,
+ 0x8f, 0x46, 0x10, 0x2c, 0xcb, 0xa7, 0xec, 0xeb, 0xe0, 0xf6, 0xd0, 0xa0,
+ 0x99, 0x9e, 0x61, 0xf2, 0xea, 0xf8, 0xa2, 0x9f, 0x9c, 0x1f, 0xbf, 0x61,
+ 0x30, 0xdf, 0xf1, 0xdb, 0xaf, 0x99, 0x56, 0x45, 0x2b, 0x49, 0x20, 0x36,
+ 0x17, 0xa2, 0xfb, 0xbc, 0x39, 0x31, 0xef, 0x82, 0xe5, 0xa4, 0xae, 0xcd,
+ 0xed, 0xfa, 0x3b, 0x66, 0x1b, 0xf3, 0xd8, 0x5e, 0x98, 0xff, 0xc4, 0xa6,
+ 0xca, 0xd8, 0x11, 0xdf, 0x44, 0xa6, 0x4b, 0x14, 0x33, 0x1b, 0xcd, 0x15,
+ 0xa3, 0x80, 0x66, 0x83, 0x67, 0xcc, 0x4c, 0x48, 0x18, 0x57, 0xd4, 0x09,
+ 0x82, 0xeb, 0x07, 0xf9, 0xd6, 0x5c, 0xe4, 0x48, 0xa2, 0x42, 0x64, 0xc5,
+ 0x9a, 0xcf, 0xf5, 0x69, 0x5f, 0xd2, 0x95, 0xe4, 0x4d, 0x46, 0x2c, 0x95,
+ 0xa4, 0xca, 0x05, 0x6a, 0xed, 0x71, 0x76, 0x98, 0xb9, 0xce, 0xa7, 0xc8,
+ 0x55, 0x33, 0xdf, 0x28, 0x2b, 0x8a, 0x26, 0xfe, 0x9e, 0x13, 0x57, 0x8d,
+ 0x93, 0x17, 0x33, 0xf3, 0xe2, 0x2c, 0x8e, 0x21, 0xe5, 0xe2, 0xcb, 0xae,
+ 0x88, 0x74, 0x87, 0x86, 0x5a, 0xaa, 0x0c, 0xb2, 0xcd, 0x8b, 0x66, 0x38,
+ 0xc8, 0x1a, 0x62, 0xab, 0xa0, 0x3e, 0x8b, 0xbd, 0x15, 0x64, 0x9a, 0x6e,
+ 0x02, 0x74, 0xb7, 0xd9, 0x4f, 0x36, 0x89, 0x6b, 0x9b, 0xfe, 0x44, 0xd9,
+ 0x41, 0x29, 0xb1, 0xbd, 0xd9, 0x0f, 0xeb, 0x87, 0x6e, 0xca, 0x76, 0xdd,
+ 0x34, 0x3b, 0x9e, 0x5b, 0xa3, 0x25, 0x44, 0xfe, 0x8e, 0xf4, 0x83, 0x5d,
+ 0x88, 0x79, 0x2d, 0x11, 0x74, 0x20, 0x98, 0x04, 0xb0, 0x5f, 0x07, 0x9c,
+ 0xd0, 0xb6, 0xb9, 0x76, 0x32, 0xf0, 0xaa, 0xbc, 0xf6, 0xdf, 0x58, 0x96,
+ 0xf0, 0x32, 0xfc, 0xd2, 0x5a, 0x54, 0xce, 0xc7, 0xd5, 0x69, 0x4e, 0x17,
+ 0xcb, 0x5f, 0x67, 0x7d, 0x3d, 0x5a, 0x9a, 0xe7, 0x90, 0x33, 0x1e, 0xfc,
+ 0x21, 0x81, 0x3b, 0x94, 0x80, 0x79, 0x53, 0x56, 0xdd, 0x05, 0xc5, 0xed,
+ 0x97, 0xd3, 0x90, 0x4b, 0x20, 0x04, 0x42, 0xb0, 0x0e, 0x02, 0x2a, 0x55,
+ 0xed, 0xf6, 0x80, 0x4d, 0xac, 0xa3, 0x44, 0x6c, 0x46, 0x20, 0xfc, 0xee,
+ 0x2a, 0xa2, 0xfb, 0x29, 0x34, 0x52, 0xc6, 0x42, 0x2c, 0x9e, 0x16, 0xae,
+ 0x8c, 0x40, 0x66, 0x91, 0x66, 0x52, 0xe7, 0x41, 0x41, 0x0c, 0x95, 0x76,
+ 0x6b, 0x20, 0x01, 0x20, 0xb5, 0xea, 0xe8, 0xbd, 0x3f, 0xfc, 0x93, 0x2b,
+ 0x27, 0xe5, 0x39, 0x38, 0x57, 0x34, 0x92, 0xf9, 0xf3, 0x68, 0xf6, 0x83,
+ 0x0e, 0x5e, 0x15, 0x34, 0x22, 0x03, 0x08, 0x8e, 0x17, 0x46, 0x46, 0x64,
+ 0x41, 0xfa, 0x77, 0xbb, 0x4c, 0xd2, 0x5c, 0x8a, 0xe0, 0x78, 0x04, 0x30,
+ 0x78, 0xd7, 0xd6, 0xe8, 0xf2, 0x7d, 0xae, 0x83, 0x48, 0x71, 0x4f, 0x90,
+ 0x97, 0xba, 0x8c, 0x03, 0x1c, 0x5b, 0x30, 0x5b, 0x68, 0xda, 0xae, 0x82,
+ 0xab, 0x78, 0x42, 0xc8, 0x61, 0x28, 0xb0, 0x1d, 0xe8, 0x7f, 0x69, 0x60,
+ 0xa8, 0x9a, 0xee, 0x2b, 0x1f, 0x28, 0x35, 0x46, 0x60, 0x92, 0x29, 0x7b,
+ 0xaf, 0xb0, 0x24, 0xb6, 0x9f, 0x28, 0x5b, 0xcb, 0xfd, 0xc2, 0x2f, 0xe8,
+ 0x44, 0x07, 0xfa, 0xdc, 0xd8, 0x34, 0x71, 0x97, 0x4f, 0x51, 0x27, 0x5c,
+ 0x40, 0x34, 0x94, 0x5c, 0x2d, 0x79, 0x2e, 0xe4, 0x49, 0xcc, 0x43, 0xf8,
+ 0xe6, 0x38, 0xee, 0x65, 0xe1, 0x15, 0xc3, 0x9c, 0x26, 0x9c, 0xf1, 0x4d,
+ 0xce, 0x14, 0x2c, 0x03, 0x1c, 0x8f, 0x3b, 0x7c, 0x1d, 0xdb, 0x5c, 0x47,
+ 0x63, 0xf5, 0x2f, 0xaf, 0x88, 0x77, 0x38, 0x74, 0xa3, 0x2a, 0xca, 0x72,
+ 0x68, 0x8f, 0x08, 0x93, 0x91, 0x7f, 0x60, 0x62, 0xc7, 0x6f, 0x37, 0xb5,
+ 0xce, 0x0e, 0x51, 0x79, 0x80, 0xb5, 0x92, 0xc1, 0x51, 0xe6, 0x84, 0x7e,
+ 0xc8, 0x67, 0x65, 0xd4, 0xef, 0x69, 0x44, 0xdb, 0x1c, 0xaf, 0xbf, 0xd9,
+ 0x54, 0x5f, 0x16, 0x25, 0x00, 0x5d, 0xa7, 0xf2, 0x5b, 0x4e, 0xfe, 0xdb,
+ 0xbc, 0xe6, 0x4f, 0x7c, 0xbd, 0xa9, 0xfc, 0xc4, 0x61, 0x8a, 0x03, 0xb9,
+ 0x56, 0xd9, 0x95, 0xaa, 0x31, 0xf8, 0xfa, 0x20, 0xd9, 0xdf, 0xdd, 0xfd,
+ 0xb6, 0x9f, 0x3c, 0xe1, 0xc2, 0xe9, 0x7b, 0x5f, 0x47, 0x73, 0x64, 0x19,
+ 0x63, 0x42, 0x2a, 0xb2, 0x46, 0x07, 0x07, 0x7f, 0x25, 0xcd, 0x18, 0x73,
+ 0xc6, 0x3b, 0xd3, 0x42, 0x1a, 0x19, 0x38, 0xeb, 0x30, 0xbf, 0xdd, 0x0b,
+ 0x8c, 0x96, 0x6a, 0x41, 0x9a, 0xdc, 0x34, 0x53, 0x92, 0xbb, 0x39, 0x5c,
+ 0x50, 0x14, 0x61, 0x5d, 0x48, 0x8a, 0x17, 0x6d, 0xd5, 0x81, 0x25, 0xce,
+ 0xa9, 0x67, 0xf4, 0x00, 0x08, 0xc3, 0xcb, 0x00, 0x90, 0x35, 0x5b, 0x40,
+ 0x8b, 0xb5, 0x9c, 0xfe, 0x5e, 0x97, 0x08, 0x9e, 0x3d, 0x49, 0xc4, 0x10,
+ 0xff, 0x1d, 0x75, 0x89, 0x19, 0x82, 0xfa, 0x79, 0xdd, 0x0c, 0xc8, 0xd6,
+ 0x8c, 0x3a, 0xea, 0xcf, 0xcf, 0xce, 0x9f, 0x6c, 0x5b, 0x58, 0x39, 0x73,
+ 0x86, 0x48, 0xae, 0x4f, 0xa2, 0x30, 0x41, 0x9b, 0x05, 0xa4, 0xdc, 0x62,
+ 0x40, 0x9b, 0xc6, 0xaa, 0x60, 0x2b, 0xbd, 0x2e, 0xbe, 0x07, 0xaf, 0xac,
+ 0xcb, 0x2c, 0xf7, 0x8a, 0x42, 0xb8, 0x63, 0xc9, 0x32, 0x81, 0x50, 0x22,
+ 0x1b, 0x61, 0xa2, 0xa4, 0x58, 0x1d, 0x92, 0x67, 0x38, 0x00, 0x8a, 0x35,
+ 0x69, 0xf3, 0x4d, 0x13, 0xe4, 0xb1, 0xd3, 0xc9, 0x76, 0x6e, 0x97, 0x17,
+ 0x06, 0x16, 0xb0, 0xa8, 0x7b, 0x10, 0x5e, 0x63, 0xc5, 0xf4, 0xf2, 0x7d,
+ 0x6b, 0x83, 0x68, 0xe4, 0xd2, 0xa2, 0x7d, 0xcb, 0x94, 0x60, 0xc3, 0x95,
+ 0x75, 0xf1, 0x2c, 0x31, 0x6b, 0x4b, 0x6d, 0x16, 0xfe, 0xf6, 0x34, 0x79,
+ 0x7b, 0x3a, 0xba, 0xf4, 0x3d, 0xfd, 0x70, 0xe8, 0x06, 0x08, 0xa8, 0x36,
+ 0x55, 0x81, 0x17, 0x2f, 0x3e, 0x3d, 0x19, 0x5d, 0x0e, 0x63, 0x94, 0xa3,
+ 0x07, 0xc9, 0xa8, 0x9c, 0xfb, 0x95, 0xf8, 0x6a, 0xa9, 0x94, 0x06, 0xb8,
+ 0x33, 0x87, 0x2f, 0xd4, 0x9b, 0x9f, 0x57, 0xbe, 0xaf, 0x3f, 0xd8, 0xa9,
+ 0xd4, 0xc5, 0xcf, 0x19, 0xdd, 0x24, 0xc8, 0x28, 0x75, 0xe4, 0xd7, 0xcb,
+ 0xf1, 0xc0, 0xe3, 0x06, 0x61, 0x7d, 0x07, 0x64, 0xe5, 0x66, 0xf7, 0x9a,
+ 0x1b, 0xea, 0x43, 0x68, 0x08, 0x6c, 0xc9, 0x7e, 0xe2, 0x8d, 0x24, 0xac,
+ 0x2e, 0x2d, 0x8f, 0xe4, 0x24, 0xc9, 0xc0, 0x13, 0x05, 0x5f, 0x00, 0x3d,
+ 0xfd, 0xa8, 0x4d, 0x45, 0x13, 0xd1, 0x99, 0x47, 0xa9, 0x6e, 0xd1, 0x06,
+ 0x3a, 0x52, 0x64, 0xc5, 0xe3, 0xba, 0x58, 0x17, 0x4c, 0xf2, 0x76, 0xa1,
+ 0x92, 0xce, 0xc8, 0xae, 0xe3, 0xa2, 0x7b, 0xec, 0x16, 0xb0, 0xbd, 0x5e,
+ 0x45, 0x5d, 0x95, 0x4f, 0x99, 0xd9, 0xa5, 0x6e, 0x53, 0xbb, 0x70, 0xf6,
+ 0x0e, 0x89, 0x1c, 0x26, 0x72, 0x26, 0xeb, 0x75, 0xc5, 0x4a, 0xb2, 0xdf,
+ 0xa4, 0x05, 0x69, 0x19, 0xfc, 0xc0, 0x38, 0x29, 0x04, 0x33, 0xfa, 0x31,
+ 0xca, 0x81, 0x58, 0xaa, 0xac, 0xc7, 0x9a, 0xfe, 0xce, 0x98, 0xb6, 0x76,
+ 0xbe, 0x64, 0x7e, 0xa4, 0x52, 0xad, 0x0c, 0x95, 0xd0, 0xb0, 0x2a, 0x34,
+ 0xb1, 0x22, 0x81, 0x67, 0x7e, 0x59, 0xe4, 0xe6, 0xfb, 0x09, 0xab, 0xae,
+ 0x57, 0x04, 0x00, 0xad, 0x52, 0x06, 0xf7, 0xe0, 0x1e, 0x33, 0x63, 0xda,
+ 0xac, 0x2d, 0x83, 0x22, 0x39, 0x05, 0xf4, 0xb8, 0x7e, 0x88, 0xd6, 0x43,
+ 0x5a, 0x05, 0xe4, 0xf7, 0xd3, 0x00, 0xf7, 0xda, 0x94, 0x3d, 0x60, 0xe7,
+ 0x92, 0x04, 0x7b, 0x73, 0x21, 0xed, 0x20, 0x77, 0x34, 0x5a, 0x17, 0x36,
+ 0x4d, 0x3c, 0xe0, 0x84, 0x24, 0x8d, 0x2a, 0xbe, 0xb7, 0x92, 0x44, 0xd5,
+ 0xad, 0xd7, 0x17, 0x67, 0x6f, 0x06, 0x97, 0x67, 0x28, 0xff, 0x87, 0xa6,
+ 0x93, 0x88, 0xc6, 0xa9, 0xe5, 0x5b, 0xbd, 0x1a, 0x86, 0x6d, 0xd4, 0xc9,
+ 0x56, 0xbd, 0x3d, 0xf4, 0x79, 0x7f, 0x17, 0x7e, 0xd1, 0xd7, 0x80, 0x81,
+ 0xb7, 0x60, 0x5d, 0x04, 0xe6, 0xa6, 0xd9, 0x4d, 0x93, 0x94, 0x54, 0x46,
+ 0x1b, 0x6f, 0x40, 0x03, 0x2a, 0xbc, 0xc7, 0xcb, 0xfa, 0x1e, 0xdc, 0xe0,
+ 0x00, 0x22, 0x01, 0x22, 0xd5, 0x84, 0x4e, 0x5c, 0x65, 0xa0, 0xb0, 0xc9,
+ 0xb7, 0xc4, 0xd8, 0xc1, 0x70, 0xf0, 0xa6, 0x34, 0xe7, 0x37, 0xad, 0xaa,
+ 0xf2, 0x4e, 0x6f, 0x2e, 0xe4, 0x30, 0x98, 0x85, 0xb4, 0x65, 0xe7, 0x57,
+ 0xa6, 0x2a, 0x4a, 0x12, 0xbe, 0x56, 0x52, 0x5b, 0xab, 0x00, 0x3e, 0x6b,
+ 0xa7, 0x8f, 0x29, 0x6a, 0x6c, 0xd0, 0x54, 0xc6, 0x5e, 0xca, 0xa6, 0x2b,
+ 0xd0, 0x19, 0xa7, 0x24, 0x29, 0x01, 0x34, 0xf3, 0xde, 0xe9, 0x0b, 0x51,
+ 0x08, 0x25, 0x94, 0x82, 0xfe, 0x5d, 0xfd, 0x47, 0x96, 0x39, 0xfb, 0x2f,
+ 0xc1, 0x19, 0x16, 0xfa, 0x30, 0x52, 0xeb, 0x67, 0x33, 0x07, 0x34, 0x13,
+ 0x16, 0x1a, 0xaa, 0xd6, 0x4a, 0x7b, 0x5b, 0xb1, 0x60, 0x20, 0x08, 0x80,
+ 0x3c, 0xa0, 0x9f, 0x06, 0xda, 0xa4, 0xa6, 0xfc, 0xe6, 0x94, 0x6c, 0x35,
+ 0x5d, 0x4e, 0xb0, 0x4a, 0x14, 0x98, 0xa1, 0x52, 0x27, 0x63, 0xe6, 0x22,
+ 0xd2, 0x7c, 0x25, 0x6a, 0xda, 0x41, 0xec, 0xd8, 0xce, 0xee, 0xea, 0x59,
+ 0xfc, 0x94, 0x2d, 0x2d, 0x40, 0xca, 0x24, 0xe1, 0x35, 0x32, 0x56, 0x2c,
+ 0xab, 0xa0, 0xf6, 0x51, 0x71, 0x55, 0xda, 0x02, 0x52, 0x11, 0x81, 0x45,
+ 0xac, 0x8f, 0xa0, 0xb9, 0x13, 0x7c, 0x06, 0xb1, 0xb5, 0xd0, 0xf6, 0x45,
+ 0x6c, 0xf4, 0x2b, 0xf2, 0x6c, 0x76, 0x5a, 0xdc, 0x5e, 0xe3, 0x45, 0x5c,
+ 0x2a, 0x22, 0xd3, 0x5b, 0xbd, 0x16, 0xee, 0x6f, 0xc5, 0xca, 0x9d, 0xc8,
+ 0x3d, 0x6d, 0x6b, 0xbe, 0x32, 0x78, 0xc5, 0xce, 0xb9, 0x9c, 0x6c, 0xd0,
+ 0x89, 0x5c, 0x73, 0x41, 0x46, 0xc2, 0xcc, 0x4d, 0x63, 0x80, 0x7c, 0xad,
+ 0x6d, 0xd1, 0x24, 0xfa, 0xd1, 0x64, 0x8b, 0xbc, 0x80, 0x13, 0x1f, 0xc2,
+ 0x7c, 0x2a, 0xbf, 0x52, 0xc4, 0x24, 0xf3, 0x03, 0x76, 0x9a, 0x7b, 0xf2,
+ 0xc3, 0x0f, 0x49, 0xbb, 0x1c, 0xd5, 0xf6, 0xaa, 0xc4, 0x2e, 0x41, 0xb3,
+ 0x4e, 0x4b, 0xbf, 0xbb, 0x01, 0x20, 0x9f, 0xf7, 0x9c, 0x51, 0x09, 0x00,
+ 0xfc, 0x83, 0x4b, 0x48, 0x62, 0x41, 0xc6, 0xfe, 0xbb, 0x51, 0x84, 0x36,
+ 0xc2, 0xec, 0x2e, 0xce, 0x9e, 0xa0, 0x86, 0xc0, 0xe0, 0x24, 0x02, 0x46,
+ 0x81, 0xc8, 0x75, 0xb1, 0x75, 0x21, 0x3b, 0xe6, 0xfc, 0x5f, 0x7f, 0xc2,
+ 0x5c, 0xd9, 0xc2, 0xfa, 0x86, 0xdc, 0xc0, 0xb8, 0x10, 0x1e, 0x2c, 0x99,
+ 0xc5, 0x89, 0x6c, 0x18, 0x19, 0x2e, 0x7d, 0x26, 0x46, 0x25, 0xa8, 0xd3,
+ 0xa4, 0xca, 0xc4, 0xdb, 0x50, 0xdb, 0x3c, 0xff, 0x20, 0xd8, 0x47, 0xf9,
+ 0xa7, 0x33, 0x86, 0x69, 0x0e, 0xb1, 0xc2, 0xa9, 0x77, 0x62, 0x1c, 0x8b,
+ 0x48, 0x67, 0xcd, 0x18, 0xbd, 0x19, 0xd6, 0xe8, 0x2c, 0x49, 0x83, 0xa2,
+ 0x64, 0x2e, 0x50, 0x21, 0x94, 0x1c, 0x4c, 0x94, 0x42, 0x4a, 0x7c, 0xdf,
+ 0xfc, 0x45, 0xcf, 0xed, 0xb0, 0x1d, 0xb6, 0xa0, 0x5d, 0x10, 0x8b, 0x54,
+ 0xa9, 0x30, 0xc1, 0xc2, 0x10, 0x61, 0x15, 0xe5, 0x65, 0x2b, 0xa9, 0x3e,
+ 0x79, 0xf4, 0x34, 0x96, 0xc9, 0x1a, 0x35, 0x72, 0xaa, 0xb8, 0x4e, 0x62,
+ 0x40, 0x9e, 0xe6, 0x8e, 0x2c, 0x41, 0x2d, 0xe0, 0x9d, 0x72, 0x6c, 0x0b,
+ 0xb0, 0x19, 0x06, 0xc6, 0x28, 0x1d, 0xe0, 0xb1, 0x7a, 0x15, 0x2a, 0xc0,
+ 0x05, 0x37, 0x84, 0xfe, 0xd7, 0x9f, 0x30, 0xf5, 0x6d, 0xdb, 0xfc, 0x3d,
+ 0x01, 0xa8, 0x0b, 0x8f, 0x2c, 0xe5, 0x8e, 0x75, 0x8f, 0x96, 0x1f, 0xe0,
+ 0x41, 0xaa, 0x9c, 0xf9, 0xf7, 0xf9, 0xbb, 0xcb, 0x6d, 0x57, 0x73, 0x53,
+ 0x76, 0xab, 0x8f, 0x6e, 0x95, 0xc4, 0x97, 0xb0, 0x8e, 0x0c, 0xa7, 0xa7,
+ 0x89, 0x9c, 0x12, 0x84, 0x9b, 0x1c, 0x0c, 0x72, 0xb2, 0x3c, 0xd9, 0xdd,
+ 0x33, 0x96, 0xd4, 0xee, 0x3e, 0x8a, 0x6f, 0x3d, 0xd9, 0x7d, 0x32, 0x64,
+ 0x1b, 0xc3, 0x15, 0x51, 0x0d, 0xae, 0x05, 0xda, 0xd8, 0xa8, 0xf0, 0x8e,
+ 0xf2, 0x4f, 0x82, 0xe9, 0x7d, 0xf2, 0xf1, 0x23, 0x7e, 0xd5, 0x06, 0x66,
+ 0x0e, 0x6c, 0x3e, 0x83, 0xed, 0x6a, 0xfc, 0xe6, 0xf7, 0x66, 0x1c, 0x01,
+ 0x98, 0x65, 0xc1, 0xb9, 0x43, 0x28, 0x6f, 0x46, 0x29, 0x70, 0x2b, 0xab,
+ 0x4e, 0x34, 0xdd, 0x4c, 0x7f, 0xbf, 0xbc, 0x82, 0xd9, 0x2b, 0x34, 0x78,
+ 0xfb, 0x15, 0xcd, 0xa7, 0x0b, 0x85, 0x33, 0x1e, 0x13, 0xa8, 0xb4, 0x51,
+ 0x18, 0x9e, 0xec, 0x7e, 0xf4, 0x15, 0xe3, 0xd6, 0x96, 0x30, 0x97, 0x9d,
+ 0x88, 0x24, 0x45, 0xe1, 0x86, 0x8e, 0x08, 0x92, 0x7f, 0x07, 0x14, 0xcf,
+ 0x37, 0x87, 0x02, 0x33, 0xac, 0x7f, 0xdd, 0x97, 0x98, 0x3e, 0xff, 0xeb,
+ 0x49, 0xfb, 0xae, 0xbc, 0xce, 0x8b, 0x81, 0xb6, 0xf9, 0x42, 0xfe, 0x12,
+ 0xf8, 0x2b, 0x51, 0x75, 0x89, 0x94, 0x63, 0xd0, 0x1c, 0x6f, 0x5b, 0x17,
+ 0x0a, 0x8c, 0x3e, 0x6a, 0xc2, 0x76, 0x4b, 0xd4, 0x14, 0x29, 0x67, 0x27,
+ 0x22, 0x7a, 0xad, 0xf0, 0x18, 0xae, 0xae, 0x62, 0x61, 0x49, 0x09, 0xe4,
+ 0x23, 0xf6, 0x2b, 0x7e, 0x3c, 0xdc, 0x16, 0xcb, 0x52, 0xd5, 0x38, 0x1a,
+ 0xbe, 0x93, 0xeb, 0x81, 0x2b, 0x2b, 0xb3, 0x1c, 0x95, 0x3e, 0x76, 0x7a,
+ 0x93, 0x1c, 0x36, 0x28, 0x8e, 0x25, 0x39, 0x36, 0x81, 0x99, 0x4a, 0x53,
+ 0xd1, 0x67, 0x3b, 0x95, 0xcb, 0xce, 0x11, 0xef, 0xb3, 0x02, 0xe2, 0x5a,
+ 0x73, 0xc1, 0x2e, 0x6b, 0xd0, 0x96, 0x49, 0x44, 0x3d, 0x72, 0xa7, 0x71,
+ 0x34, 0x3d, 0x9c, 0x47, 0x73, 0x0e, 0xe9, 0x6a, 0x25, 0xbd, 0x5f, 0x2a,
+ 0x63, 0x3d, 0xed, 0xe3, 0x6f, 0xcf, 0x76, 0x3f, 0xdb, 0x17, 0xf7, 0xe0,
+ 0xc9, 0xf1, 0xe5, 0xeb, 0xae, 0x43, 0xaf, 0x32, 0xfb, 0x89, 0xff, 0x4b,
+ 0xa5, 0x82, 0x6f, 0x8c, 0x81, 0x41, 0x79, 0xbf, 0x03, 0x62, 0x8e, 0x1d,
+ 0xec, 0xee, 0xc6, 0x02, 0xec, 0xbf, 0x23, 0x31, 0xe9, 0x93, 0xa7, 0xed,
+ 0xd8, 0x0b, 0xa9, 0xf5, 0x03, 0x9a, 0xef, 0xd5, 0xfc, 0x54, 0xbc, 0xbf,
+ 0x9c, 0x8f, 0xce, 0x51, 0x18, 0xca, 0x1b, 0x5e, 0x60, 0x35, 0x82, 0x8e,
+ 0x88, 0x91, 0x96, 0x77, 0xdc, 0xea, 0x02, 0x22, 0xd9, 0x62, 0x3b, 0xa2,
+ 0xb9, 0xdf, 0x16, 0xae, 0xfa, 0x44, 0xea, 0xa0, 0x41, 0xc8, 0x8b, 0x15,
+ 0x11, 0xcd, 0xb9, 0xab, 0x25, 0xe3, 0xa0, 0xca, 0x88, 0x3f, 0x80, 0x15,
+ 0x3f, 0xe1, 0x7e, 0x7f, 0x98, 0x03, 0x01, 0x53, 0x50, 0x4d, 0x16, 0x92,
+ 0x7f, 0xc2, 0xff, 0xa6, 0xab, 0xb8, 0x05, 0x74, 0xdc, 0x7f, 0x16, 0x99,
+ 0x38, 0x5c, 0xd8, 0xbf, 0x60, 0xe2, 0xda, 0xf3, 0xe6, 0xd4, 0x23, 0x76,
+ 0xe3, 0xc1, 0xe8, 0x95, 0x68, 0x41, 0x98, 0x9b, 0x5e, 0x6b, 0xb5, 0xa7,
+ 0x5f, 0x3c, 0x16, 0x9a, 0xee, 0xe1, 0x3a, 0x2e, 0x15, 0xf7, 0xd6, 0x03,
+ 0x63, 0x19, 0x59, 0xc0, 0x4b, 0x7b, 0x24, 0x7d, 0xc7, 0xe7, 0x4b, 0xf7,
+ 0xc7, 0x5c, 0xca, 0x13, 0xc0, 0xdf, 0x80, 0xc8, 0x53, 0xa7, 0xb9, 0x8b,
+ 0x6c, 0x91, 0x61, 0xe8, 0x7e, 0x80, 0xd9, 0xdb, 0xdc, 0xd6, 0x4e, 0x6d,
+ 0xbc, 0x7a, 0xd7, 0xe6, 0x1e, 0xcd, 0x17, 0x44, 0x30, 0x56, 0x47, 0x7d,
+ 0x2d, 0xed, 0x5a, 0x96, 0x98, 0x4b, 0xf5, 0xcb, 0xf6, 0xe5, 0x26, 0x93,
+ 0xf7, 0x75, 0x8e, 0x2d, 0x7c, 0x27, 0xcc, 0xa7, 0x23, 0x93, 0x1d, 0x4d,
+ 0xd8, 0xa5, 0x2a, 0x5d, 0x52, 0x1e, 0xb7, 0x5d, 0xc6, 0x15, 0x00, 0xbf,
+ 0x17, 0x85, 0x23, 0x3c, 0x13, 0x68, 0x9a, 0xec, 0xf8, 0x64, 0xeb, 0xbb,
+ 0x8b, 0xd7, 0x7f, 0xb5, 0xa9, 0xbc, 0xdb, 0xfd, 0xb8, 0x35, 0xac, 0xfd,
+ 0xf5, 0x42, 0x48, 0x0e, 0xb4, 0x25, 0x09, 0xa4, 0xad, 0x89, 0x77, 0xff,
+ 0x08, 0xf1, 0xbd, 0x4c, 0xd1, 0x95, 0x6c, 0x51, 0xa5, 0x41, 0xf3, 0xd4,
+ 0x48, 0x8c, 0xba, 0x27, 0xc3, 0x67, 0xf0, 0x8a, 0xbc, 0x3e, 0x7a, 0xf6,
+ 0x64, 0x7f, 0xcf, 0xd8, 0xad, 0x5b, 0x1d, 0x69, 0xb1, 0xfd, 0xe0, 0x30,
+ 0xdb, 0xeb, 0x9d, 0x7d, 0x5c, 0xd0, 0xde, 0xdb, 0x3a, 0xfe, 0xe1, 0xfc,
+ 0xad, 0x37, 0x40, 0xbb, 0x02, 0x41, 0x6e, 0xa5, 0x3f, 0x42, 0x4e, 0x6c,
+ 0xb2, 0x63, 0x74, 0xb7, 0x6d, 0xb0, 0xa5, 0x38, 0x75, 0x31, 0xcc, 0x9a,
+ 0xed, 0xbd, 0xae, 0x72, 0xd2, 0x73, 0x7b, 0x34, 0x1f, 0xbd, 0xd3, 0xb2,
+ 0x98, 0x9a, 0xdb, 0xff, 0x8c, 0xf8, 0x26, 0xb2, 0x9e, 0x51, 0x63, 0x1f,
+ 0x1c, 0xdd, 0xea, 0x63, 0xf2, 0xa6, 0x8f, 0xa3, 0x52, 0x84, 0x50, 0x84,
+ 0x37, 0xf8, 0x21, 0x98, 0xbe, 0x28, 0x2f, 0x9a, 0xf3, 0x4d, 0x96, 0x64,
+ 0xe7, 0x90, 0x8b, 0xb7, 0x69, 0x95, 0x5f, 0x66, 0x4d, 0x12, 0xee, 0x37,
+ 0xf2, 0xfa, 0xbc, 0x80, 0x53, 0x7b, 0x55, 0x3c, 0x84, 0x47, 0xce, 0xd1,
+ 0x10, 0x3c, 0xbe, 0xa5, 0x8e, 0xfd, 0x6d, 0xaf, 0x52, 0x14, 0x97, 0x50,
+ 0x93, 0x70, 0x07, 0x54, 0xf5, 0x58, 0x09, 0x12, 0x3c, 0xea, 0xcc, 0x8a,
+ 0xbc, 0x0d, 0x5e, 0xc6, 0x51, 0x44, 0x22, 0x69, 0xbf, 0xcd, 0xc4, 0x11,
+ 0xf1, 0x83, 0x23, 0xd4, 0xcb, 0x15, 0x23, 0x8a, 0x69, 0x4b, 0xd1, 0x43,
+ 0xc9, 0x61, 0xd8, 0x40, 0xa8, 0x7b, 0x0f, 0x25, 0xf1, 0xf9, 0x93, 0xd0,
+ 0xa9, 0x75, 0x76, 0x79, 0x7c, 0xc0, 0x25, 0x3f, 0x6c, 0xb6, 0xb8, 0x2a,
+ 0xc4, 0x0c, 0x94, 0x41, 0x41, 0x33, 0x49, 0x9b, 0xf0, 0x47, 0xd7, 0x8f,
+ 0x15, 0x8f, 0x07, 0x66, 0x95, 0x36, 0x03, 0x3b, 0x35, 0x9b, 0x95, 0xac,
+ 0x46, 0xc8, 0x84, 0x13, 0x15, 0x98, 0xe3, 0x6f, 0xb1, 0xc2, 0xb4, 0x57,
+ 0x9c, 0x60, 0x8a, 0x9c, 0x4d, 0xbe, 0x56, 0x82, 0x89, 0x92, 0x40, 0x19,
+ 0x0c, 0x0b, 0xeb, 0x4b, 0x9c, 0x50, 0xe5, 0x9b, 0xb0, 0x60, 0x0b, 0x82,
+ 0x51, 0xaf, 0xa5, 0x56, 0x26, 0x14, 0xef, 0xd5, 0x65, 0xe4, 0x3d, 0x49,
+ 0xee, 0x62, 0x66, 0xdd, 0xbd, 0x23, 0x56, 0x08, 0xb9, 0xbb, 0x56, 0xe5,
+ 0xc7, 0xc3, 0xe1, 0x65, 0xc3, 0x68, 0xe2, 0xe5, 0xa2, 0x1d, 0xa3, 0xf6,
+ 0x08, 0x99, 0x4f, 0x56, 0x17, 0x97, 0x2c, 0xef, 0x30, 0x52, 0x8b, 0x93,
+ 0xde, 0xb6, 0xff, 0x9d, 0x5d, 0xa9, 0x5a, 0x09, 0x80, 0x04, 0x99, 0xab,
+ 0x48, 0x2d, 0x56, 0x6c, 0x9c, 0x3d, 0x07, 0x1a, 0xa8, 0xd7, 0x89, 0x3a,
+ 0xe9, 0x11, 0xdd, 0xc9, 0xb8, 0x5e, 0x56, 0xd3, 0xe5, 0xdc, 0x1c, 0x50,
+ 0x1f, 0x17, 0x0d, 0x05, 0x07, 0xb6, 0x1b, 0xa0, 0x07, 0x11, 0x97, 0xf8,
+ 0xb3, 0xdd, 0x56, 0x63, 0x43, 0x0c, 0xbc, 0x13, 0xd8, 0x1d, 0xec, 0xd9,
+ 0x5c, 0xf5, 0x1c, 0x19, 0x60, 0x1c, 0xcd, 0xfb, 0x1d, 0x63, 0x2a, 0xf3,
+ 0xbe, 0xac, 0x14, 0xa3, 0xab, 0xe8, 0xbf, 0x5f, 0x04, 0x12, 0x83, 0xd7,
+ 0x06, 0x4f, 0xe4, 0x85, 0xa2, 0x66, 0x58, 0x23, 0x20, 0xb7, 0x11, 0xbb,
+ 0xba, 0x70, 0x70, 0xef, 0x6e, 0x4a, 0x54, 0xef, 0xb1, 0xa1, 0xde, 0xd0,
+ 0x6c, 0x21, 0x73, 0x7c, 0xe8, 0x91, 0x2f, 0x7b, 0x59, 0x10, 0xb2, 0x36,
+ 0x34, 0xf1, 0xf0, 0x2e, 0x8d, 0x29, 0xc3, 0x2d, 0xf9, 0x5b, 0x39, 0x16,
+ 0xac, 0x1d, 0x99, 0x49, 0xb1, 0x74, 0xf7, 0x2b, 0x40, 0x7a, 0x97, 0x66,
+ 0xa3, 0x49, 0xbd, 0x7b, 0x0a, 0x50, 0x26, 0x02, 0x0e, 0xe5, 0x4a, 0x5d,
+ 0xe4, 0xde, 0x4f, 0xae, 0x41, 0x7e, 0xc2, 0xe8, 0x34, 0x25, 0x19, 0x0c,
+ 0x53, 0xb6, 0xf6, 0xbb, 0x29, 0xcd, 0xe9, 0x84, 0x6c, 0x7f, 0xd3, 0xb8,
+ 0xa4, 0x0f, 0x42, 0xf4, 0xd4, 0x0e, 0x43, 0x9b, 0x4e, 0x9a, 0xa5, 0xcc,
+ 0x7a, 0xb7, 0x77, 0xa5, 0xba, 0x03, 0xcd, 0xbb, 0xe0, 0xef, 0x03, 0x63,
+ 0xce, 0xc4, 0x6c, 0xbe, 0x74, 0x72, 0xaf, 0xd7, 0xa2, 0xbb, 0x43, 0xa8,
+ 0x89, 0x72, 0xe9, 0xb1, 0xfd, 0x05, 0x83, 0xb5, 0x9d, 0xa0, 0xd8, 0x5e,
+ 0x5e, 0xaf, 0x60, 0xdb, 0xfd, 0x4d, 0x35, 0x72, 0x9f, 0x33, 0x9d, 0x1d,
+ 0xac, 0x03, 0xe9, 0x67, 0xeb, 0xb4, 0x67, 0x4d, 0x4a, 0xb3, 0x1c, 0x2d,
+ 0xdd, 0xae, 0x18, 0x48, 0x98, 0x65, 0x2d, 0xf3, 0x97, 0xa3, 0x60, 0x20,
+ 0x44, 0x25, 0xd8, 0x3f, 0xc2, 0xbe, 0x4a, 0x18, 0x7e, 0x12, 0xde, 0x98,
+ 0x6f, 0xe4, 0x2b, 0x52, 0x05, 0x13, 0xf2, 0x4a, 0x73, 0x2a, 0xd8, 0xa0,
+ 0x7a, 0x9a, 0x6c, 0x91, 0x9d, 0x93, 0x3c, 0xfb, 0xf4, 0xd9, 0xd3, 0x6d,
+ 0x29, 0xac, 0x62, 0x81, 0x51, 0xdb, 0xb1, 0x0a, 0x0e, 0x38, 0x6e, 0xc2,
+ 0x8a, 0x89, 0x4b, 0x2c, 0xa7, 0x3a, 0x26, 0x1c, 0x81, 0x12, 0x27, 0x5e,
+ 0xce, 0xa4, 0xe7, 0xe4, 0x4e, 0x46, 0xf9, 0x00, 0x2d, 0x2f, 0xdd, 0x6d,
+ 0xce, 0x7c, 0x2c, 0xe3, 0x97, 0x6d, 0x81, 0x4e, 0x2b, 0xbf, 0x5d, 0xb2,
+ 0x02, 0x73, 0x32, 0x42, 0x1d, 0x51, 0x5a, 0xc6, 0x6d, 0xa4, 0xe1, 0x45,
+ 0xd1, 0x1a, 0xec, 0x5a, 0xe2, 0x8a, 0xea, 0x7c, 0x3d, 0xde, 0x50, 0x01,
+ 0xbd, 0xd2, 0xbb, 0x1a, 0xd8, 0x09, 0xc0, 0xe9, 0x26, 0x7c, 0xf7, 0xc4,
+ 0xf8, 0xc5, 0x8c, 0x5e, 0x8a, 0x98, 0x34, 0xdd, 0x65, 0xed, 0x79, 0x64,
+ 0xbe, 0x1a, 0xda, 0x29, 0xfa, 0xbe, 0xc0, 0x81, 0x64, 0x4d, 0xa2, 0xc9,
+ 0x8d, 0xf3, 0x6c, 0xae, 0xec, 0xde, 0x7c, 0xc9, 0x96, 0x95, 0xab, 0xcc,
+ 0xcb, 0xf1, 0x08, 0xbe, 0x31, 0x01, 0x61, 0x5c, 0x95, 0x9d, 0xae, 0x16,
+ 0x7f, 0xaa, 0x59, 0xb4, 0xad, 0x9e, 0xad, 0x84, 0xdc, 0xeb, 0x6e, 0xd3,
+ 0x7c, 0xf5, 0x2e, 0xd2, 0x5e, 0xff, 0x6e, 0x77, 0x65, 0x98, 0x64, 0xc3,
+ 0x5f, 0xed, 0x4c, 0xc4, 0x8a, 0xde, 0x73, 0x71, 0x5a, 0x90, 0xcb, 0xc0,
+ 0x5f, 0x30, 0x08, 0x49, 0x32, 0x92, 0x2d, 0x74, 0x78, 0x67, 0x67, 0xfb,
+ 0xe1, 0x4e, 0xcb, 0x93, 0x0f, 0x75, 0xf2, 0x9c, 0x8d, 0xf8, 0xc2, 0xaf,
+ 0xc9, 0xe8, 0xfa, 0x40, 0xdf, 0xa4, 0x15, 0x63, 0xb2, 0x4e, 0xc6, 0x39,
+ 0x32, 0x4c, 0x84, 0xb4, 0x08, 0x4a, 0x9b, 0x0c, 0xef, 0x20, 0x76, 0x89,
+ 0xa4, 0x32, 0xc0, 0xf6, 0xd8, 0xc5, 0xbc, 0x63, 0xce, 0x1b, 0x11, 0x21,
+ 0x84, 0x03, 0x02, 0x09, 0xc9, 0xa1, 0xd9, 0x84, 0xa1, 0x66, 0xe5, 0xba,
+ 0xe5, 0x0d, 0x0e, 0xc6, 0x5c, 0xc7, 0xa9, 0x8c, 0x53, 0xa8, 0xb4, 0xe2,
+ 0xec, 0x7e, 0x8e, 0xc0, 0xb5, 0xf5, 0x69, 0x95, 0x46, 0x52, 0xf8, 0x6e,
+ 0x18, 0xd0, 0x58, 0xf1, 0x93, 0xae, 0xf8, 0x5a, 0x84, 0x04, 0xd3, 0x77,
+ 0x07, 0x4a, 0x83, 0x46, 0xa2, 0x7e, 0x70, 0x63, 0x66, 0x12, 0x29, 0x2e,
+ 0xb0, 0x27, 0x05, 0x15, 0xac, 0x6f, 0x3b, 0xad, 0x42, 0x0f, 0x33, 0xfa,
+ 0x66, 0xf7, 0x37, 0x66, 0x8c, 0xd3, 0xd5, 0xc7, 0xfc, 0xd3, 0xd6, 0x64,
+ 0xf6, 0xf9, 0x8c, 0x22, 0x51, 0x3c, 0xa6, 0x95, 0xa2, 0xea, 0x45, 0x98,
+ 0x8e, 0x6a, 0xe7, 0x70, 0x2d, 0xde, 0xcc, 0x02, 0xce, 0xd8, 0xa5, 0xc9,
+ 0x90, 0xb3, 0xf0, 0x9e, 0x55, 0xa7, 0x92, 0x36, 0xda, 0xb6, 0xaa, 0x3f,
+ 0x69, 0x5b, 0xd5, 0x36, 0xb5, 0x36, 0xae, 0xa4, 0x1d, 0x4b, 0x01, 0xf3,
+ 0xb7, 0xfa, 0x98, 0x31, 0xb2, 0xcf, 0xdf, 0x1e, 0x7f, 0x7d, 0xb6, 0xfd,
+ 0x90, 0x37, 0xae, 0x2d, 0xff, 0xed, 0xb8, 0x00, 0x3f, 0xab, 0x08, 0xbe,
+ 0xc6, 0xdd, 0x87, 0x1e, 0xfe, 0xf5, 0x68, 0x34, 0x38, 0x3c, 0x3f, 0x41,
+ 0x95, 0x92, 0x91, 0xf9, 0x73, 0x05, 0x85, 0xde, 0x10, 0x0c, 0x8e, 0x83,
+ 0xef, 0x24, 0x9d, 0xad, 0x16, 0x35, 0x23, 0x81, 0xb7, 0x0b, 0x28, 0x0c,
+ 0xa6, 0x18, 0xe2, 0x39, 0xb2, 0xc9, 0xc9, 0x68, 0xbe, 0x6b, 0x40, 0x9d,
+ 0x9f, 0xec, 0xe0, 0x53, 0xf4, 0x49, 0x0c, 0x28, 0x6e, 0x28, 0x87, 0x5c,
+ 0xf9, 0x4c, 0xe1, 0xe1, 0xca, 0x8d, 0x2a, 0x3e, 0xd5, 0x98, 0x39, 0x74,
+ 0x9d, 0xb8, 0xe0, 0x54, 0x3c, 0x1b, 0x80, 0x9c, 0x3e, 0x04, 0xf7, 0x16,
+ 0x56, 0xcf, 0xae, 0x97, 0x09, 0xc6, 0x08, 0xf3, 0xc7, 0x50, 0xb9, 0x49,
+ 0x73, 0x05, 0x0b, 0xc2, 0xa9, 0x6b, 0xfe, 0x6f, 0x0e, 0x96, 0x49, 0x72,
+ 0xb0, 0xc9, 0x68, 0xca, 0xac, 0x28, 0x97, 0xd7, 0x37, 0xa0, 0x8c, 0xe9,
+ 0x98, 0xdb, 0x90, 0xe5, 0x1a, 0x69, 0xb4, 0x94, 0x9b, 0xa6, 0x93, 0xc1,
+ 0x16, 0xc4, 0x3b, 0xaa, 0xf7, 0x54, 0x19, 0x05, 0x42, 0x58, 0xbd, 0x61,
+ 0x9c, 0xcb, 0xf4, 0x5f, 0x42, 0x5c, 0xb7, 0x46, 0x03, 0x19, 0x73, 0x90,
+ 0x10, 0x0e, 0xa3, 0xa2, 0x99, 0xcd, 0xe5, 0xaf, 0x69, 0x71, 0x0f, 0xc7,
+ 0xa0, 0x78, 0xaa, 0x91, 0x92, 0x66, 0xf7, 0x74, 0x7b, 0xa3, 0x37, 0xd5,
+ 0x84, 0x4b, 0xc1, 0xbe, 0xd0, 0xc2, 0xb3, 0x5f, 0xac, 0xdd, 0xb3, 0xa8,
+ 0x3e, 0xa8, 0xa5, 0x9c, 0x93, 0x41, 0xd1, 0xd7, 0x56, 0xfa, 0xc6, 0x70,
+ 0x94, 0xa0, 0x90, 0x28, 0xc2, 0xb2, 0x09, 0x22, 0xa2, 0x08, 0x25, 0x3c,
+ 0xb6, 0x8c, 0xed, 0x50, 0xce, 0x96, 0x5c, 0x0a, 0x97, 0xdc, 0x7f, 0x84,
+ 0xf7, 0xdf, 0x76, 0xdc, 0xd5, 0x68, 0x55, 0x21, 0x8d, 0x0c, 0x92, 0x3d,
+ 0x0a, 0xa1, 0xc9, 0xae, 0xbc, 0xcc, 0xd0, 0x85, 0x14, 0x38, 0x66, 0x26,
+ 0x96, 0x38, 0xcd, 0x2c, 0xb7, 0x85, 0xa6, 0x16, 0x00, 0xe1, 0xdc, 0x96,
+ 0xf1, 0x2a, 0x87, 0x54, 0x23, 0x5d, 0xd6, 0xaa, 0x35, 0x3b, 0xea, 0x49,
+ 0x26, 0xd1, 0xed, 0x57, 0xb4, 0xf2, 0xb4, 0xc6, 0x68, 0x7a, 0xca, 0x2a,
+ 0x5c, 0xae, 0x86, 0xc5, 0xc7, 0x74, 0x4a, 0xc6, 0xf7, 0xf6, 0x63, 0xfc,
+ 0x9d, 0x14, 0xc0, 0x15, 0xab, 0x08, 0x3f, 0x96, 0x1f, 0xc2, 0x2d, 0xc6,
+ 0x70, 0x1d, 0xf0, 0xa2, 0xfd, 0xa5, 0x4e, 0xd3, 0xdf, 0xa1, 0xe6, 0x8c,
+ 0x2e, 0x31, 0x56, 0xa3, 0xb5, 0xc8, 0xac, 0xe5, 0x77, 0x8b, 0x12, 0xd0,
+ 0x44, 0x0c, 0xf1, 0x44, 0xb0, 0x81, 0x29, 0x68, 0x6c, 0x47, 0xa5, 0xea,
+ 0x11, 0x79, 0x96, 0x52, 0x2e, 0x87, 0xc2, 0x2f, 0x7b, 0xdf, 0xb0, 0xd9,
+ 0x09, 0xe5, 0xfa, 0x8a, 0x45, 0x6e, 0x75, 0x86, 0x8f, 0x98, 0x10, 0x37,
+ 0x7e, 0xf7, 0xc3, 0xc0, 0xb2, 0xb3, 0x91, 0xd1, 0x7a, 0x22, 0xd4, 0x36,
+ 0x43, 0xd9, 0x85, 0x5b, 0xef, 0xe5, 0x2f, 0x74, 0x06, 0xbe, 0xcf, 0x0b,
+ 0xa3, 0x19, 0xd6, 0xdb, 0xba, 0x39, 0x05, 0x8a, 0x15, 0x9e, 0xdd, 0x6a,
+ 0xb3, 0x36, 0x96, 0x98, 0x91, 0x38, 0x0e, 0x96, 0x46, 0x8a, 0x33, 0x07,
+ 0x27, 0x02, 0x51, 0xe4, 0x15, 0xa6, 0xb9, 0x5f, 0x04, 0x90, 0xfe, 0x89,
+ 0x15, 0x3a, 0x68, 0x03, 0x0c, 0x7f, 0xc6, 0x2c, 0x28, 0xf2, 0x8f, 0x2e,
+ 0x98, 0x8d, 0x7b, 0x83, 0x53, 0xf2, 0x9d, 0x6f, 0xc7, 0x08, 0xc2, 0x48,
+ 0xb5, 0x45, 0x48, 0xb6, 0x6e, 0xb4, 0x86, 0x66, 0x17, 0xe3, 0xdc, 0x7a,
+ 0xb6, 0x9d, 0x5c, 0x35, 0x8b, 0xad, 0xbd, 0x6d, 0x66, 0x0a, 0x97, 0x7a,
+ 0x77, 0xa5, 0xbb, 0xee, 0x43, 0x47, 0x0e, 0x21, 0xe9, 0x70, 0x42, 0x1d,
+ 0x55, 0x33, 0x8a, 0xca, 0x90, 0xeb, 0x12, 0x3a, 0x05, 0x9d, 0x60, 0xa9,
+ 0x3a, 0xad, 0x05, 0xb4, 0x00, 0xda, 0x8d, 0x39, 0x50, 0x81, 0x70, 0x59,
+ 0x10, 0xfd, 0x19, 0x92, 0xad, 0x28, 0xc2, 0x60, 0x9d, 0xbf, 0x42, 0xe2,
+ 0x2e, 0xd9, 0x98, 0x66, 0xe6, 0x66, 0xd3, 0x01, 0xc9, 0x90, 0xeb, 0xaa,
+ 0x34, 0x57, 0x64, 0x15, 0x21, 0x89, 0x12, 0x9b, 0x82, 0x54, 0xfd, 0xac,
+ 0xb8, 0xcd, 0xab, 0xb2, 0x00, 0x0f, 0xd7, 0x6d, 0x5a, 0xe5, 0x08, 0x6a,
+ 0xf7, 0xbe, 0x39, 0x7b, 0x73, 0xdc, 0xf3, 0xfd, 0x22, 0x57, 0xb9, 0x78,
+ 0x8c, 0xb1, 0x7e, 0x5d, 0x7f, 0xac, 0xae, 0x66, 0x18, 0xae, 0xa1, 0x92,
+ 0xe0, 0x54, 0x11, 0xc1, 0x26, 0x35, 0xf3, 0x61, 0x42, 0x3e, 0xad, 0x46,
+ 0x84, 0x8d, 0x3a, 0x29, 0x31, 0x6f, 0xa9, 0x8d, 0xa1, 0xbb, 0x2c, 0x04,
+ 0x9c, 0xc0, 0x95, 0xa0, 0xc6, 0x21, 0xa8, 0x8b, 0x4b, 0xbf, 0x3a, 0x43,
+ 0xe2, 0x55, 0x70, 0x20, 0x45, 0x9f, 0x37, 0x00, 0x96, 0x36, 0x06, 0x02,
+ 0xdf, 0x9c, 0xdf, 0x93, 0x65, 0xb3, 0xd9, 0xbe, 0x00, 0x37, 0x6b, 0x32,
+ 0xc6, 0x9b, 0x4d, 0x9d, 0x5e, 0x80, 0x23, 0x9d, 0x8c, 0x0f, 0x2b, 0x66,
+ 0xad, 0xf8, 0x36, 0xef, 0x6a, 0xfe, 0x84, 0x6b, 0x9d, 0x1b, 0x77, 0xa7,
+ 0xef, 0x80, 0x4f, 0x5f, 0x50, 0x7b, 0x35, 0xa4, 0xe4, 0x48, 0x5d, 0xce,
+ 0x4a, 0xbb, 0xd8, 0x56, 0x3b, 0x70, 0x4e, 0xc4, 0xa0, 0xa1, 0x63, 0xd1,
+ 0x7c, 0xbe, 0x9c, 0x08, 0x39, 0x8a, 0x8d, 0x20, 0xca, 0x55, 0x26, 0x09,
+ 0xf6, 0x8c, 0x2f, 0x66, 0x4d, 0xa9, 0xf0, 0x4a, 0xef, 0x24, 0xd4, 0xe4,
+ 0x0a, 0x56, 0x2e, 0x73, 0x75, 0x03, 0x34, 0x64, 0xf9, 0xbd, 0x80, 0xbf,
+ 0x24, 0x87, 0xa7, 0x85, 0x12, 0xca, 0xd7, 0xfa, 0x7e, 0x96, 0x67, 0x50,
+ 0xd4, 0x4f, 0xac, 0x61, 0x87, 0xbd, 0xb0, 0xca, 0x09, 0xb3, 0xd5, 0x31,
+ 0xdf, 0x99, 0x25, 0xb2, 0x51, 0xce, 0xb7, 0x50, 0x49, 0xb6, 0xd3, 0xa9,
+ 0x7e, 0x5c, 0xa2, 0x16, 0x23, 0x18, 0x0a, 0xdb, 0x34, 0x36, 0xc4, 0xcb,
+ 0xec, 0x01, 0xd0, 0x3a, 0x88, 0x38, 0x96, 0x86, 0x49, 0x84, 0x94, 0x51,
+ 0x13, 0xdb, 0x1e, 0x4a, 0x33, 0x36, 0x76, 0xee, 0x50, 0x9e, 0xff, 0x2d,
+ 0xb2, 0xf1, 0x84, 0x3b, 0x9d, 0xd1, 0xb0, 0x6e, 0x51, 0xe2, 0xd0, 0x00,
+ 0x08, 0x76, 0xd7, 0x43, 0x42, 0x2a, 0x56, 0x4b, 0xa1, 0xdd, 0xfe, 0x9a,
+ 0x7b, 0x61, 0x3b, 0x68, 0xcd, 0x1d, 0x22, 0x66, 0x60, 0x55, 0x36, 0xc0,
+ 0xa5, 0x97, 0x35, 0x18, 0xe6, 0x9a, 0x2a, 0x9d, 0xb8, 0xbf, 0x0c, 0xd2,
+ 0x7a, 0x92, 0xe7, 0xca, 0xc5, 0x4d, 0xe1, 0xb0, 0x8c, 0x10, 0xa0, 0x51,
+ 0xde, 0x0e, 0xbb, 0x1e, 0x89, 0xe5, 0xc0, 0x9d, 0x96, 0xec, 0xe6, 0x65,
+ 0x90, 0x05, 0x97, 0x2a, 0x05, 0x64, 0x83, 0x3c, 0x53, 0x1a, 0x2b, 0x8b,
+ 0xd1, 0x93, 0x2b, 0x93, 0xd7, 0x0a, 0xfb, 0xd6, 0x98, 0xe0, 0x7b, 0xbe,
+ 0x0d, 0xae, 0x93, 0x30, 0xa0, 0x5a, 0x37, 0x75, 0xc3, 0xf6, 0xe4, 0xdd,
+ 0xdd, 0xfe, 0x70, 0x4d, 0xfd, 0x51, 0x3f, 0xe0, 0xf1, 0xbc, 0x63, 0xa1,
+ 0x30, 0x0b, 0x4d, 0xcc, 0x3e, 0x19, 0x6d, 0xb7, 0xea, 0x96, 0x1c, 0x9e,
+ 0x9e, 0xbf, 0x4d, 0x40, 0xfd, 0xc3, 0x75, 0xae, 0x6b, 0x2e, 0x5d, 0xc0,
+ 0x3f, 0x66, 0x3d, 0x19, 0x16, 0x73, 0x12, 0xc2, 0x1b, 0x95, 0x16, 0x1d,
+ 0x56, 0x44, 0x98, 0xd7, 0xc3, 0x78, 0xae, 0x02, 0xf4, 0x17, 0x6a, 0xbf,
+ 0x40, 0xca, 0xab, 0x91, 0xd1, 0x1d, 0x8e, 0xf9, 0xe4, 0x90, 0x3f, 0xac,
+ 0x92, 0x16, 0x35, 0xa8, 0xb5, 0xe5, 0xd6, 0xbb, 0x96, 0xfc, 0xa8, 0x54,
+ 0xa6, 0xa3, 0x40, 0xa8, 0x37, 0x99, 0xa5, 0x58, 0x12, 0xe3, 0xce, 0x52,
+ 0x86, 0x29, 0xfb, 0x38, 0x83, 0x12, 0x90, 0x50, 0xaf, 0x79, 0xbb, 0xf5,
+ 0xfa, 0x4c, 0x6b, 0x33, 0xb1, 0xc5, 0xa2, 0x08, 0x12, 0xad, 0xed, 0x8c,
+ 0x47, 0xb2, 0x9f, 0x02, 0x64, 0xed, 0xa3, 0x72, 0xa1, 0x68, 0x49, 0x86,
+ 0x6b, 0x96, 0xf8, 0x6d, 0x9f, 0x3f, 0x3a, 0x5e, 0x92, 0x8c, 0xe8, 0x96,
+ 0x5e, 0xe6, 0x05, 0x66, 0xdd, 0x89, 0x9f, 0xa0, 0xef, 0x89, 0x17, 0x8c,
+ 0xf9, 0x5d, 0x88, 0x78, 0x2a, 0x4b, 0xe7, 0x46, 0x3b, 0x28, 0x14, 0x1d,
+ 0x4f, 0x0e, 0x60, 0xc2, 0x30, 0x76, 0xa7, 0x92, 0xab, 0xdb, 0xd7, 0xfd,
+ 0x76, 0x21, 0x8b, 0x0e, 0x68, 0x9e, 0x3f, 0x43, 0xa0, 0x19, 0xbf, 0xf9,
+ 0x58, 0x22, 0x14, 0x5e, 0xb7, 0xf9, 0xd8, 0x12, 0xc1, 0xd1, 0xd2, 0x2d,
+ 0x4c, 0xb2, 0xc9, 0x4d, 0xd8, 0x22, 0x6e, 0x66, 0x02, 0x26, 0x37, 0xcb,
+ 0xe2, 0x83, 0xe9, 0x42, 0x98, 0xa8, 0xa9, 0xf8, 0xd6, 0x9c, 0xa4, 0x17,
+ 0x4a, 0x1f, 0xd1, 0x5f, 0xb8, 0x8c, 0x96, 0x6d, 0x81, 0xf8, 0x3d, 0x6f,
+ 0xc9, 0x9f, 0x17, 0x56, 0xcf, 0x8c, 0xf5, 0x6e, 0x6a, 0x4f, 0x48, 0xda,
+ 0xb8, 0x09, 0x8c, 0x62, 0xb8, 0x75, 0x9d, 0x5d, 0xcd, 0x40, 0xb3, 0x1f,
+ 0x3d, 0xf4, 0x90, 0xb0, 0x98, 0x28, 0xb5, 0x0d, 0xd2, 0x70, 0x14, 0x75,
+ 0x13, 0x08, 0xc4, 0x65, 0xcd, 0xa9, 0x4f, 0xb2, 0xac, 0x60, 0x95, 0xf0,
+ 0x98, 0xc3, 0x23, 0x3d, 0x69, 0x67, 0x0d, 0xaf, 0xda, 0x07, 0x36, 0xd5,
+ 0x02, 0xb1, 0x22, 0x97, 0x64, 0x2c, 0xd0, 0x0b, 0xab, 0xba, 0x51, 0x79,
+ 0x1f, 0xbf, 0xac, 0x48, 0x44, 0x72, 0xb9, 0xfc, 0xa5, 0xac, 0xb0, 0x9b,
+ 0x6c, 0x4e, 0x47, 0x55, 0xe4, 0xc1, 0xbf, 0x70, 0x96, 0xdc, 0x40, 0xbc,
+ 0x89, 0xb2, 0x3f, 0xec, 0x4c, 0x52, 0xf1, 0x28, 0x79, 0xf8, 0xd6, 0x88,
+ 0x1f, 0x92, 0x86, 0x9e, 0x30, 0x7c, 0xcb, 0x12, 0x49, 0x05, 0xa1, 0x1b,
+ 0x69, 0xd7, 0xed, 0x75, 0xf5, 0x6b, 0xa4, 0x20, 0x35, 0x4f, 0x98, 0xf2,
+ 0xf3, 0xb7, 0xdd, 0xe6, 0x6c, 0xd5, 0xbf, 0x31, 0x20, 0x26, 0x0f, 0xc9,
+ 0x41, 0x6b, 0xc1, 0xcb, 0xcf, 0x56, 0x78, 0xb8, 0x7e, 0xbd, 0x10, 0x6c,
+ 0x33, 0x9c, 0xc5, 0x65, 0x60, 0xd1, 0x12, 0x81, 0x8e, 0xff, 0xee, 0xf7,
+ 0x11, 0x82, 0xf4, 0x45, 0xe9, 0x72, 0x3e, 0x8d, 0x66, 0x97, 0xdb, 0xb5,
+ 0x95, 0xba, 0x3e, 0x12, 0xb9, 0xa0, 0xd5, 0x50, 0x5e, 0x8b, 0x93, 0x57,
+ 0x66, 0x93, 0x91, 0xce, 0x7a, 0x6d, 0x06, 0xf1, 0xd5, 0xaa, 0xc5, 0x45,
+ 0xfd, 0x50, 0x0d, 0xef, 0xc2, 0xce, 0xa7, 0x52, 0xa9, 0x3e, 0xe5, 0x10,
+ 0x71, 0x90, 0x0d, 0xbd, 0xcd, 0xce, 0x29, 0x70, 0xca, 0xd7, 0xbe, 0x82,
+ 0x15, 0x3b, 0x03, 0x93, 0x12, 0xe5, 0x98, 0x26, 0x37, 0x4b, 0x22, 0x27,
+ 0xa3, 0x2b, 0x8f, 0x4b, 0x89, 0x09, 0x2d, 0x7d, 0x95, 0x51, 0x9f, 0xdb,
+ 0x1d, 0x0e, 0x48, 0xb4, 0xd8, 0x9b, 0x5d, 0x67, 0xe6, 0x20, 0x72, 0x82,
+ 0xcc, 0xb8, 0x2a, 0x3f, 0x64, 0xbc, 0xeb, 0x60, 0x5e, 0x80, 0x15, 0x86,
+ 0x75, 0x29, 0x71, 0xca, 0x1a, 0x39, 0x37, 0xb5, 0x38, 0xbd, 0x88, 0x3e,
+ 0x4b, 0x15, 0x46, 0x24, 0x9d, 0xdc, 0x49, 0xc3, 0xdc, 0x65, 0x73, 0x2b,
+ 0xeb, 0x31, 0x2f, 0xd7, 0x84, 0x48, 0xa8, 0xe2, 0x27, 0xdf, 0x6e, 0x02,
+ 0x29, 0x41, 0xbb, 0xea, 0xf0, 0xfb, 0x67, 0x5f, 0x3c, 0x35, 0xab, 0x4f,
+ 0xbe, 0x5d, 0x75, 0xff, 0xe4, 0x47, 0x56, 0xf4, 0xf1, 0x85, 0x43, 0xcc,
+ 0x5e, 0x82, 0x27, 0x2c, 0x79, 0x61, 0x36, 0x15, 0xfb, 0xc4, 0x28, 0xa6,
+ 0xd5, 0x75, 0x77, 0xa1, 0x00, 0xce, 0x40, 0x4d, 0x8f, 0xa9, 0x64, 0x5e,
+ 0x5d, 0x49, 0x2a, 0x02, 0x63, 0xf9, 0xa7, 0xae, 0x24, 0x95, 0xd0, 0x0d,
+ 0xf7, 0x59, 0x49, 0x32, 0x3b, 0x26, 0x72, 0xc8, 0x9d, 0x23, 0x87, 0x53,
+ 0x3f, 0xa1, 0x87, 0xd3, 0xf2, 0x80, 0x50, 0x24, 0xaf, 0x9d, 0xa2, 0xf9,
+ 0x67, 0x02, 0xbf, 0x1a, 0xad, 0xb6, 0x21, 0xe4, 0x13, 0xbe, 0x15, 0xa8,
+ 0x9d, 0x5c, 0x0a, 0xc2, 0x26, 0x47, 0x30, 0xe7, 0x81, 0xe5, 0xcb, 0xa0,
+ 0x92, 0x60, 0xbe, 0x6e, 0xc0, 0x5c, 0xc8, 0xc9, 0x31, 0x19, 0x2d, 0x11,
+ 0x8b, 0x90, 0x3d, 0x17, 0xd4, 0x47, 0x0c, 0x13, 0x89, 0xa8, 0xf8, 0x02,
+ 0x40, 0x4a, 0x62, 0x61, 0xa7, 0x0a, 0x40, 0xe2, 0xc1, 0xfb, 0x3c, 0x5e,
+ 0x91, 0xba, 0x83, 0x8c, 0xf0, 0x11, 0x33, 0x4d, 0x7f, 0x60, 0x6b, 0x40,
+ 0xbc, 0xf6, 0x8c, 0xa2, 0x84, 0x8d, 0x14, 0x68, 0xc7, 0x9c, 0x2b, 0x1b,
+ 0x1b, 0x6c, 0xe2, 0x3d, 0xe6, 0xbf, 0x72, 0xf0, 0xe9, 0xae, 0x66, 0x76,
+ 0x53, 0xb8, 0xcb, 0x7f, 0x06, 0x95, 0x4d, 0x43, 0x3d, 0x82, 0x1e, 0x33,
+ 0x3f, 0xb5, 0x4f, 0x86, 0x32, 0x50, 0x18, 0xfd, 0x9e, 0x3d, 0xa1, 0x98,
+ 0x77, 0xdc, 0xa7, 0xc4, 0x17, 0xad, 0xef, 0x45, 0xb0, 0x6e, 0x84, 0x3a,
+ 0xca, 0x0d, 0x3a, 0xf5, 0xee, 0x1e, 0x59, 0x8d, 0x13, 0x89, 0x97, 0x6e,
+ 0xd6, 0x5c, 0xae, 0x35, 0xe2, 0x91, 0x98, 0xe6, 0x75, 0xc4, 0x89, 0xc1,
+ 0x98, 0x2d, 0xd9, 0x70, 0xb6, 0x8a, 0x07, 0x6a, 0x46, 0xf0, 0xd6, 0xc6,
+ 0x2a, 0x9a, 0x03, 0xd3, 0x03, 0xe5, 0xbb, 0x2d, 0x51, 0x9b, 0xaf, 0x4d,
+ 0xcc, 0xda, 0xfb, 0x6c, 0xf8, 0xb4, 0x75, 0x4e, 0x9a, 0xd9, 0x7c, 0x70,
+ 0x37, 0x7e, 0x20, 0xf6, 0x71, 0x79, 0xfa, 0x26, 0x99, 0x2f, 0x51, 0x25,
+ 0x53, 0x18, 0x4a, 0xef, 0x67, 0x99, 0xba, 0xa1, 0xc9, 0xc1, 0xc3, 0xbe,
+ 0x42, 0xe2, 0x1b, 0x45, 0x47, 0x62, 0xc0, 0xa6, 0x8e, 0x9f, 0xdf, 0xa5,
+ 0x4a, 0x8a, 0xdd, 0xaf, 0x74, 0x5c, 0xa6, 0x49, 0xf6, 0x67, 0x2f, 0x16,
+ 0xb3, 0x3c, 0x9a, 0xcd, 0xa2, 0x60, 0xd2, 0xec, 0x63, 0x36, 0x59, 0x22,
+ 0x4e, 0x4d, 0xea, 0x21, 0xb1, 0xdb, 0xac, 0x77, 0xa0, 0x7b, 0x4e, 0x73,
+ 0x71, 0x93, 0x9b, 0x1f, 0x74, 0x27, 0xa3, 0x3b, 0x76, 0x1e, 0x7c, 0xe0,
+ 0x3d, 0x63, 0xf2, 0xbc, 0xd8, 0xef, 0x82, 0x58, 0x31, 0x30, 0xec, 0x74,
+ 0x21, 0x9a, 0x2d, 0x95, 0x5f, 0x17, 0xac, 0x74, 0xbc, 0xc9, 0x27, 0x55,
+ 0x59, 0x97, 0x57, 0x0c, 0xce, 0xf2, 0x4c, 0xa4, 0x93, 0x93, 0x51, 0x72,
+ 0x97, 0x8d, 0x35, 0x19, 0x74, 0x18, 0x3a, 0x93, 0x21, 0x43, 0x28, 0x42,
+ 0x52, 0xe5, 0x59, 0x43, 0x53, 0xa6, 0x31, 0x51, 0xa2, 0xaf, 0x41, 0x79,
+ 0xda, 0x41, 0x56, 0x5c, 0x1b, 0x6b, 0x15, 0x0a, 0x3c, 0x15, 0x66, 0x99,
+ 0xf1, 0xc5, 0xb4, 0xc8, 0xca, 0x48, 0x60, 0x9c, 0x3b, 0xa0, 0xd7, 0x0a,
+ 0xef, 0x13, 0xdc, 0xe1, 0xe3, 0x54, 0x6a, 0x8c, 0xb0, 0x77, 0xc0, 0x88,
+ 0x1d, 0xd2, 0x51, 0xc4, 0x71, 0xf9, 0x81, 0x7c, 0x66, 0x41, 0x82, 0x86,
+ 0xad, 0x7b, 0xdf, 0xf1, 0xde, 0x15, 0xd3, 0xb2, 0x02, 0x1a, 0xc9, 0x63,
+ 0xff, 0x47, 0xdd, 0x96, 0x65, 0x85, 0x8c, 0x43, 0x50, 0x2b, 0x86, 0xf2,
+ 0xf4, 0xee, 0x86, 0xe3, 0xb6, 0xba, 0x0a, 0x74, 0x39, 0x21, 0xb9, 0x94,
+ 0xb3, 0x59, 0x84, 0x60, 0x9a, 0xfa, 0xef, 0xae, 0x1b, 0x6f, 0x35, 0xa2,
+ 0x34, 0x6c, 0xb2, 0x1e, 0x2e, 0x93, 0x52, 0xdc, 0x33, 0xaf, 0xf2, 0xeb,
+ 0x15, 0xc5, 0x89, 0x2c, 0x9f, 0x01, 0x2e, 0x27, 0x9c, 0x58, 0xf4, 0x46,
+ 0xae, 0xcc, 0x8a, 0xcf, 0x68, 0x12, 0xd4, 0xdc, 0x8a, 0x55, 0xfe, 0xe6,
+ 0xfb, 0x2e, 0xb6, 0xfb, 0xbc, 0x5c, 0xf8, 0xdf, 0xba, 0x5e, 0xf4, 0xca,
+ 0x23, 0xd1, 0xee, 0x8a, 0x3d, 0x01, 0x31, 0x95, 0xcf, 0xd7, 0xf2, 0x02,
+ 0xde, 0x05, 0x2f, 0x26, 0x1b, 0x57, 0xfa, 0x56, 0xd1, 0xdc, 0x22, 0xa4,
+ 0x15, 0x01, 0xa6, 0x78, 0x51, 0xd9, 0xa9, 0xad, 0xcc, 0x49, 0xeb, 0xd3,
+ 0x8e, 0x79, 0xf9, 0x67, 0xb7, 0xa4, 0x1f, 0xec, 0x0f, 0xc6, 0x59, 0x4a,
+ 0x05, 0x09, 0x5e, 0x34, 0xa4, 0x31, 0xfd, 0xa2, 0x6c, 0x8c, 0xaf, 0xf8,
+ 0xcd, 0x4b, 0xa8, 0x5a, 0xb4, 0xb6, 0x67, 0x87, 0xef, 0x2e, 0xbf, 0x49,
+ 0x92, 0x7d, 0x62, 0xbd, 0x7e, 0x4c, 0x36, 0x06, 0x44, 0x42, 0xab, 0x15,
+ 0x3d, 0xd6, 0x74, 0xa2, 0xca, 0xe2, 0x6f, 0xcb, 0xa2, 0x4d, 0x76, 0x1e,
+ 0xf3, 0xd2, 0xe3, 0x02, 0x95, 0xbb, 0x97, 0xf3, 0x83, 0x5b, 0x50, 0x62,
+ 0xad, 0x86, 0xc1, 0x4b, 0x32, 0x18, 0x60, 0xde, 0x91, 0xb7, 0xb6, 0x3e,
+ 0xa0, 0x59, 0xc7, 0xc9, 0x3f, 0xa5, 0xb7, 0xd2, 0x5d, 0x25, 0xce, 0xd1,
+ 0xc8, 0x29, 0x2a, 0x0f, 0x90, 0xab, 0xbf, 0xe9, 0x56, 0x57, 0xba, 0x78,
+ 0x7d, 0xd4, 0x69, 0xee, 0xf9, 0x27, 0xcf, 0x76, 0x7f, 0x47, 0xac, 0x5e,
+ 0x49, 0x0e, 0x12, 0x71, 0x24, 0x44, 0xd9, 0x62, 0xbe, 0xaf, 0x28, 0x5b,
+ 0x53, 0x5d, 0x0d, 0xa5, 0x3c, 0xe4, 0x27, 0x94, 0xd7, 0xcd, 0x94, 0x70,
+ 0x5b, 0x7a, 0xa2, 0x69, 0x74, 0xac, 0xef, 0xff, 0xe7, 0x7f, 0x85, 0xc9,
+ 0xa4, 0x3f, 0xfe, 0xcc, 0xde, 0xe2, 0x2b, 0xd4, 0x80, 0x72, 0xe0, 0x76,
+ 0x95, 0x33, 0xb5, 0xbb, 0x92, 0xe9, 0x48, 0x6f, 0xfe, 0x71, 0xd3, 0x16,
+ 0x69, 0x80, 0xd2, 0x1f, 0x4d, 0x45, 0xd6, 0xdb, 0x53, 0xfa, 0xa6, 0x0b,
+ 0x5b, 0x49, 0xc5, 0x5d, 0xab, 0x0f, 0xb8, 0xda, 0x11, 0x52, 0xba, 0x60,
+ 0xba, 0xaa, 0xce, 0x8a, 0x56, 0x1b, 0x10, 0xe6, 0x7e, 0x75, 0x98, 0x93,
+ 0x9b, 0x9c, 0x51, 0x56, 0xe8, 0x3f, 0xe9, 0xa2, 0xc8, 0xd9, 0xcd, 0x8b,
+ 0x15, 0x0e, 0x4c, 0x81, 0x12, 0xfd, 0xa7, 0x59, 0x81, 0x7e, 0x73, 0x57,
+ 0xfe, 0x57, 0xdb, 0x99, 0x69, 0x54, 0x0c, 0xea, 0xf1, 0xfb, 0x3f, 0xee,
+ 0x51, 0x16, 0x4c, 0xaf, 0xdb, 0x04, 0x03, 0xda, 0xed, 0xaa, 0x5a, 0x0d,
+ 0x69, 0x1d, 0x73, 0xa8, 0x7e, 0x90, 0x72, 0x6c, 0xfb, 0xa4, 0x38, 0xfe,
+ 0x17, 0x0a, 0x54, 0xff, 0xb8, 0x37, 0x78, 0xf6, 0xb3, 0xfd, 0xe8, 0x1f,
+ 0xf7, 0xde, 0xff, 0x71, 0xbf, 0x17, 0x4d, 0x72, 0x72, 0x39, 0xef, 0x1e,
+ 0x56, 0x91, 0xf4, 0xd9, 0xe2, 0x5e, 0x52, 0x13, 0x24, 0xd6, 0xe8, 0x4a,
+ 0x43, 0xa1, 0xf0, 0x59, 0xc8, 0x0b, 0x44, 0xae, 0xab, 0x8e, 0xaa, 0xaa,
+ 0xb5, 0xa1, 0x54, 0x38, 0xdc, 0x95, 0xfc, 0xb2, 0xb8, 0x55, 0x38, 0xe7,
+ 0x4d, 0x31, 0xf3, 0x81, 0x30, 0x24, 0x12, 0x22, 0x7f, 0x6f, 0x10, 0x4b,
+ 0x88, 0x52, 0x4b, 0x84, 0xb3, 0x21, 0x00, 0x29, 0x73, 0x9d, 0xa5, 0x49,
+ 0x67, 0xd2, 0xc7, 0x63, 0xfb, 0x93, 0x22, 0x0b, 0x92, 0x8f, 0xa0, 0x0c,
+ 0x33, 0xc3, 0x33, 0x0c, 0x38, 0x2b, 0x15, 0xcc, 0x9b, 0x36, 0x80, 0x2d,
+ 0x71, 0x2d, 0xf4, 0xde, 0x95, 0xbc, 0xa3, 0xca, 0x6b, 0x5d, 0x69, 0xf1,
+ 0xb7, 0xa5, 0x56, 0x24, 0x74, 0x37, 0x8a, 0x69, 0x29, 0x77, 0x85, 0x6a,
+ 0xf9, 0x67, 0x12, 0x81, 0xa1, 0xa4, 0xf6, 0x04, 0x97, 0x5c, 0x1d, 0x4d,
+ 0x4b, 0x4d, 0xc7, 0x54, 0xb8, 0xa9, 0x55, 0x04, 0x03, 0x55, 0xac, 0xe9,
+ 0xd6, 0x19, 0x3b, 0x92, 0xa5, 0xb4, 0x5e, 0x31, 0x21, 0xfe, 0x54, 0x78,
+ 0x93, 0x20, 0x13, 0x85, 0xc9, 0x59, 0xe3, 0xd9, 0xe5, 0x54, 0x50, 0xc2,
+ 0x91, 0x36, 0xd9, 0xc0, 0xcb, 0x05, 0x45, 0xea, 0x29, 0x7e, 0xea, 0x61,
+ 0xdd, 0x24, 0xc0, 0x37, 0x08, 0xa2, 0x92, 0x66, 0x13, 0x4d, 0xef, 0x8d,
+ 0x24, 0x64, 0xce, 0x49, 0x4b, 0x62, 0xa7, 0x2e, 0x02, 0x91, 0x35, 0x66,
+ 0x9f, 0x6d, 0x0e, 0x36, 0x93, 0x2d, 0x97, 0x6e, 0x95, 0x4c, 0xd3, 0xfa,
+ 0x66, 0x3b, 0xe6, 0x88, 0x74, 0xbe, 0x3f, 0x27, 0xa8, 0xc6, 0xe2, 0x7b,
+ 0xa0, 0x2b, 0x93, 0x25, 0x54, 0x74, 0x60, 0x7a, 0x61, 0x9f, 0x21, 0x60,
+ 0xc2, 0x80, 0xc1, 0x81, 0x47, 0xa9, 0xdc, 0xfa, 0xd9, 0x00, 0xb9, 0xc9,
+ 0xfc, 0xf3, 0xff, 0x08, 0xef, 0x05, 0x79, 0x92, 0x31, 0x5f, 0x03, 0x4e,
+ 0xfc, 0x71, 0x17, 0x29, 0x45, 0xf3, 0x92, 0x17, 0x8b, 0x9b, 0xca, 0xa8,
+ 0x7f, 0x61, 0x7e, 0xd1, 0xe8, 0x9b, 0x84, 0x89, 0xfe, 0xcc, 0x53, 0xfc,
+ 0x8c, 0xdd, 0x20, 0x0b, 0x47, 0x66, 0xf7, 0x3b, 0x72, 0xc3, 0x11, 0x9c,
+ 0x64, 0x90, 0xd6, 0x83, 0x40, 0xd5, 0x09, 0x8a, 0x48, 0x93, 0x35, 0x42,
+ 0x30, 0x46, 0x0a, 0xac, 0x15, 0x13, 0x94, 0x54, 0x4c, 0x76, 0x86, 0xc3,
+ 0x1d, 0x12, 0x58, 0x3b, 0xe6, 0x0f, 0xc7, 0x91, 0x0e, 0xd4, 0x6d, 0xb7,
+ 0xca, 0x8b, 0xd9, 0xe8, 0xc0, 0xae, 0x80, 0x22, 0x42, 0xca, 0xa2, 0xb9,
+ 0x40, 0x7b, 0xfd, 0xf7, 0x25, 0xa0, 0xa8, 0x95, 0x51, 0x28, 0x2b, 0x4e,
+ 0x60, 0x9d, 0xb7, 0xee, 0xc8, 0xa0, 0xb6, 0x0a, 0x7b, 0xd6, 0x6b, 0xa1,
+ 0x49, 0x68, 0x6e, 0x3a, 0x69, 0x55, 0x0c, 0xa3, 0x01, 0x40, 0x38, 0x6f,
+ 0x94, 0xa1, 0x0a, 0x99, 0xc3, 0xe9, 0x5a, 0x83, 0xee, 0xe9, 0x7e, 0xdb,
+ 0xf1, 0xb1, 0xc8, 0x0b, 0x63, 0x62, 0x18, 0xd5, 0x18, 0xec, 0x83, 0x84,
+ 0xc5, 0x0b, 0xf3, 0x56, 0xd8, 0x9b, 0xd6, 0x8e, 0xc2, 0x7a, 0x29, 0xa3,
+ 0x5e, 0xc9, 0x54, 0x51, 0xb1, 0x99, 0x7e, 0x91, 0xe3, 0xf9, 0x5b, 0xc1,
+ 0x65, 0xc9, 0x1f, 0xd9, 0xe6, 0x1b, 0x53, 0xd0, 0xba, 0xd8, 0x10, 0x99,
+ 0xad, 0x06, 0x20, 0xba, 0x4c, 0xca, 0x68, 0x20, 0x68, 0xef, 0x68, 0x2d,
+ 0xe6, 0xf6, 0xb0, 0x3e, 0x07, 0xeb, 0x29, 0x71, 0x95, 0x64, 0x68, 0xcc,
+ 0x44, 0xe0, 0x68, 0xe6, 0xfd, 0xd5, 0xf1, 0x85, 0xa8, 0x27, 0xf0, 0x40,
+ 0xb8, 0x3a, 0x80, 0x61, 0xb9, 0x6b, 0xb2, 0x64, 0x9e, 0x3f, 0xb5, 0x85,
+ 0x22, 0xeb, 0x9b, 0x74, 0xff, 0xd9, 0x73, 0xe9, 0xb6, 0x32, 0x45, 0xe1,
+ 0xde, 0xde, 0xe4, 0x5f, 0xed, 0xec, 0x70, 0xd8, 0x9c, 0x6c, 0xd3, 0x40,
+ 0x2e, 0xa4, 0x52, 0xee, 0x72, 0xf3, 0xf3, 0xcd, 0x28, 0x60, 0x4e, 0x35,
+ 0x57, 0xb6, 0xdf, 0xc9, 0xfb, 0x0c, 0x50, 0x9f, 0xcf, 0x1a, 0xdf, 0xef,
+ 0x56, 0x11, 0x41, 0x1e, 0x4b, 0xa0, 0x35, 0xf8, 0x84, 0xea, 0x89, 0x50,
+ 0x2b, 0x70, 0x01, 0x32, 0xaa, 0x7d, 0x2e, 0x49, 0x98, 0xc3, 0xe4, 0xb0,
+ 0x35, 0x3f, 0x35, 0xd7, 0x40, 0x9c, 0x84, 0xf4, 0x1d, 0x02, 0x7e, 0xa3,
+ 0xd5, 0xf0, 0x1a, 0x16, 0x14, 0xa8, 0xd9, 0x73, 0xa0, 0xb4, 0xa3, 0x8d,
+ 0xa7, 0x61, 0x17, 0x76, 0xc9, 0xa0, 0xa7, 0xe6, 0x0b, 0x41, 0x9a, 0x88,
+ 0xee, 0x0b, 0x85, 0x48, 0xb1, 0x45, 0xef, 0xc1, 0x04, 0xdd, 0x69, 0x31,
+ 0xd7, 0x41, 0xd5, 0x74, 0xd8, 0x57, 0xe2, 0xb4, 0xb3, 0xca, 0x1a, 0x02,
+ 0x98, 0xd8, 0x24, 0xcb, 0x99, 0x72, 0xc8, 0xac, 0x2d, 0x05, 0x7e, 0x82,
+ 0x73, 0x60, 0xb6, 0xc2, 0x0e, 0xed, 0x03, 0x31, 0x36, 0x02, 0x86, 0x77,
+ 0x72, 0x32, 0x7f, 0x36, 0xdc, 0x3d, 0x48, 0xce, 0x16, 0x59, 0x61, 0xd6,
+ 0xa0, 0x9f, 0x7c, 0x5d, 0x2c, 0x69, 0x49, 0x68, 0xd4, 0x5f, 0x8f, 0xbe,
+ 0x0d, 0xf8, 0x0f, 0xe8, 0x8d, 0xa7, 0x4f, 0xe8, 0x8d, 0xb7, 0x23, 0x7e,
+ 0xea, 0xae, 0x9c, 0x5d, 0x51, 0xe1, 0xe2, 0xa3, 0xfb, 0xd4, 0xfc, 0x11,
+ 0x7b, 0xfc, 0x13, 0x7a, 0xdc, 0x6c, 0xbc, 0x69, 0x33, 0xab, 0x63, 0xbf,
+ 0x47, 0x07, 0xce, 0xcb, 0x59, 0x5a, 0xc1, 0xef, 0xcb, 0x9b, 0x6f, 0x4d,
+ 0x8f, 0x9f, 0x3e, 0x8d, 0xf4, 0xb8, 0xbf, 0xa2, 0x43, 0xc3, 0x7f, 0xbe,
+ 0x47, 0x67, 0x70, 0xfc, 0xd1, 0xdf, 0xc6, 0xe9, 0xe4, 0x03, 0xb6, 0x22,
+ 0x50, 0xed, 0x96, 0x52, 0xf5, 0xf7, 0x94, 0xe6, 0x9c, 0x71, 0xff, 0x98,
+ 0xca, 0x2d, 0x15, 0x68, 0xc7, 0x1a, 0xa4, 0x72, 0x7f, 0xb2, 0xff, 0x64,
+ 0x6f, 0xe7, 0xf9, 0xf0, 0xe9, 0x70, 0xdf, 0xa2, 0xcc, 0xcc, 0xc6, 0xba,
+ 0xa5, 0x3a, 0x01, 0x14, 0xcf, 0x5f, 0x55, 0x66, 0x2d, 0x2f, 0x4c, 0x3b,
+ 0x5e, 0x79, 0x66, 0xe1, 0x73, 0x76, 0xf8, 0x92, 0x94, 0x08, 0x16, 0xfc,
+ 0x5c, 0xa5, 0x61, 0xa4, 0x4c, 0x16, 0xf1, 0x14, 0x50, 0x27, 0xc4, 0xd9,
+ 0xb1, 0xac, 0x30, 0x03, 0xe3, 0xdc, 0xd8, 0xcc, 0x4d, 0xb9, 0x84, 0x4f,
+ 0x9d, 0x1c, 0x38, 0xca, 0x2a, 0x2d, 0x3a, 0x92, 0x94, 0x64, 0x2d, 0xa3,
+ 0x95, 0xe2, 0xa5, 0xf7, 0x8c, 0xe7, 0xa5, 0x00, 0x91, 0x46, 0xe3, 0x91,
+ 0x12, 0x95, 0x73, 0x9d, 0x5e, 0x94, 0x74, 0x30, 0xe6, 0x0c, 0xca, 0x71,
+ 0x7f, 0x63, 0x4c, 0x8d, 0x5b, 0x72, 0x1c, 0x07, 0xe5, 0xc4, 0x58, 0xa6,
+ 0x30, 0x71, 0x0e, 0x3b, 0xfe, 0x05, 0xe4, 0x80, 0x39, 0x84, 0x6f, 0x57,
+ 0x7e, 0x20, 0x04, 0x0a, 0xf0, 0x80, 0x70, 0xd9, 0xcc, 0x69, 0x10, 0x78,
+ 0xb7, 0xf3, 0xd0, 0x86, 0x86, 0x32, 0x89, 0x21, 0x31, 0x27, 0x53, 0x02,
+ 0x13, 0xfb, 0xb8, 0x99, 0x49, 0x8d, 0xa6, 0xd1, 0xe5, 0xa2, 0xc5, 0x5c,
+ 0x30, 0xeb, 0x5c, 0x74, 0x51, 0xda, 0x05, 0xfe, 0x57, 0x9b, 0x6e, 0x68,
+ 0x6d, 0xe9, 0xa9, 0x4e, 0xf5, 0x2f, 0x6d, 0xf5, 0x57, 0xef, 0xb2, 0x27,
+ 0xbf, 0xfd, 0x2e, 0xdb, 0x7f, 0xec, 0x2e, 0xf3, 0xb6, 0x19, 0xbb, 0x82,
+ 0xd6, 0x6c, 0x34, 0x33, 0x85, 0x18, 0xc7, 0x8a, 0x5d, 0xe6, 0x6d, 0x32,
+ 0x17, 0xf6, 0x6c, 0x6d, 0xb1, 0xf6, 0x1e, 0x73, 0x9b, 0x6c, 0xd5, 0x2e,
+ 0xc3, 0x36, 0xb3, 0xfb, 0xec, 0x81, 0x8d, 0xc6, 0x9e, 0xb6, 0xf5, 0xbb,
+ 0xec, 0xb2, 0x2d, 0x57, 0xd6, 0xec, 0x31, 0x7f, 0x43, 0x3c, 0x7a, 0x97,
+ 0x39, 0xb7, 0x17, 0xcb, 0x9d, 0x64, 0xc5, 0x46, 0xf3, 0xf7, 0x99, 0xea,
+ 0x5a, 0xe1, 0x2e, 0xfb, 0x2c, 0xb6, 0xcb, 0x9e, 0xfc, 0xea, 0x5d, 0xf6,
+ 0xf4, 0xb7, 0xdf, 0x65, 0x4f, 0xfe, 0x9f, 0x2c, 0xfb, 0xef, 0x25, 0xcb,
+ 0xf6, 0x7e, 0xb1, 0x2c, 0xdb, 0xef, 0x04, 0x36, 0x8d, 0xba, 0xca, 0xfe,
+ 0xe6, 0x1f, 0xd5, 0xed, 0x7f, 0xb0, 0xb3, 0xf3, 0x33, 0x9c, 0x27, 0x07,
+ 0x74, 0x5f, 0xff, 0x1c, 0x54, 0xab, 0x8c, 0xa8, 0xf5, 0xa3, 0xb3, 0xa3,
+ 0x6f, 0x47, 0xe2, 0xb7, 0x16, 0xc5, 0x4b, 0x15, 0x33, 0x76, 0xf0, 0x19,
+ 0x75, 0x1d, 0x39, 0xd0, 0x81, 0xae, 0xcf, 0x15, 0xed, 0x06, 0x1f, 0xfb,
+ 0xea, 0x3b, 0x06, 0xe4, 0x48, 0x8e, 0x36, 0x38, 0xcd, 0x24, 0xbb, 0x98,
+ 0x33, 0x1d, 0xa4, 0xd5, 0x95, 0xf4, 0x55, 0xdc, 0x11, 0xeb, 0x41, 0x17,
+ 0x9f, 0x46, 0xe1, 0xbd, 0xb8, 0xd5, 0xdc, 0x54, 0xc8, 0xed, 0xc0, 0xa3,
+ 0xdb, 0x1a, 0x36, 0x5a, 0xd7, 0x3b, 0xe9, 0xd7, 0x37, 0x60, 0x7f, 0x5d,
+ 0x54, 0xd9, 0x8a, 0x22, 0xb1, 0x97, 0x37, 0xde, 0x6f, 0xd5, 0x85, 0x16,
+ 0xa3, 0x70, 0x10, 0x2e, 0x33, 0x6f, 0xbe, 0xe9, 0xbd, 0x20, 0x1f, 0x9d,
+ 0xe8, 0x7a, 0x81, 0x30, 0xb5, 0x44, 0x22, 0x33, 0xd4, 0x82, 0x44, 0x69,
+ 0x03, 0x1d, 0xa2, 0x36, 0xc2, 0xe0, 0xa5, 0x0c, 0xe5, 0x09, 0xea, 0xa7,
+ 0xa6, 0xc9, 0x00, 0x36, 0x8a, 0x5f, 0xa4, 0xf4, 0x1b, 0xfe, 0xfb, 0x33,
+ 0xfa, 0x2e, 0xb9, 0x7a, 0xf9, 0x5f, 0x37, 0xf4, 0x4f, 0xa9, 0xe5, 0x20,
+ 0x74, 0x49, 0xfe, 0x2a, 0x4f, 0xe2, 0x13, 0xed, 0x27, 0x0d, 0xa9, 0x3a,
+ 0x66, 0xcc, 0xdb, 0x80, 0x0a, 0x08, 0xa3, 0xf6, 0x49, 0xd7, 0x56, 0xa0,
+ 0x05, 0x4d, 0x33, 0x68, 0xf9, 0x69, 0x5c, 0x49, 0xcc, 0x7c, 0x4e, 0x45,
+ 0xe5, 0x0e, 0xf0, 0x0b, 0x1a, 0xb9, 0x48, 0xa9, 0x2c, 0x40, 0x9f, 0x2b,
+ 0x84, 0x84, 0xb4, 0xc7, 0x4c, 0xd7, 0x2f, 0xfd, 0xde, 0xdb, 0xfd, 0x34,
+ 0xf4, 0x36, 0xbf, 0xd3, 0xa4, 0x36, 0x47, 0x2c, 0x08, 0x40, 0x04, 0xe0,
+ 0xe5, 0x63, 0x97, 0xca, 0x11, 0xfb, 0x6c, 0x24, 0xef, 0x8d, 0x1c, 0x00,
+ 0xd3, 0x8c, 0x2d, 0xc6, 0x31, 0x9b, 0xfe, 0x41, 0xb1, 0x75, 0x4e, 0xe3,
+ 0xad, 0x21, 0x27, 0x85, 0x14, 0x37, 0x91, 0xa8, 0x7e, 0x20, 0x2d, 0x50,
+ 0x18, 0x57, 0x82, 0x4d, 0x5f, 0x3a, 0x8e, 0xaa, 0x3f, 0x3d, 0xdd, 0xa5,
+ 0x55, 0xd5, 0x56, 0x52, 0xae, 0x3a, 0xce, 0x7b, 0xee, 0x4f, 0x4f, 0xd2,
+ 0xe1, 0xbf, 0x90, 0x74, 0xe8, 0x59, 0xdb, 0x95, 0xf0, 0x47, 0x39, 0xe3,
+ 0xd7, 0xc4, 0x8c, 0x32, 0x18, 0xa7, 0x55, 0x24, 0x85, 0xc2, 0xde, 0x05,
+ 0x42, 0xa9, 0xe1, 0x71, 0x81, 0xeb, 0x9b, 0x5c, 0xc6, 0x5b, 0x70, 0xf1,
+ 0xf6, 0x87, 0x61, 0x73, 0x9d, 0x22, 0xf7, 0xea, 0x30, 0xe9, 0x07, 0x3c,
+ 0x50, 0xe9, 0xac, 0x4f, 0x51, 0xbc, 0x08, 0x5b, 0x10, 0x56, 0xc7, 0xff,
+ 0x04, 0xf1, 0x39, 0xdd, 0x79, 0x8e, 0x04, 0x26, 0x63, 0xbf, 0x82, 0xbf,
+ 0xde, 0xa1, 0x2f, 0xc8, 0xf4, 0xa6, 0x68, 0x6c, 0xec, 0x36, 0xab, 0x27,
+ 0x15, 0x95, 0x37, 0x91, 0x02, 0x01, 0x68, 0x6b, 0x41, 0x84, 0x78, 0xe6,
+ 0x1a, 0xbb, 0xce, 0x34, 0x7d, 0xd2, 0x0e, 0x5a, 0x29, 0x32, 0xc0, 0x8b,
+ 0x31, 0x8c, 0x80, 0x92, 0x1d, 0xe8, 0x48, 0x8b, 0x92, 0xa6, 0x42, 0xa2,
+ 0x41, 0xaf, 0x3a, 0xca, 0x38, 0x9d, 0x0c, 0x75, 0x14, 0x46, 0xc0, 0x26,
+ 0x34, 0x06, 0x3b, 0x04, 0x46, 0x8d, 0x23, 0x05, 0x61, 0x6f, 0x77, 0xff,
+ 0x29, 0x93, 0x8f, 0xd8, 0xaf, 0x55, 0x1d, 0xa3, 0x0b, 0x79, 0xbc, 0x7a,
+ 0x84, 0x5f, 0xe8, 0xd9, 0xff, 0xe2, 0x41, 0x94, 0xbe, 0x95, 0x12, 0x57,
+ 0xe2, 0x70, 0xa1, 0x33, 0x82, 0xac, 0x0d, 0xe6, 0x05, 0x9e, 0xdc, 0x64,
+ 0x73, 0xa9, 0x61, 0xf1, 0x0b, 0x2b, 0x72, 0x77, 0xfa, 0xc4, 0xf8, 0xb5,
+ 0xab, 0x66, 0x31, 0x9c, 0x97, 0xff, 0x30, 0xf3, 0x91, 0x52, 0x51, 0xac,
+ 0x60, 0xe7, 0x52, 0x72, 0x62, 0xc1, 0xb3, 0x07, 0xc1, 0xb8, 0x2c, 0xac,
+ 0xcd, 0xea, 0x04, 0xad, 0x32, 0x38, 0x23, 0x39, 0x3d, 0x39, 0x32, 0x3d,
+ 0x3e, 0x7e, 0xff, 0xee, 0xed, 0xe8, 0xdd, 0x79, 0xf7, 0x80, 0x9e, 0x9f,
+ 0x5d, 0x5c, 0x1e, 0xbf, 0x7a, 0x7f, 0x7e, 0x71, 0x76, 0x79, 0x76, 0x74,
+ 0x76, 0x9a, 0x6c, 0xed, 0x6d, 0xaf, 0xcd, 0xc5, 0xb2, 0xee, 0x12, 0x8f,
+ 0xc2, 0x4e, 0xfb, 0xcf, 0xa2, 0xc5, 0x76, 0x61, 0x8b, 0xc6, 0x13, 0xb6,
+ 0xf6, 0xbd, 0x6c, 0x81, 0x16, 0x29, 0x30, 0x7c, 0x26, 0xb8, 0x83, 0x20,
+ 0x7b, 0xd3, 0xe4, 0x7a, 0xc9, 0x9b, 0x59, 0x82, 0xf1, 0x9a, 0xa8, 0x52,
+ 0x37, 0xc1, 0x8d, 0x91, 0x65, 0x12, 0x11, 0xf4, 0xd2, 0x78, 0xd6, 0xba,
+ 0x0e, 0x9f, 0x75, 0x55, 0x0b, 0x5a, 0x03, 0x68, 0x8c, 0x6e, 0x57, 0xd4,
+ 0xf1, 0x6d, 0x61, 0xf7, 0x05, 0x33, 0x7f, 0x80, 0x1f, 0xd9, 0xbe, 0x02,
+ 0xfa, 0x78, 0x89, 0xd0, 0x98, 0x2e, 0xab, 0x0e, 0x3a, 0x4c, 0xce, 0xc3,
+ 0x42, 0x2f, 0xf2, 0xc6, 0x34, 0x2b, 0xa4, 0xda, 0xa0, 0xf4, 0x03, 0x01,
+ 0x3a, 0x9a, 0x5e, 0x89, 0x17, 0x9b, 0x07, 0xe8, 0xb7, 0xde, 0x5c, 0x21,
+ 0x39, 0x34, 0x0b, 0xbc, 0xdb, 0xfc, 0x36, 0xf3, 0x62, 0xdc, 0x79, 0x7d,
+ 0xa2, 0xf6, 0x48, 0x77, 0x02, 0x41, 0x5d, 0x44, 0x10, 0x1e, 0x6b, 0xf8,
+ 0x87, 0x13, 0x71, 0xa0, 0x07, 0x42, 0xcb, 0x50, 0x42, 0x98, 0x91, 0x3f,
+ 0x96, 0x07, 0x36, 0x32, 0x4f, 0x22, 0xf9, 0xe1, 0xfb, 0xb4, 0xf6, 0x7d,
+ 0xde, 0xd0, 0x61, 0x85, 0xf9, 0x6e, 0x2b, 0x0e, 0xb1, 0xe8, 0x7b, 0xcf,
+ 0xd0, 0x21, 0xf2, 0xe9, 0xbb, 0xd1, 0x78, 0x5d, 0xd1, 0x5c, 0x4c, 0x73,
+ 0x05, 0x74, 0x27, 0x17, 0x57, 0x82, 0xa6, 0xc9, 0x4b, 0xd1, 0x48, 0x61,
+ 0xc4, 0x25, 0x92, 0x0d, 0xa3, 0x84, 0x1f, 0x58, 0x20, 0x14, 0x21, 0x83,
+ 0x12, 0x4e, 0xb2, 0x67, 0x45, 0x6c, 0x74, 0x74, 0x1e, 0x21, 0x79, 0xf0,
+ 0xb2, 0xee, 0x59, 0x2a, 0x6a, 0x65, 0xd4, 0xdd, 0xe1, 0x6e, 0x32, 0x7a,
+ 0xf3, 0x95, 0x50, 0xfb, 0x7d, 0x35, 0x62, 0xa2, 0x64, 0x52, 0x85, 0xf5,
+ 0x8d, 0x61, 0x9c, 0x3e, 0x09, 0xc2, 0x63, 0x26, 0x71, 0xec, 0xbf, 0xa4,
+ 0x2e, 0x8b, 0xad, 0x16, 0x92, 0x55, 0x37, 0xea, 0x84, 0x33, 0xa9, 0x79,
+ 0xdc, 0xfd, 0x68, 0xa2, 0x3a, 0x87, 0x67, 0xa8, 0x2a, 0x68, 0x74, 0xdc,
+ 0xc3, 0xf5, 0x44, 0x52, 0xfb, 0xc1, 0x79, 0x78, 0xe4, 0x49, 0x78, 0xcc,
+ 0x51, 0x10, 0xbd, 0x43, 0xa5, 0x72, 0x77, 0x3a, 0xce, 0x5b, 0x5b, 0x35,
+ 0xa3, 0x6c, 0x1c, 0x06, 0x25, 0x66, 0x57, 0x50, 0xb4, 0x90, 0x27, 0xd7,
+ 0xc7, 0x2f, 0x11, 0x58, 0xb3, 0xd0, 0xa9, 0x38, 0xdd, 0x12, 0x1a, 0x49,
+ 0x27, 0xbe, 0xe6, 0xaa, 0x04, 0x64, 0xdd, 0x39, 0xf8, 0x0b, 0x6a, 0x50,
+ 0x32, 0xfb, 0x2a, 0xdf, 0xa0, 0xc2, 0xb1, 0x00, 0xd2, 0xbf, 0x5c, 0x43,
+ 0x67, 0xde, 0x59, 0x9a, 0x51, 0xe6, 0xdd, 0x3d, 0x27, 0xed, 0x05, 0x19,
+ 0x06, 0xd0, 0x76, 0xa6, 0xa4, 0xb9, 0x3b, 0x80, 0xb8, 0xee, 0x6a, 0x94,
+ 0x20, 0x4a, 0x84, 0x2e, 0xb4, 0x52, 0xf5, 0x25, 0x94, 0x8d, 0x83, 0x24,
+ 0x79, 0x95, 0x15, 0xf7, 0xed, 0x0e, 0xf5, 0xc1, 0x94, 0x71, 0xcb, 0x95,
+ 0xd7, 0x5d, 0x32, 0xb7, 0xe0, 0x19, 0x29, 0x00, 0x6a, 0xbb, 0x18, 0x76,
+ 0xa9, 0xdd, 0xe7, 0x98, 0x04, 0x78, 0x69, 0xa7, 0x41, 0xb1, 0x35, 0xfe,
+ 0x64, 0x6c, 0x81, 0x93, 0x41, 0xa3, 0x7f, 0xf8, 0xe4, 0x63, 0xa6, 0x01,
+ 0x9c, 0x6a, 0x30, 0x60, 0xea, 0xe5, 0xf8, 0x6f, 0xa8, 0x53, 0x4c, 0x4a,
+ 0xfb, 0x2c, 0x85, 0xbd, 0xca, 0x13, 0xa1, 0x90, 0x38, 0xb2, 0x96, 0xcd,
+ 0x53, 0x1c, 0xb1, 0x0a, 0x5d, 0xd3, 0x54, 0xa7, 0x04, 0x61, 0x49, 0xa5,
+ 0x90, 0x6e, 0xef, 0x02, 0xf4, 0x29, 0x9a, 0x0a, 0x95, 0xad, 0xb8, 0x7c,
+ 0x75, 0x8b, 0x0f, 0xae, 0x48, 0x3a, 0x31, 0xd2, 0xaa, 0x73, 0x8d, 0xf1,
+ 0x6c, 0x32, 0xbc, 0xcf, 0x82, 0x4d, 0xe9, 0xf1, 0x95, 0x6d, 0xa9, 0xcc,
+ 0xab, 0xfb, 0x7f, 0xa1, 0x3f, 0xc2, 0x51, 0xb4, 0x82, 0x33, 0x34, 0xcf,
+ 0x7a, 0xda, 0xe9, 0x71, 0x88, 0x0f, 0xbc, 0xbe, 0xea, 0x03, 0x2f, 0x9d,
+ 0x40, 0x5d, 0xdf, 0x36, 0x64, 0xcf, 0x63, 0x3e, 0xf0, 0xae, 0x50, 0x1e,
+ 0x33, 0xdd, 0xdf, 0x0b, 0xcb, 0x20, 0x7e, 0x97, 0x56, 0x05, 0xc0, 0xe4,
+ 0xbe, 0xe6, 0x4f, 0xdc, 0x17, 0x0b, 0x29, 0x2f, 0x90, 0x5e, 0x11, 0x0e,
+ 0xb7, 0xca, 0x1c, 0xdd, 0x29, 0xb9, 0xd7, 0x98, 0xe2, 0x46, 0x38, 0x94,
+ 0x15, 0x15, 0xba, 0x28, 0x1b, 0x66, 0x73, 0x26, 0xe0, 0x2e, 0xe9, 0x0c,
+ 0x15, 0xb9, 0x58, 0xbc, 0x49, 0x56, 0x9d, 0x90, 0x5a, 0xb3, 0xbb, 0x09,
+ 0xce, 0xae, 0xe5, 0x82, 0xf6, 0x87, 0x62, 0xaa, 0x24, 0xe4, 0xea, 0xc9,
+ 0x19, 0xf9, 0x22, 0xa3, 0xaf, 0xe0, 0x1a, 0xb2, 0xa4, 0xcf, 0xb7, 0x65,
+ 0x4e, 0x18, 0xaa, 0x0d, 0x7b, 0x25, 0x18, 0x3d, 0xc8, 0xed, 0x92, 0xcb,
+ 0xb0, 0x20, 0x01, 0xec, 0x09, 0x8b, 0x78, 0x11, 0x83, 0xc2, 0x21, 0x82,
+ 0xd3, 0xba, 0x95, 0xea, 0x93, 0xb7, 0xb0, 0xc1, 0x80, 0x46, 0x18, 0x85,
+ 0x9f, 0x48, 0xd6, 0xcc, 0x9e, 0x2c, 0xd2, 0x46, 0x0f, 0x8c, 0x27, 0x11,
+ 0xa9, 0x7b, 0x40, 0xab, 0x15, 0xa4, 0xe4, 0x4f, 0x2c, 0xfb, 0x50, 0x97,
+ 0xb0, 0xb9, 0x5d, 0x69, 0xd7, 0xde, 0xaa, 0x16, 0xc1, 0xe9, 0x14, 0xc6,
+ 0xe1, 0x03, 0x62, 0xfc, 0xe3, 0xbd, 0x42, 0xc6, 0xd6, 0x2b, 0x33, 0x0b,
+ 0x4a, 0xe7, 0xa5, 0xe2, 0x3b, 0x79, 0x83, 0x15, 0xeb, 0x60, 0x56, 0x15,
+ 0xcb, 0x29, 0x65, 0x1e, 0xe6, 0xcb, 0xee, 0x91, 0x2f, 0x34, 0x44, 0x67,
+ 0x11, 0x3a, 0x4c, 0xe8, 0x04, 0x3d, 0x42, 0xdc, 0x12, 0xcc, 0x60, 0x0f,
+ 0xa3, 0x54, 0x69, 0xfd, 0x89, 0x1a, 0x0a, 0x51, 0xbb, 0xb8, 0xb3, 0x6f,
+ 0xc7, 0xb2, 0xb9, 0x98, 0x0d, 0x53, 0x4c, 0x07, 0x46, 0x08, 0x2c, 0xd6,
+ 0x38, 0x9e, 0x9c, 0x6f, 0xa6, 0x05, 0x76, 0xf5, 0xe9, 0x23, 0xf8, 0x27,
+ 0x0c, 0xa9, 0x93, 0xb9, 0x0b, 0xc1, 0xe2, 0x46, 0x25, 0x78, 0x12, 0x9b,
+ 0xc9, 0x18, 0x68, 0x2f, 0xb4, 0x15, 0x56, 0xf2, 0xda, 0x6b, 0x36, 0x17,
+ 0x26, 0x50, 0x27, 0x6c, 0x15, 0xc0, 0x89, 0xa7, 0x4f, 0x66, 0xee, 0x1d,
+ 0x27, 0x53, 0xa1, 0x4d, 0xd8, 0x3b, 0x85, 0xc0, 0xa4, 0xbd, 0x6f, 0xb1,
+ 0xaf, 0x26, 0x98, 0x47, 0xf0, 0x2b, 0x31, 0x45, 0x3a, 0x3f, 0x27, 0xd7,
+ 0x92, 0x4b, 0x7b, 0xec, 0x76, 0x52, 0xb9, 0xa7, 0x23, 0xce, 0x0f, 0xc8,
+ 0x49, 0x7c, 0x88, 0x3a, 0x96, 0xaf, 0x65, 0x2e, 0x58, 0xb1, 0x18, 0x31,
+ 0xd2, 0x8e, 0x69, 0x07, 0x81, 0xaa, 0x3f, 0xe7, 0x82, 0xd2, 0x71, 0xd8,
+ 0xdb, 0x48, 0xce, 0x9b, 0x96, 0x9d, 0x86, 0x9c, 0x56, 0xcc, 0xa1, 0xe7,
+ 0x0d, 0xe3, 0x3a, 0x3b, 0x1f, 0x9b, 0x07, 0xbc, 0xe2, 0xf2, 0x3d, 0x04,
+ 0xe9, 0x15, 0x57, 0x22, 0x0d, 0xbb, 0x7f, 0xba, 0xdf, 0x9a, 0xd1, 0xc5,
+ 0x84, 0x34, 0xad, 0xd5, 0x6a, 0xb7, 0x42, 0xfb, 0x2b, 0x2f, 0xcc, 0x89,
+ 0x5e, 0x37, 0x28, 0x3c, 0xf4, 0x6b, 0x06, 0xd5, 0x2a, 0xd1, 0x2d, 0x63,
+ 0x90, 0x3e, 0x77, 0x56, 0x84, 0x3f, 0xb2, 0xd6, 0x09, 0xbb, 0x62, 0x08,
+ 0xa6, 0xcd, 0x35, 0x15, 0x31, 0xbd, 0x61, 0xd8, 0x07, 0x7f, 0xe9, 0x48,
+ 0x1e, 0x9e, 0x46, 0x6c, 0x0d, 0xfa, 0xef, 0x8f, 0x07, 0xf0, 0x7b, 0x4d,
+ 0x7f, 0x5e, 0xd9, 0x8f, 0xe3, 0xbe, 0xf4, 0xe5, 0x77, 0xe8, 0x46, 0xbe,
+ 0xb8, 0x21, 0xaf, 0xc6, 0x8b, 0x58, 0x96, 0x8d, 0x37, 0x11, 0xf2, 0xd8,
+ 0x6f, 0xff, 0xfd, 0x6a, 0xe6, 0x88, 0x6d, 0xd6, 0x7c, 0x5f, 0x1e, 0xfb,
+ 0xcd, 0xbf, 0xcf, 0x67, 0x77, 0xfd, 0xe5, 0x62, 0xa5, 0xe2, 0x2b, 0x81,
+ 0x32, 0xb7, 0x25, 0x8e, 0xbb, 0x55, 0x7e, 0x85, 0x50, 0x14, 0x74, 0x74,
+ 0x28, 0x15, 0xe5, 0x5b, 0xd1, 0x4a, 0x03, 0xbe, 0x58, 0xfc, 0x4d, 0x24,
+ 0x18, 0x44, 0x73, 0x38, 0x39, 0x52, 0xfa, 0xe3, 0x05, 0xff, 0xb9, 0xf3,
+ 0x65, 0x6c, 0x8d, 0x94, 0x12, 0xf5, 0x98, 0xae, 0x41, 0x2d, 0x16, 0x82,
+ 0xfa, 0x13, 0x4c, 0x15, 0x20, 0x2a, 0xaf, 0xad, 0x9c, 0x40, 0x93, 0xa5,
+ 0x58, 0x11, 0x7a, 0x35, 0x56, 0xa1, 0x44, 0x66, 0x88, 0x00, 0xa3, 0x64,
+ 0x82, 0x59, 0x1e, 0x69, 0x8b, 0x14, 0x22, 0xc5, 0x23, 0xf3, 0x3e, 0x58,
+ 0x5b, 0x56, 0x96, 0x58, 0x5c, 0xcb, 0xaf, 0xf4, 0xe8, 0x68, 0x4b, 0xbf,
+ 0xe9, 0x4b, 0x85, 0x10, 0xd3, 0x1c, 0x6d, 0x2b, 0x41, 0x4c, 0xea, 0x7e,
+ 0xc2, 0x72, 0x86, 0xf4, 0x2e, 0x8c, 0x84, 0x27, 0xdd, 0x74, 0xc6, 0xc0,
+ 0xdc, 0xe4, 0xe8, 0xec, 0xed, 0xdb, 0xe3, 0xa3, 0x6e, 0x38, 0x0f, 0xb4,
+ 0x15, 0x48, 0x3e, 0x00, 0xcd, 0xba, 0xa8, 0xfa, 0x41, 0x85, 0x3a, 0x7c,
+ 0x9d, 0xa9, 0xc7, 0x2d, 0xa7, 0x12, 0xf7, 0x00, 0xf5, 0x6b, 0x52, 0xa1,
+ 0x66, 0xe5, 0x1c, 0x06, 0x8f, 0xb7, 0x93, 0x77, 0x40, 0x24, 0xb1, 0x2b,
+ 0xd8, 0x0f, 0xce, 0x1b, 0x01, 0xb7, 0x14, 0x95, 0x2f, 0x64, 0x0d, 0x14,
+ 0x26, 0xa6, 0xf6, 0x80, 0xab, 0xf8, 0x4d, 0xa7, 0x3b, 0x02, 0x5c, 0x96,
+ 0x94, 0xb8, 0xd0, 0x98, 0xb1, 0x7b, 0x99, 0x99, 0xbe, 0x28, 0x43, 0x64,
+ 0x50, 0x5e, 0x71, 0xb1, 0xcc, 0x79, 0x5a, 0x7d, 0xa0, 0x68, 0xa0, 0x97,
+ 0x2b, 0x82, 0x5c, 0x41, 0xf0, 0x0e, 0x4f, 0xa7, 0xb1, 0x24, 0x74, 0xb8,
+ 0x98, 0x15, 0x1b, 0x8f, 0x5c, 0x34, 0xee, 0x90, 0x54, 0x97, 0x3b, 0xd0,
+ 0x24, 0x3e, 0x7a, 0xbd, 0xc8, 0xee, 0xe8, 0x33, 0xcc, 0xbd, 0x41, 0x99,
+ 0xe4, 0x21, 0x5b, 0x3d, 0x33, 0x24, 0xb3, 0x1b, 0xfd, 0x5e, 0x92, 0xd8,
+ 0x69, 0xad, 0xe6, 0xcc, 0x06, 0x0f, 0x2e, 0x5e, 0x2a, 0xb1, 0xc4, 0x09,
+ 0x20, 0xc1, 0x5c, 0x7d, 0xa3, 0x64, 0x7a, 0x5e, 0xc4, 0x4d, 0x39, 0x44,
+ 0xfc, 0xcc, 0x0e, 0xc6, 0x79, 0x4b, 0x8e, 0x8c, 0x47, 0xb3, 0xb7, 0x2a,
+ 0xe4, 0x8b, 0xf9, 0xc6, 0x42, 0x90, 0xbd, 0x52, 0x3b, 0xea, 0x1d, 0xa9,
+ 0x45, 0xe7, 0xef, 0xfa, 0xe0, 0x3c, 0x13, 0x11, 0x34, 0x0c, 0x67, 0x08,
+ 0xb1, 0x67, 0x5d, 0xa2, 0x57, 0x70, 0x20, 0xc1, 0xe1, 0x48, 0xe4, 0x67,
+ 0xd7, 0x4b, 0xce, 0x76, 0x23, 0x48, 0x00, 0x8e, 0x6b, 0xa0, 0xe8, 0x02,
+ 0x79, 0x8a, 0x34, 0xb0, 0xbe, 0x56, 0x75, 0xa6, 0xfd, 0x6a, 0x26, 0x98,
+ 0x96, 0x42, 0xa6, 0x5f, 0xa9, 0x4c, 0xd8, 0xef, 0x2e, 0x47, 0x38, 0x2f,
+ 0x16, 0xcb, 0x26, 0x88, 0x9d, 0x11, 0xb1, 0x13, 0x27, 0xf3, 0x7f, 0x39,
+ 0x08, 0xeb, 0xfd, 0xa4, 0x53, 0x7f, 0x55, 0x21, 0xc2, 0x61, 0xfd, 0xd7,
+ 0x8d, 0x11, 0x00, 0x6b, 0xbd, 0xb4, 0xbe, 0x4d, 0xe3, 0x8c, 0x1a, 0xc1,
+ 0x88, 0xe3, 0xac, 0x78, 0xdb, 0x75, 0x07, 0xee, 0x85, 0xee, 0x6e, 0xb0,
+ 0x6f, 0xa9, 0x90, 0x58, 0x47, 0xdd, 0x01, 0x72, 0xc1, 0x8e, 0xfc, 0x33,
+ 0x76, 0x0e, 0x79, 0x9f, 0xb2, 0x55, 0xd7, 0xd2, 0x87, 0x3e, 0x28, 0x20,
+ 0xf9, 0xa1, 0xdf, 0xfe, 0x6e, 0x5a, 0x5f, 0xb7, 0xdb, 0x5d, 0x8e, 0xf6,
+ 0xb9, 0xdf, 0xa3, 0x07, 0xd1, 0x42, 0xd8, 0xad, 0x6f, 0x3f, 0xfe, 0xb3,
+ 0x01, 0xcb, 0xdd, 0x03, 0x7e, 0x39, 0x77, 0xf3, 0x3e, 0x48, 0xe2, 0x08,
+ 0xa9, 0x1b, 0xe0, 0x51, 0xbd, 0x3b, 0x79, 0xed, 0x2d, 0xec, 0x92, 0xf6,
+ 0xfd, 0x8b, 0x38, 0x12, 0xa3, 0x8e, 0x75, 0x44, 0xa2, 0xcc, 0x8f, 0xbb,
+ 0x94, 0x1f, 0xbc, 0x84, 0x5b, 0x39, 0x9f, 0x5d, 0x38, 0x94, 0xcd, 0xf9,
+ 0x7a, 0xfc, 0xc4, 0x51, 0xc2, 0xdb, 0x6f, 0xa9, 0xb0, 0x20, 0xd1, 0xac,
+ 0xa5, 0xae, 0xe0, 0x13, 0xad, 0x49, 0x78, 0xcc, 0xbd, 0x14, 0x4c, 0x89,
+ 0x5b, 0x83, 0x88, 0xb6, 0x12, 0xce, 0xc2, 0x3a, 0xb4, 0xbb, 0xdb, 0x9e,
+ 0x78, 0xea, 0x37, 0x3f, 0x16, 0x04, 0x6f, 0xc9, 0x27, 0x02, 0xe3, 0x7f,
+ 0xf1, 0x30, 0x1d, 0x63, 0xc0, 0x65, 0xe5, 0x45, 0x9e, 0xa4, 0x2d, 0x16,
+ 0xcc, 0x56, 0x01, 0x09, 0xc8, 0x55, 0x04, 0x9a, 0x1c, 0x01, 0xae, 0xf8,
+ 0x71, 0xa1, 0x27, 0xd1, 0xde, 0xd6, 0xb3, 0x01, 0x7a, 0x40, 0x39, 0x76,
+ 0x81, 0xae, 0xeb, 0xe6, 0xaa, 0xf3, 0xdc, 0x6f, 0x3f, 0x6d, 0xcd, 0xac,
+ 0xa6, 0xb5, 0x7c, 0x8c, 0x48, 0xf3, 0x1f, 0xfd, 0x3d, 0xfa, 0x61, 0x91,
+ 0x06, 0x2f, 0x18, 0x46, 0xb0, 0xb6, 0x27, 0xf6, 0xe1, 0xdf, 0xa3, 0x27,
+ 0x48, 0xdb, 0x8b, 0xee, 0xa1, 0x56, 0x1f, 0xf0, 0xd8, 0xef, 0xf1, 0xfd,
+ 0xdb, 0xbd, 0x55, 0x9f, 0x45, 0x39, 0x2d, 0x3c, 0xf1, 0x1b, 0x7e, 0xf8,
+ 0x9d, 0x35, 0x4a, 0x38, 0xcb, 0xf1, 0x05, 0xfd, 0xf7, 0x40, 0x67, 0x78,
+ 0x5d, 0x9d, 0x8e, 0x15, 0xcc, 0xb0, 0x5e, 0x91, 0xd0, 0x20, 0x9d, 0xf7,
+ 0x51, 0xc0, 0x2f, 0x5b, 0xc4, 0x5a, 0x78, 0xa6, 0x95, 0x38, 0x32, 0x01,
+ 0xa1, 0xef, 0x40, 0xf9, 0x66, 0x38, 0xb3, 0x9a, 0x53, 0xdd, 0x39, 0x71,
+ 0x59, 0x98, 0x17, 0xba, 0x64, 0x1b, 0x56, 0x8c, 0x99, 0x1e, 0xc5, 0xa4,
+ 0xaf, 0xe0, 0xa4, 0xee, 0x6d, 0xc9, 0x2f, 0xa4, 0x8e, 0x58, 0xd9, 0x1d,
+ 0xc4, 0x86, 0x67, 0xcc, 0xcb, 0xb4, 0x9e, 0x1a, 0x57, 0xaa, 0xa1, 0x3b,
+ 0x8e, 0x82, 0x31, 0x9b, 0x4d, 0x41, 0xe5, 0x01, 0x89, 0xda, 0x39, 0xce,
+ 0xb4, 0x99, 0xcb, 0x6b, 0xb5, 0xca, 0xd7, 0x41, 0xd2, 0x1b, 0xbc, 0x4b,
+ 0x0e, 0x7a, 0xbf, 0x23, 0x80, 0xdc, 0x33, 0x4e, 0x7f, 0x01, 0x1e, 0xae,
+ 0x5d, 0x79, 0x60, 0x1d, 0x3a, 0xcc, 0x43, 0x08, 0x05, 0xe9, 0xb8, 0x71,
+ 0x58, 0xd8, 0x15, 0x71, 0x74, 0x26, 0x6f, 0xbb, 0x0b, 0x10, 0x01, 0x58,
+ 0x51, 0x84, 0x9a, 0x03, 0xc2, 0x76, 0x74, 0x0d, 0x92, 0xd3, 0x90, 0xe9,
+ 0xeb, 0xbb, 0x8c, 0xdf, 0x05, 0x75, 0xfd, 0x1c, 0x6c, 0x6c, 0x35, 0x50,
+ 0xcc, 0xc3, 0x89, 0x01, 0x2e, 0xc9, 0x96, 0x33, 0x0a, 0x21, 0x07, 0x06,
+ 0x29, 0xd8, 0x0c, 0x19, 0x23, 0xa6, 0x10, 0x31, 0x1f, 0x21, 0x96, 0x6c,
+ 0x5d, 0x7a, 0x2e, 0x7c, 0xc7, 0x3e, 0x44, 0x76, 0x57, 0xdc, 0x79, 0x8c,
+ 0x7d, 0x08, 0x3a, 0xda, 0x4f, 0x82, 0xda, 0x3d, 0xfe, 0xd1, 0xd7, 0xa6,
+ 0x6e, 0xf3, 0x94, 0xa3, 0x32, 0x3c, 0x8d, 0xf2, 0x21, 0x9e, 0x4f, 0x2d,
+ 0x60, 0xb8, 0xd6, 0x3d, 0xc7, 0x29, 0xdb, 0x91, 0x34, 0x8f, 0xb7, 0xa3,
+ 0x51, 0x08, 0x15, 0x2b, 0xaa, 0x6c, 0x52, 0x5e, 0x17, 0xf9, 0x3f, 0xa8,
+ 0x45, 0x78, 0x36, 0xbb, 0xe0, 0x91, 0x16, 0x58, 0x4f, 0x3d, 0xf5, 0xc4,
+ 0xe0, 0x41, 0xf1, 0x93, 0xee, 0x6a, 0x28, 0x97, 0x08, 0x09, 0x29, 0x0a,
+ 0xe4, 0x12, 0x05, 0x82, 0xcc, 0x23, 0x57, 0xab, 0x65, 0x3e, 0x77, 0xc9,
+ 0xa5, 0xd1, 0xd1, 0xc9, 0x87, 0x83, 0xc5, 0xd5, 0x5d, 0x21, 0x20, 0xa0,
+ 0x15, 0x1c, 0x01, 0x59, 0xf2, 0x2b, 0xc0, 0x75, 0x28, 0xd2, 0xf2, 0xcb,
+ 0xa1, 0x75, 0xf1, 0xfc, 0x7d, 0x54, 0xcb, 0xa6, 0xa3, 0x11, 0x67, 0x48,
+ 0x51, 0xf6, 0x80, 0x48, 0x49, 0x98, 0x1b, 0x07, 0x88, 0x64, 0xc1, 0xfb,
+ 0x28, 0x9e, 0x14, 0xd3, 0x10, 0x67, 0x55, 0x85, 0x67, 0xab, 0xcb, 0x91,
+ 0x62, 0x9d, 0x1f, 0x8f, 0x20, 0x47, 0x21, 0xeb, 0x5e, 0xe9, 0x2d, 0xc5,
+ 0xc8, 0x06, 0xf3, 0xb3, 0xad, 0x4a, 0x5e, 0x72, 0x15, 0x70, 0xef, 0x48,
+ 0xf2, 0x81, 0x8d, 0x96, 0x25, 0x5a, 0x10, 0x75, 0x38, 0x48, 0xeb, 0xc6,
+ 0x16, 0x0b, 0xdd, 0x30, 0xfb, 0x3f, 0x1a, 0x18, 0x12, 0x85, 0x07, 0xe1,
+ 0x8d, 0xd5, 0x9e, 0x37, 0xbf, 0x26, 0x1c, 0xb3, 0xee, 0x8a, 0xee, 0xd6,
+ 0x72, 0x54, 0xa3, 0xb6, 0x8b, 0x1c, 0x3c, 0x12, 0xc3, 0xdf, 0xd6, 0xd1,
+ 0x70, 0x8c, 0xc2, 0x48, 0x1e, 0x94, 0x12, 0xc3, 0x21, 0xab, 0x99, 0x4e,
+ 0x53, 0x43, 0xc5, 0xa4, 0x89, 0x80, 0x8c, 0xe1, 0xb5, 0x76, 0xaf, 0xf4,
+ 0x49, 0xfa, 0xb0, 0xc8, 0x15, 0xf5, 0x7d, 0xb0, 0x50, 0x29, 0xdb, 0x1d,
+ 0xec, 0xbd, 0x34, 0xb2, 0xa2, 0xd4, 0xea, 0xef, 0x80, 0xc8, 0xfc, 0x55,
+ 0x90, 0xcc, 0xdf, 0x17, 0x91, 0xe9, 0x6e, 0x0a, 0xba, 0x75, 0xc2, 0x7b,
+ 0x02, 0xc1, 0x52, 0x4a, 0xa9, 0xe3, 0xe8, 0xe8, 0x5d, 0x6a, 0x89, 0xb0,
+ 0xa3, 0x4a, 0x7a, 0xfc, 0x30, 0xf5, 0xdb, 0xf8, 0x96, 0x2c, 0x90, 0x91,
+ 0x5b, 0x22, 0x35, 0x62, 0x75, 0x5e, 0xb8, 0x32, 0xfc, 0x38, 0x83, 0x00,
+ 0xc5, 0xfd, 0xff, 0x17, 0x47, 0x44, 0xfd, 0x7b, 0x66, 0x77, 0xd1, 0xf0,
+ 0xf6, 0x8c, 0x6c, 0x7e, 0xe1, 0xdd, 0xc7, 0x5f, 0x3c, 0x78, 0x21, 0xe3,
+ 0x9c, 0xd1, 0x6b, 0x8e, 0x42, 0xc9, 0x93, 0x77, 0xb6, 0x4e, 0x16, 0x97,
+ 0xfb, 0x68, 0xe2, 0x07, 0x06, 0xa5, 0xaf, 0x98, 0x2b, 0x47, 0xc4, 0x9b,
+ 0x16, 0x78, 0x5f, 0x21, 0xe0, 0x32, 0xa5, 0xcc, 0x55, 0x9e, 0x5e, 0x23,
+ 0xd1, 0xc7, 0x59, 0x73, 0x47, 0xe8, 0x4f, 0xcc, 0x87, 0x4e, 0xa4, 0x27,
+ 0x05, 0x64, 0x8a, 0x56, 0x86, 0xc1, 0xfa, 0x1c, 0x66, 0x24, 0x81, 0xc2,
+ 0x2c, 0x70, 0xb6, 0xca, 0xab, 0x7a, 0x7b, 0x83, 0xd3, 0x17, 0x65, 0x96,
+ 0x77, 0x9e, 0xeb, 0xd6, 0xdc, 0x28, 0x48, 0xa7, 0x85, 0x9b, 0xd5, 0x80,
+ 0xa6, 0x3c, 0xe8, 0x1b, 0xfe, 0xf6, 0x18, 0xcb, 0xb1, 0x8d, 0x96, 0x7b,
+ 0x20, 0x55, 0xd2, 0x1b, 0xa2, 0x2e, 0xbf, 0xa7, 0x69, 0x45, 0x6a, 0x73,
+ 0xe3, 0x76, 0x8c, 0xa4, 0x96, 0x68, 0x43, 0x7a, 0x8b, 0xc2, 0xdf, 0xc6,
+ 0x53, 0x21, 0x8e, 0x6a, 0x96, 0x1f, 0x76, 0x1e, 0x56, 0x1f, 0x0b, 0x87,
+ 0x88, 0xbd, 0xa2, 0x94, 0xeb, 0x6c, 0xa6, 0xc7, 0x35, 0xd7, 0x4c, 0x69,
+ 0xfa, 0xd8, 0x00, 0xee, 0x74, 0x27, 0x2b, 0x99, 0x94, 0xc5, 0x7c, 0x25,
+ 0x70, 0x60, 0x9a, 0xaf, 0xa6, 0x0b, 0xf3, 0x21, 0x94, 0x85, 0xa7, 0x4b,
+ 0x7a, 0xea, 0x49, 0x3c, 0xf4, 0x5b, 0x17, 0x44, 0xd7, 0xca, 0x01, 0xed,
+ 0x43, 0xb0, 0x55, 0x58, 0xb5, 0x44, 0x22, 0x26, 0x2c, 0x97, 0x04, 0xa8,
+ 0x27, 0x49, 0x0d, 0xea, 0x84, 0x17, 0x57, 0x0f, 0xed, 0xca, 0x38, 0x5f,
+ 0x88, 0x50, 0x29, 0x16, 0xbc, 0x6f, 0xba, 0x02, 0x3b, 0xac, 0x6c, 0x79,
+ 0xc9, 0xb4, 0x3b, 0x40, 0x3f, 0xf3, 0xf7, 0x5d, 0x54, 0x41, 0x10, 0x04,
+ 0x5a, 0xe8, 0xe5, 0xce, 0x56, 0xc1, 0x66, 0x0f, 0x7d, 0xac, 0x8c, 0x8a,
+ 0x60, 0x8f, 0xf5, 0x15, 0xe1, 0xea, 0x93, 0x0f, 0xd8, 0x82, 0x58, 0xab,
+ 0xbc, 0xa2, 0xb1, 0x08, 0x52, 0x4b, 0x38, 0x48, 0x8a, 0x7a, 0xc4, 0x2f,
+ 0xb8, 0x35, 0x22, 0xfa, 0xf3, 0xd1, 0xd1, 0xf9, 0x76, 0x72, 0xee, 0x52,
+ 0x9b, 0xe1, 0xf6, 0x05, 0xb8, 0x98, 0xee, 0x6c, 0x5f, 0xdc, 0x4b, 0x01,
+ 0x12, 0x26, 0x63, 0x8a, 0x67, 0x2a, 0x4b, 0xee, 0x38, 0x76, 0xae, 0xa5,
+ 0x1c, 0x83, 0xdb, 0xf9, 0x37, 0x97, 0x7f, 0x9d, 0xb1, 0x1c, 0x82, 0x78,
+ 0x80, 0x13, 0x91, 0x25, 0x27, 0xda, 0x97, 0x06, 0xc6, 0xac, 0x2b, 0x09,
+ 0xd7, 0xce, 0x94, 0xff, 0x92, 0xbb, 0xcd, 0x3b, 0x08, 0x43, 0xef, 0x34,
+ 0xc7, 0x89, 0xf8, 0x8a, 0x7c, 0xf3, 0x28, 0x17, 0xa4, 0xf8, 0x4e, 0xcd,
+ 0xb7, 0x5f, 0x87, 0x15, 0x97, 0x46, 0x71, 0x9d, 0x15, 0x21, 0xcd, 0x36,
+ 0x3e, 0x4a, 0xfa, 0x82, 0x6c, 0xe0, 0xe9, 0xb0, 0x4b, 0xf0, 0xea, 0xe5,
+ 0x96, 0x4b, 0xe7, 0x72, 0x60, 0x4f, 0x79, 0xbf, 0xaf, 0xa2, 0x82, 0xa2,
+ 0xb3, 0x3d, 0x06, 0xde, 0xfe, 0x03, 0x89, 0xde, 0x6b, 0xca, 0xe7, 0x6f,
+ 0x70, 0x95, 0x2e, 0xee, 0x69, 0x3a, 0xcc, 0x83, 0x75, 0x7d, 0xb3, 0x6f,
+ 0x04, 0xd4, 0xfe, 0xf0, 0x53, 0x58, 0x42, 0x46, 0x27, 0xc8, 0xaa, 0x15,
+ 0x44, 0x6f, 0x52, 0xa4, 0xab, 0xd3, 0x9a, 0x28, 0xfb, 0x43, 0x67, 0x5f,
+ 0x0c, 0xfe, 0x07, 0xed, 0xb4, 0xbf, 0x2f, 0x43, 0xdf, 0xe1, 0x16, 0x36,
+ 0xd4, 0x6b, 0x70, 0x3e, 0x11, 0x01, 0x3c, 0xa2, 0x1c, 0xe3, 0xbc, 0x01,
+ 0x83, 0xab, 0xd2, 0x94, 0xb4, 0x8f, 0x25, 0xbd, 0x01, 0x48, 0x2a, 0xbd,
+ 0x16, 0x4d, 0x4c, 0x33, 0xaa, 0xfe, 0xff, 0xa0, 0x6f, 0x69, 0x03, 0x0c,
+ 0xdc, 0x44, 0x24, 0xe6, 0xab, 0xe3, 0xd7, 0x67, 0x17, 0xc7, 0xed, 0xe4,
+ 0x80, 0x06, 0x25, 0x27, 0x10, 0x68, 0xe8, 0xf6, 0x0e, 0xec, 0x2b, 0xae,
+ 0x94, 0x59, 0x5e, 0xe4, 0x04, 0x13, 0x4b, 0xce, 0xbf, 0x7f, 0x65, 0x3b,
+ 0x47, 0x9a, 0x48, 0xc1, 0x9d, 0x72, 0xf5, 0x72, 0x65, 0x9e, 0xbb, 0x1a,
+ 0x04, 0x29, 0x1b, 0x54, 0x02, 0x41, 0xea, 0x29, 0xda, 0xee, 0x21, 0xc0,
+ 0xc3, 0x81, 0x39, 0xfe, 0x58, 0xca, 0x64, 0x9f, 0x75, 0x4d, 0x99, 0x6f,
+ 0xb6, 0xd9, 0x40, 0xbd, 0x86, 0x82, 0x01, 0x86, 0x0b, 0xb1, 0x79, 0x89,
+ 0xe1, 0x84, 0x68, 0x4f, 0x86, 0x89, 0xfd, 0x88, 0xfb, 0x0a, 0x17, 0x87,
+ 0x85, 0xfa, 0x82, 0xaf, 0xc4, 0x22, 0x89, 0x54, 0xf0, 0x93, 0xbd, 0x97,
+ 0x7c, 0xa9, 0x12, 0x59, 0x35, 0xed, 0x59, 0x5b, 0x6d, 0xa1, 0xcf, 0x8c,
+ 0x34, 0x92, 0x9c, 0xe6, 0xcf, 0x63, 0xc4, 0x3b, 0x6f, 0x3e, 0xbb, 0x55,
+ 0x6f, 0xf7, 0xbd, 0x9e, 0xda, 0x69, 0x93, 0x0e, 0x6f, 0xfe, 0x65, 0x33,
+ 0x11, 0x40, 0x2a, 0x04, 0x1e, 0x5f, 0xf5, 0x2b, 0xaa, 0x2c, 0xb9, 0xaa,
+ 0x1b, 0xdb, 0x0f, 0x45, 0x8f, 0x75, 0xd0, 0xab, 0x6d, 0x34, 0xcd, 0x94,
+ 0x95, 0x98, 0x22, 0x17, 0xc0, 0xa2, 0x38, 0x0f, 0xbe, 0x01, 0xf1, 0x21,
+ 0x37, 0xb7, 0xb6, 0xd5, 0x8f, 0xe4, 0xc9, 0x91, 0xe3, 0xa7, 0xf2, 0x69,
+ 0xf8, 0x55, 0xe4, 0x80, 0x59, 0x41, 0x49, 0x56, 0xb9, 0x28, 0x93, 0x96,
+ 0x38, 0xb8, 0x2f, 0x1a, 0x3a, 0xad, 0x10, 0x2c, 0xc1, 0xa4, 0x55, 0xb8,
+ 0x90, 0x78, 0x3f, 0xb9, 0xed, 0x5b, 0x23, 0x23, 0xf5, 0xb3, 0x67, 0x9f,
+ 0x91, 0x1a, 0x81, 0x20, 0xa9, 0x94, 0xa2, 0x10, 0x36, 0x42, 0x30, 0x6d,
+ 0x84, 0xa9, 0x28, 0x9d, 0x01, 0x68, 0xf9, 0xc0, 0x71, 0x36, 0xe3, 0xd2,
+ 0x17, 0x23, 0xaf, 0x89, 0x47, 0x47, 0xeb, 0xda, 0x08, 0xc4, 0x21, 0xab,
+ 0x27, 0x66, 0x15, 0xd2, 0x0f, 0x2e, 0x47, 0x31, 0x59, 0x75, 0x34, 0xfb,
+ 0x76, 0xdb, 0x6a, 0x4e, 0x2a, 0x6f, 0x07, 0xcb, 0xe0, 0x6c, 0x44, 0x77,
+ 0x56, 0xe5, 0xf5, 0x87, 0x64, 0xeb, 0xcf, 0xdb, 0xb6, 0xf0, 0x68, 0x04,
+ 0xeb, 0x45, 0xae, 0xc9, 0xbc, 0x58, 0x66, 0xad, 0xa2, 0xb4, 0xda, 0xda,
+ 0x15, 0x0a, 0xa5, 0x10, 0xeb, 0x5d, 0x0c, 0xb6, 0x4f, 0x75, 0x01, 0x17,
+ 0x01, 0x8f, 0xbd, 0x64, 0x46, 0xca, 0x2e, 0x08, 0x6f, 0x4d, 0xac, 0x08,
+ 0x28, 0x1e, 0xc5, 0x4b, 0xa8, 0xea, 0xd3, 0x30, 0x79, 0x57, 0x40, 0xbb,
+ 0x91, 0xbd, 0x29, 0x77, 0x49, 0x5e, 0x98, 0x81, 0x98, 0xb1, 0x9a, 0xdb,
+ 0x24, 0x22, 0xa8, 0xfe, 0xde, 0x96, 0x4f, 0x22, 0x48, 0x3b, 0x5c, 0x1b,
+ 0x38, 0xd9, 0x22, 0xfc, 0x9c, 0x68, 0x4b, 0x5e, 0x87, 0x95, 0x5f, 0xb8,
+ 0x68, 0x05, 0x1d, 0x07, 0xb3, 0x4a, 0x68, 0x9b, 0xd2, 0xa2, 0xb2, 0xd9,
+ 0x6c, 0xc0, 0x8c, 0xa0, 0xc4, 0x90, 0x48, 0x76, 0x86, 0x59, 0xa7, 0x74,
+ 0xc2, 0x21, 0x76, 0xdf, 0x06, 0x0b, 0x6e, 0x1f, 0x64, 0x5f, 0x0d, 0x09,
+ 0xa4, 0xac, 0x59, 0xcb, 0x82, 0xcb, 0x53, 0x22, 0x5e, 0xc2, 0xff, 0x3b,
+ 0xbf, 0x0c, 0x26, 0x87, 0x87, 0xb4, 0xaa, 0x4c, 0x43, 0x48, 0xb1, 0x35,
+ 0xb9, 0xb9, 0xae, 0x16, 0x5c, 0x2f, 0x26, 0x56, 0xcc, 0xc6, 0x37, 0x00,
+ 0xf8, 0x51, 0x5d, 0xdd, 0x3a, 0x6b, 0xb8, 0x33, 0xfc, 0xee, 0xc9, 0xab,
+ 0x56, 0xe1, 0x49, 0x9a, 0x8a, 0x69, 0x58, 0x46, 0xc1, 0xf3, 0x70, 0x48,
+ 0x2d, 0x29, 0x73, 0x62, 0xdd, 0xdd, 0x62, 0x9b, 0x72, 0xd6, 0xce, 0x58,
+ 0x8b, 0x83, 0xe1, 0x77, 0xf1, 0xe6, 0xa4, 0x15, 0xd6, 0x66, 0xb9, 0x0d,
+ 0x6d, 0x18, 0x5b, 0x45, 0x2b, 0xa3, 0xd2, 0x66, 0xa0, 0x12, 0xc8, 0xfa,
+ 0x99, 0x10, 0xc6, 0x71, 0x33, 0x2f, 0xa7, 0x84, 0x3a, 0xcf, 0x1e, 0x9e,
+ 0x8b, 0x39, 0xe0, 0x8f, 0x7a, 0x70, 0x04, 0xb2, 0x5f, 0xfb, 0x65, 0xaa,
+ 0xd1, 0xce, 0x98, 0xd8, 0x68, 0x78, 0x66, 0xe2, 0xcd, 0xb9, 0xa1, 0x6a,
+ 0xfd, 0x26, 0x79, 0xd3, 0x1f, 0x42, 0x91, 0x94, 0x93, 0xc6, 0x1b, 0x01,
+ 0x3d, 0x10, 0x6f, 0x8e, 0x85, 0x6f, 0x64, 0x64, 0x04, 0xe1, 0x86, 0x71,
+ 0xbb, 0x7e, 0x64, 0xfc, 0x60, 0xb0, 0xc8, 0xe6, 0x87, 0x2c, 0xd2, 0x83,
+ 0x15, 0x5e, 0x3d, 0xb2, 0xd8, 0x0a, 0xa3, 0x07, 0xdd, 0x05, 0x56, 0xc2,
+ 0xfe, 0x8a, 0x97, 0x72, 0x10, 0x6f, 0xce, 0xae, 0xb0, 0x10, 0x37, 0xae,
+ 0x59, 0x60, 0xf9, 0x4a, 0x30, 0x0b, 0x33, 0x23, 0x22, 0x8d, 0x16, 0x3c,
+ 0xc9, 0xde, 0x73, 0xe1, 0x6c, 0xaa, 0x88, 0xdd, 0xbc, 0x5f, 0x3f, 0x21,
+ 0x33, 0x49, 0x6f, 0xbc, 0x9f, 0xa3, 0x00, 0xa3, 0x15, 0x16, 0xc2, 0x94,
+ 0x96, 0xd2, 0x6f, 0xc6, 0x25, 0x29, 0x81, 0x5c, 0xe4, 0xb2, 0x59, 0x3d,
+ 0x21, 0xde, 0xf7, 0x12, 0x5b, 0x8a, 0x7a, 0x51, 0xe6, 0x85, 0xe6, 0x95,
+ 0x8b, 0x8c, 0xf1, 0xba, 0x98, 0xc4, 0x52, 0xeb, 0xd7, 0x05, 0x5a, 0xe6,
+ 0x1f, 0x08, 0x04, 0x6e, 0x15, 0x85, 0xf7, 0x11, 0xa6, 0x6b, 0x7f, 0x1f,
+ 0xf3, 0xe3, 0x6e, 0x1f, 0xf3, 0xa8, 0x74, 0x1b, 0xbb, 0x5a, 0x5d, 0x0f,
+ 0xaf, 0x76, 0xfb, 0x93, 0xf6, 0x4c, 0x76, 0xfb, 0xb7, 0xb8, 0x9b, 0x5a,
+ 0xaf, 0xd0, 0xdd, 0xd4, 0x7e, 0x58, 0xef, 0x7f, 0xa0, 0xaf, 0xb4, 0x18,
+ 0x1e, 0x01, 0x4f, 0xb9, 0xb1, 0x2b, 0xe5, 0x73, 0x5c, 0x31, 0x15, 0xa0,
+ 0x79, 0x0c, 0xb4, 0xa4, 0xe0, 0xe3, 0x15, 0xaa, 0xfa, 0xc9, 0x04, 0xcb,
+ 0x72, 0xac, 0x9e, 0x1c, 0x79, 0xda, 0x75, 0x91, 0xe5, 0xbb, 0x5f, 0xb7,
+ 0x37, 0x9c, 0xa0, 0xd5, 0x02, 0x4f, 0xbe, 0xda, 0x39, 0x10, 0xd3, 0x8c,
+ 0x9c, 0xc4, 0xb2, 0x15, 0x08, 0xcd, 0xcb, 0x0d, 0xa9, 0xdc, 0x5b, 0xb7,
+ 0x91, 0x56, 0xce, 0x71, 0x35, 0x7f, 0xe0, 0x90, 0x9b, 0x07, 0xdc, 0xa8,
+ 0x08, 0xd3, 0xe3, 0x8d, 0x2a, 0x38, 0x99, 0x72, 0x8c, 0x57, 0xcc, 0xfc,
+ 0xaa, 0x1e, 0xb4, 0x76, 0xe1, 0xba, 0x9e, 0xd0, 0x83, 0xb1, 0xce, 0xb8,
+ 0xa9, 0x45, 0x62, 0xcf, 0xbd, 0x27, 0x29, 0xe3, 0xcd, 0x49, 0x77, 0xdd,
+ 0x7b, 0x32, 0x3d, 0x7d, 0xcf, 0x91, 0xca, 0xc4, 0xd8, 0xc6, 0xb8, 0x0c,
+ 0xf7, 0x86, 0x1e, 0xf0, 0x5f, 0x24, 0x20, 0xc8, 0x8a, 0x9f, 0x15, 0xbe,
+ 0xdd, 0x4e, 0x5f, 0x34, 0x77, 0xef, 0x1a, 0xb8, 0xad, 0x17, 0x6d, 0xb5,
+ 0x0b, 0xce, 0x75, 0xd6, 0x10, 0x2a, 0x04, 0x03, 0x08, 0xa0, 0x34, 0x28,
+ 0xac, 0x20, 0x8a, 0x2c, 0x18, 0x41, 0xa6, 0x44, 0x59, 0x1d, 0x62, 0xfb,
+ 0xf8, 0x93, 0x4c, 0x01, 0x86, 0x49, 0x45, 0x15, 0x18, 0x51, 0x43, 0xb4,
+ 0x8a, 0x5b, 0x9d, 0x89, 0x2d, 0xa1, 0x8f, 0x27, 0xcc, 0x82, 0x1d, 0x16,
+ 0xaf, 0xeb, 0xb0, 0xb1, 0xd5, 0x43, 0xcf, 0x59, 0xc1, 0xd4, 0x91, 0xd9,
+ 0xf5, 0xd4, 0x2f, 0x05, 0xe9, 0x0d, 0xbf, 0xea, 0xf3, 0x14, 0x5c, 0x9b,
+ 0xc1, 0xe3, 0x8f, 0x28, 0x90, 0x95, 0x15, 0x6b, 0xa8, 0x2b, 0x94, 0x50,
+ 0xb9, 0x9d, 0x5c, 0x64, 0x94, 0xb9, 0x75, 0x4b, 0xd2, 0x94, 0x52, 0xb3,
+ 0x13, 0x6e, 0x61, 0x2b, 0x1f, 0x66, 0x02, 0x5c, 0x24, 0x15, 0x89, 0xc8,
+ 0x65, 0x03, 0x9d, 0xc6, 0x6c, 0x8d, 0x6d, 0x36, 0xf8, 0x53, 0x2e, 0x05,
+ 0xb2, 0x37, 0xdc, 0xeb, 0x73, 0x45, 0xc0, 0x4a, 0xd5, 0x45, 0xb5, 0x31,
+ 0xe8, 0x27, 0xa9, 0xd0, 0xe6, 0x73, 0x2a, 0x67, 0xd7, 0x1b, 0x71, 0x41,
+ 0xdf, 0xad, 0x43, 0x1f, 0x35, 0xfc, 0xdc, 0xce, 0xac, 0xb9, 0x4b, 0xef,
+ 0x43, 0x45, 0x7d, 0x77, 0xf0, 0xf4, 0xb3, 0xcf, 0x5a, 0x37, 0x7a, 0xed,
+ 0x11, 0x83, 0x3e, 0xdb, 0xdd, 0xe5, 0xac, 0xf3, 0xee, 0x6b, 0xe6, 0x17,
+ 0x83, 0xcf, 0xf0, 0x62, 0xfb, 0xb5, 0x3a, 0x33, 0x4b, 0x30, 0x5d, 0xfd,
+ 0xde, 0x80, 0x7e, 0x13, 0xf9, 0x1c, 0xbc, 0x2e, 0x2b, 0xdf, 0xfa, 0x8c,
+ 0x3e, 0x17, 0x79, 0x8b, 0x13, 0xe2, 0x31, 0x8f, 0xe5, 0xd5, 0x15, 0xf9,
+ 0xbb, 0xe8, 0x49, 0x5c, 0x7c, 0x66, 0x47, 0xdc, 0xa5, 0xd5, 0x34, 0x1c,
+ 0xee, 0x6e, 0x7f, 0xb0, 0xb7, 0x6a, 0xb8, 0xa0, 0x35, 0x05, 0xbc, 0x85,
+ 0x96, 0x93, 0xcc, 0x49, 0x63, 0x48, 0x30, 0x88, 0xb9, 0xdb, 0xd0, 0x9e,
+ 0xe9, 0xd1, 0xde, 0x67, 0x9f, 0xf5, 0xa9, 0x67, 0xcf, 0x3e, 0xfb, 0x6c,
+ 0x65, 0xd2, 0x9a, 0xf7, 0x99, 0xbb, 0xd2, 0x39, 0xa9, 0xe8, 0x75, 0xb7,
+ 0x67, 0x6a, 0xb2, 0x57, 0xe2, 0xdf, 0xa1, 0xdf, 0x24, 0x2f, 0x93, 0xb7,
+ 0x67, 0x97, 0xc7, 0x9e, 0xff, 0xc6, 0xf9, 0x67, 0xfd, 0x3a, 0x31, 0x08,
+ 0x08, 0x2f, 0x50, 0x99, 0x02, 0xf6, 0xb1, 0x31, 0xb6, 0x42, 0x94, 0x03,
+ 0x00, 0xb5, 0xea, 0x39, 0xfc, 0x43, 0xf7, 0x73, 0x67, 0x05, 0xea, 0x4f,
+ 0x5c, 0xe7, 0x8d, 0xcf, 0xa4, 0xb0, 0x65, 0x16, 0x7b, 0x1b, 0x7e, 0x90,
+ 0xdb, 0x74, 0x96, 0xdb, 0xc8, 0xce, 0x66, 0x4d, 0xf8, 0x53, 0x66, 0x55,
+ 0xa4, 0x7f, 0x94, 0x8b, 0xcd, 0x00, 0x02, 0x9a, 0xcd, 0xc8, 0x79, 0x20,
+ 0x37, 0x21, 0xbf, 0x30, 0xc0, 0x93, 0x72, 0x5a, 0x60, 0xd0, 0x72, 0x01,
+ 0xcc, 0x14, 0xde, 0x65, 0xff, 0xe3, 0x91, 0xe0, 0x0e, 0x9c, 0x5e, 0x40,
+ 0x9e, 0x29, 0x78, 0x9c, 0x9a, 0xe9, 0x7b, 0xd3, 0xb0, 0x59, 0x77, 0x0b,
+ 0x65, 0x53, 0xb5, 0xe9, 0x38, 0xe0, 0x01, 0x11, 0x85, 0x69, 0xb6, 0x50,
+ 0x7e, 0xc2, 0xa2, 0xdd, 0x8e, 0xd9, 0xcb, 0x57, 0xf9, 0xf5, 0xb2, 0x8a,
+ 0x83, 0xab, 0x60, 0x9c, 0x0b, 0x96, 0x59, 0x39, 0x70, 0xd3, 0xbb, 0x54,
+ 0x31, 0xd4, 0xa0, 0x2d, 0xd6, 0xc3, 0xad, 0x86, 0xb2, 0x62, 0x96, 0x89,
+ 0xa0, 0x38, 0xf0, 0x8b, 0x11, 0xca, 0xdc, 0xe8, 0x31, 0xe4, 0x47, 0x10,
+ 0x64, 0x09, 0x5c, 0x7f, 0x52, 0xaa, 0x46, 0x80, 0xe3, 0xea, 0x69, 0x37,
+ 0x8b, 0x8d, 0x9a, 0x34, 0x69, 0x22, 0x53, 0xd0, 0x8d, 0xe2, 0x95, 0xcb,
+ 0x4d, 0x8f, 0x73, 0x82, 0x9e, 0x85, 0x4f, 0xe6, 0xa6, 0xf4, 0x18, 0xaf,
+ 0xc3, 0xc4, 0x52, 0x92, 0x3c, 0x9c, 0x28, 0x8e, 0xbf, 0xf2, 0x22, 0x99,
+ 0xe7, 0xef, 0x8a, 0x59, 0x99, 0x4e, 0x6b, 0x29, 0xcc, 0x2b, 0xf1, 0x7d,
+ 0x4c, 0x16, 0x73, 0x80, 0xc8, 0xd2, 0x06, 0x04, 0xa9, 0xb4, 0xd2, 0xbc,
+ 0xc6, 0xc9, 0x96, 0x16, 0x91, 0xd5, 0x1d, 0xea, 0xb9, 0x49, 0x58, 0x4a,
+ 0xd1, 0x4e, 0xe1, 0x34, 0xde, 0xed, 0x61, 0xcc, 0x0d, 0x40, 0xfb, 0x9d,
+ 0x57, 0xcb, 0xf2, 0x36, 0xa3, 0x08, 0x14, 0x5d, 0x92, 0xd4, 0x5d, 0xbd,
+ 0x90, 0x47, 0x27, 0xff, 0xf3, 0xf8, 0xf7, 0x0c, 0x81, 0x55, 0xe9, 0x9d,
+ 0x4d, 0x6e, 0xf8, 0x9e, 0x59, 0xa5, 0x24, 0x34, 0x65, 0xb3, 0x69, 0xd3,
+ 0x99, 0x58, 0xf1, 0x54, 0x34, 0x17, 0xb7, 0x07, 0x62, 0x9c, 0x52, 0xe3,
+ 0xcd, 0x6c, 0xac, 0x70, 0x6f, 0x53, 0x0a, 0x82, 0x23, 0x13, 0x61, 0x62,
+ 0x53, 0xa0, 0xd2, 0xb1, 0x1e, 0x36, 0x54, 0xc2, 0xf5, 0x7a, 0xd9, 0xbe,
+ 0x87, 0x5b, 0x18, 0x15, 0x32, 0x83, 0x9a, 0x04, 0x05, 0x88, 0x8a, 0xa8,
+ 0x5b, 0xa6, 0xb7, 0x0f, 0x14, 0xd9, 0xf1, 0xf3, 0x01, 0x51, 0x97, 0xb1,
+ 0xca, 0x28, 0x5a, 0x56, 0x25, 0x2f, 0xde, 0x5d, 0x9c, 0xae, 0x48, 0xea,
+ 0x18, 0x61, 0x15, 0x68, 0xba, 0x7a, 0x17, 0x19, 0xe8, 0x48, 0xaa, 0xe4,
+ 0x3c, 0xbd, 0xce, 0x7a, 0x3e, 0xab, 0x4b, 0x8b, 0xd8, 0x49, 0x9c, 0x10,
+ 0x31, 0x4f, 0x91, 0x4f, 0x23, 0x4d, 0x62, 0xdc, 0x45, 0xa9, 0xfd, 0x4c,
+ 0x8c, 0xab, 0x59, 0x2a, 0xb3, 0xb7, 0xac, 0x50, 0x2d, 0xfa, 0xfb, 0x68,
+ 0x2d, 0x06, 0x0b, 0xcc, 0xef, 0x30, 0x72, 0xf9, 0xb8, 0xaa, 0x74, 0x41,
+ 0xbb, 0x28, 0xe9, 0x7d, 0x4e, 0x9e, 0xfa, 0x9e, 0x76, 0x73, 0x90, 0xc5,
+ 0x78, 0x95, 0x79, 0x2a, 0x28, 0x4e, 0xed, 0xbb, 0x94, 0x3a, 0x3e, 0x7e,
+ 0x0e, 0xb6, 0x70, 0x9c, 0x2b, 0x23, 0xd2, 0xb5, 0x3a, 0x56, 0x85, 0x94,
+ 0x93, 0x24, 0x73, 0x24, 0xfb, 0x0a, 0xee, 0x33, 0x4d, 0x4e, 0xa5, 0x7f,
+ 0x07, 0x12, 0x94, 0x61, 0x6d, 0x48, 0xbb, 0xd6, 0x02, 0x2a, 0xc5, 0x06,
+ 0x9b, 0xce, 0x88, 0xe0, 0xdd, 0xba, 0xb2, 0x68, 0x8c, 0xd3, 0x92, 0x38,
+ 0xc1, 0x51, 0x48, 0xb4, 0xb0, 0x7e, 0xe7, 0xd6, 0xca, 0xfe, 0xee, 0x0c,
+ 0x44, 0x2e, 0x50, 0x74, 0xa8, 0x95, 0xe3, 0x07, 0x66, 0x77, 0x14, 0x92,
+ 0xaf, 0xe7, 0x2d, 0xab, 0xb7, 0xf7, 0xfe, 0xa3, 0x1f, 0x25, 0xb2, 0x5e,
+ 0x41, 0xbe, 0xe7, 0x75, 0xb7, 0x01, 0xc6, 0x19, 0x4b, 0x78, 0xd6, 0xef,
+ 0x50, 0x69, 0xbb, 0xb4, 0x1e, 0xb9, 0x2e, 0xa3, 0xbe, 0xc5, 0x81, 0x97,
+ 0xd6, 0x91, 0x1c, 0x71, 0x86, 0xc9, 0xe0, 0x55, 0x6e, 0xee, 0x91, 0x9a,
+ 0xa9, 0x12, 0xd8, 0x31, 0xc0, 0x29, 0x12, 0xee, 0x30, 0x86, 0xd5, 0x52,
+ 0x34, 0x9e, 0x02, 0x24, 0x9d, 0x7d, 0xc5, 0x06, 0x77, 0xcc, 0x9e, 0x58,
+ 0xc5, 0xaa, 0x25, 0xb7, 0xb8, 0xd3, 0x18, 0x52, 0xe7, 0xb2, 0x90, 0xba,
+ 0xa6, 0x6c, 0x5c, 0x6b, 0xda, 0x09, 0xe1, 0x70, 0x22, 0xf3, 0xa3, 0x04,
+ 0x06, 0x0c, 0xe5, 0x41, 0x65, 0xd6, 0x56, 0x5d, 0x81, 0xc0, 0xe0, 0xb4,
+ 0x04, 0x45, 0x8c, 0x3e, 0xe9, 0xfa, 0x81, 0x4d, 0xa7, 0x2c, 0xb5, 0x3b,
+ 0x47, 0x59, 0x98, 0x76, 0x87, 0x53, 0x68, 0x26, 0xa6, 0xd9, 0x61, 0x67,
+ 0x08, 0xca, 0x4a, 0xbf, 0x02, 0x65, 0xd8, 0x1a, 0x18, 0x10, 0x8f, 0xfe,
+ 0xd6, 0xa3, 0x28, 0x42, 0x51, 0x4a, 0x26, 0x7a, 0x2c, 0xa6, 0x0f, 0x38,
+ 0x11, 0x3d, 0xe2, 0xdf, 0x85, 0x8c, 0x20, 0x49, 0xfe, 0x34, 0x70, 0xcc,
+ 0xe0, 0x5b, 0xf7, 0x99, 0xd1, 0xb2, 0x1d, 0x0a, 0x05, 0xc6, 0x54, 0x24,
+ 0x47, 0x25, 0xe1, 0x82, 0x57, 0x75, 0xd9, 0x29, 0x8b, 0x7e, 0xef, 0xc7,
+ 0x20, 0x79, 0xd2, 0x8d, 0x26, 0x40, 0xb4, 0xba, 0xcb, 0x22, 0xfb, 0x48,
+ 0x54, 0x8f, 0xab, 0x9b, 0x0b, 0x15, 0xed, 0xef, 0x0f, 0x2f, 0xde, 0x9e,
+ 0xbc, 0xfd, 0xfa, 0x80, 0xb2, 0xe1, 0xb2, 0x6a, 0x42, 0xd5, 0x19, 0x93,
+ 0xbf, 0x2d, 0xa7, 0xf9, 0x84, 0x65, 0x85, 0x54, 0xbd, 0x6b, 0x51, 0x2d,
+ 0x67, 0xe2, 0x66, 0x35, 0xe2, 0x25, 0x90, 0xef, 0x02, 0x44, 0x25, 0xa2,
+ 0xe8, 0xaa, 0xbc, 0x5e, 0xda, 0xa9, 0x9f, 0x40, 0x1d, 0x41, 0xb0, 0x00,
+ 0x81, 0x54, 0x92, 0x48, 0xbc, 0x69, 0x89, 0x49, 0xc3, 0x28, 0x0b, 0xaf,
+ 0x4e, 0x4f, 0x93, 0x90, 0x63, 0x0f, 0x25, 0x23, 0x95, 0x0c, 0x9c, 0x21,
+ 0x4c, 0x68, 0xc8, 0x6c, 0xff, 0x3a, 0x1f, 0xcf, 0x60, 0x93, 0x91, 0x02,
+ 0xc0, 0xa5, 0x78, 0x3c, 0xb9, 0x67, 0xcc, 0x57, 0xd3, 0x95, 0xee, 0x22,
+ 0x03, 0x23, 0x0b, 0xb4, 0x22, 0x56, 0x38, 0xaf, 0xa6, 0xb0, 0x87, 0x8c,
+ 0x98, 0x2c, 0xaf, 0x1a, 0x52, 0x91, 0x5a, 0xb7, 0x69, 0x9b, 0xe3, 0x7e,
+ 0x5d, 0x24, 0xe1, 0x86, 0x2d, 0x1d, 0x1f, 0x12, 0x21, 0xb1, 0x4b, 0x90,
+ 0x57, 0x99, 0xfd, 0xc8, 0xba, 0x21, 0x6a, 0x23, 0x44, 0xc3, 0x68, 0xd3,
+ 0x2c, 0xb5, 0x25, 0x1f, 0x6b, 0x92, 0x97, 0xa1, 0xc0, 0xb8, 0xcb, 0xaa,
+ 0xcc, 0x95, 0x69, 0x47, 0xaa, 0x93, 0x11, 0x77, 0xc3, 0x64, 0x54, 0x9a,
+ 0xe7, 0x43, 0x2d, 0xcb, 0x96, 0x11, 0x6a, 0x55, 0x24, 0x45, 0x7f, 0x1c,
+ 0xd0, 0x0b, 0x15, 0x16, 0x10, 0x9d, 0x6b, 0x8f, 0x37, 0x52, 0xc2, 0x90,
+ 0xf6, 0xff, 0x38, 0xb3, 0x4a, 0x05, 0x7d, 0x01, 0x11, 0x20, 0xda, 0x21,
+ 0xbd, 0x81, 0x11, 0xa8, 0x3d, 0x9a, 0x59, 0x14, 0x56, 0xf4, 0x5a, 0x7a,
+ 0xa0, 0x3c, 0x98, 0x0f, 0xb3, 0xee, 0x0e, 0x38, 0x5a, 0x74, 0xc5, 0x2b,
+ 0x66, 0x90, 0x8a, 0xed, 0xe9, 0xf9, 0x4f, 0xa5, 0xf6, 0x85, 0x0d, 0xab,
+ 0x32, 0xed, 0x7b, 0x46, 0x5a, 0x66, 0x10, 0x2a, 0x3f, 0x73, 0x15, 0x8d,
+ 0x88, 0x2e, 0xc3, 0xcb, 0xe7, 0xf3, 0x5f, 0x96, 0x0b, 0xa7, 0xef, 0x1c,
+ 0x0c, 0x39, 0x92, 0x56, 0x9a, 0x20, 0x2a, 0x75, 0x35, 0xdc, 0x8e, 0x02,
+ 0x7d, 0xb8, 0x0f, 0x72, 0x27, 0xd5, 0x46, 0xbf, 0x9e, 0x3e, 0x28, 0xf8,
+ 0xb4, 0x6e, 0x4c, 0xf7, 0x96, 0xc6, 0x82, 0x5a, 0xcf, 0x92, 0x36, 0x95,
+ 0x26, 0x5e, 0xb9, 0x6f, 0x3f, 0xa8, 0x29, 0xb1, 0x52, 0xa4, 0x4f, 0x46,
+ 0x9a, 0x93, 0x84, 0x0e, 0x89, 0x59, 0xad, 0x14, 0xc2, 0x12, 0xbf, 0xc9,
+ 0x8b, 0xdb, 0x12, 0xbf, 0x91, 0x98, 0x53, 0x90, 0xe2, 0xeb, 0x93, 0x65,
+ 0xc5, 0x26, 0xc2, 0x9f, 0x55, 0x75, 0xd2, 0x28, 0x0a, 0xde, 0x8c, 0x85,
+ 0xb9, 0xe6, 0xeb, 0xc4, 0x31, 0xca, 0x0b, 0xf4, 0x20, 0x72, 0x35, 0xf2,
+ 0x61, 0xa2, 0xcd, 0xdb, 0xb7, 0x55, 0x32, 0xcd, 0x8b, 0x33, 0xaa, 0xe2,
+ 0xed, 0x71, 0xcc, 0xeb, 0x85, 0x23, 0xf7, 0x4d, 0x6e, 0xfd, 0x3f, 0xab,
+ 0x6f, 0x92, 0x61, 0xbb, 0x06, 0x57, 0xcb, 0x86, 0xa5, 0x48, 0x33, 0x0e,
+ 0x92, 0xa4, 0xc3, 0x94, 0xa5, 0xb0, 0x9d, 0xae, 0x12, 0xb6, 0x09, 0x94,
+ 0x1a, 0x24, 0xee, 0xae, 0xd0, 0x20, 0xda, 0xc5, 0x97, 0x24, 0x5b, 0xa1,
+ 0x7b, 0xf6, 0x3c, 0x52, 0xa4, 0x16, 0x21, 0x59, 0xfb, 0x6e, 0xe3, 0xfe,
+ 0xd8, 0xcb, 0x39, 0xb1, 0xe5, 0x3a, 0x62, 0x30, 0x07, 0xbe, 0xba, 0xe3,
+ 0xd3, 0x23, 0x50, 0x4f, 0x7f, 0x52, 0xa2, 0x97, 0x1d, 0x83, 0x3f, 0x1d,
+ 0x73, 0x25, 0x76, 0x0d, 0x4c, 0xa7, 0xa2, 0x1d, 0xd6, 0x40, 0x4f, 0xf3,
+ 0x06, 0x02, 0xe4, 0x4f, 0xfb, 0xbb, 0xab, 0x84, 0x3c, 0x35, 0xa4, 0x45,
+ 0x13, 0xe8, 0x34, 0xd6, 0xd6, 0x06, 0xc3, 0x35, 0xe8, 0xb2, 0x63, 0xe9,
+ 0x0e, 0x59, 0x2e, 0xc8, 0x57, 0x37, 0xa0, 0xfd, 0x92, 0xd6, 0xab, 0xe6,
+ 0x7f, 0xf8, 0xaf, 0xa8, 0xe6, 0xe3, 0xe4, 0xd7, 0x85, 0xb7, 0xc6, 0xd4,
+ 0x50, 0x0c, 0xf1, 0xa6, 0xb2, 0x44, 0x7d, 0x25, 0x9e, 0xda, 0xee, 0x74,
+ 0x06, 0xd8, 0xf6, 0x28, 0xdb, 0x22, 0x87, 0x93, 0x5a, 0x0b, 0x4d, 0xd8,
+ 0x74, 0xbe, 0x70, 0x85, 0x78, 0xf4, 0x78, 0x09, 0x32, 0x47, 0x4f, 0x81,
+ 0x82, 0x5a, 0x2c, 0x70, 0x97, 0xbf, 0x18, 0x6e, 0x5a, 0x4f, 0x94, 0xb2,
+ 0x49, 0x9e, 0x0a, 0x82, 0x14, 0x53, 0x42, 0xdf, 0x6a, 0x5f, 0x8d, 0x00,
+ 0xa7, 0x0d, 0xa2, 0x3e, 0xff, 0x28, 0x09, 0xb5, 0x00, 0xda, 0x7d, 0x96,
+ 0xda, 0x1e, 0xbf, 0xdd, 0x4b, 0xb6, 0x48, 0xae, 0x6e, 0x5b, 0xed, 0x35,
+ 0x8c, 0xf7, 0x2b, 0x0b, 0x37, 0xdb, 0x31, 0x29, 0xdf, 0x91, 0x5d, 0x3c,
+ 0x2f, 0x69, 0xb0, 0xc6, 0xd2, 0xab, 0x8c, 0x06, 0xb0, 0x9c, 0xa5, 0x15,
+ 0x20, 0x7b, 0xd9, 0xd5, 0x72, 0x16, 0x33, 0x75, 0xe8, 0x74, 0x4b, 0x90,
+ 0x28, 0xaf, 0xeb, 0xa5, 0x18, 0x82, 0x36, 0xf7, 0xd9, 0x72, 0x23, 0x25,
+ 0x33, 0xd3, 0x1f, 0x7c, 0xba, 0x9e, 0x11, 0x0a, 0x65, 0xa5, 0x82, 0x02,
+ 0x1f, 0xb1, 0xd6, 0xe5, 0x14, 0x2d, 0x53, 0x6c, 0x29, 0xb9, 0x52, 0xae,
+ 0xa9, 0x53, 0xd8, 0xe4, 0x0b, 0xd4, 0x44, 0x32, 0x7a, 0x14, 0xdd, 0x56,
+ 0x9d, 0xe6, 0x7a, 0x67, 0xe7, 0x97, 0x27, 0x67, 0x6f, 0x47, 0xc9, 0x9f,
+ 0x7b, 0x6b, 0x13, 0x94, 0xda, 0x64, 0x8a, 0x3f, 0xf4, 0xdd, 0x9a, 0x24,
+ 0x2f, 0xc4, 0xdb, 0xb0, 0xca, 0x3e, 0xf6, 0xd4, 0xf8, 0x89, 0xb9, 0xbf,
+ 0x8d, 0x84, 0xd5, 0x37, 0x85, 0x85, 0x46, 0x56, 0xab, 0x93, 0x71, 0x19,
+ 0xe8, 0xcb, 0x34, 0x2b, 0x6d, 0x0c, 0xa3, 0x8d, 0xe6, 0x5f, 0xb6, 0x10,
+ 0xb6, 0x9d, 0xe6, 0xe3, 0x32, 0x58, 0x64, 0x5f, 0x0b, 0x5d, 0x2a, 0x2f,
+ 0xb8, 0xb2, 0xe1, 0x62, 0x45, 0x6f, 0xb1, 0xd4, 0x54, 0x55, 0xab, 0x8e,
+ 0xa0, 0x09, 0xbf, 0x3e, 0xbe, 0x24, 0x57, 0xcd, 0x05, 0x8c, 0x21, 0xdb,
+ 0x41, 0x38, 0xbc, 0x44, 0xf5, 0x49, 0xad, 0x7a, 0x26, 0xe4, 0x95, 0x5c,
+ 0xee, 0xf6, 0xe3, 0x62, 0x96, 0x16, 0xd1, 0x24, 0x2c, 0xa3, 0xd3, 0x52,
+ 0x05, 0xdf, 0xd2, 0xd1, 0xd4, 0xa9, 0x07, 0xc5, 0xa3, 0x49, 0x67, 0xfe,
+ 0x88, 0xf3, 0x77, 0x97, 0xe2, 0xad, 0x7a, 0x75, 0x7c, 0x7a, 0x7c, 0x79,
+ 0xdc, 0xb5, 0xde, 0xc7, 0x4c, 0xbb, 0x85, 0xec, 0x9b, 0x26, 0x9b, 0xdc,
+ 0x14, 0xe5, 0xac, 0xbc, 0xce, 0xa5, 0x88, 0x59, 0xf2, 0x7d, 0x36, 0x7e,
+ 0x75, 0xf8, 0x1d, 0x69, 0x14, 0xe4, 0x79, 0x3a, 0xbf, 0x38, 0x3b, 0x7f,
+ 0x7d, 0xf2, 0xf6, 0x55, 0x3f, 0x39, 0x3a, 0x3b, 0xff, 0x6b, 0x3f, 0x79,
+ 0x73, 0xf6, 0xdd, 0x71, 0x04, 0x75, 0x4d, 0xbc, 0xb5, 0x91, 0x22, 0xca,
+ 0x52, 0x4a, 0xc8, 0x19, 0xdf, 0x05, 0x07, 0x2e, 0xbc, 0x6b, 0xe4, 0x10,
+ 0xe8, 0x11, 0x54, 0x04, 0xc7, 0x59, 0x33, 0x53, 0x67, 0xe4, 0xc7, 0x37,
+ 0xc7, 0x87, 0xaf, 0xfa, 0x01, 0x69, 0x29, 0x71, 0x9f, 0x9b, 0x8f, 0xd1,
+ 0xf8, 0xec, 0xa0, 0x41, 0x75, 0xc9, 0xf6, 0x07, 0x74, 0x04, 0x0e, 0x75,
+ 0xf1, 0x89, 0x35, 0x1b, 0x16, 0x85, 0x5f, 0xa6, 0xab, 0x10, 0x14, 0x42,
+ 0x92, 0xbb, 0xb2, 0x6c, 0xa0, 0x97, 0x09, 0x42, 0xea, 0x9a, 0x2a, 0xda,
+ 0x52, 0xe4, 0x95, 0x79, 0x25, 0x12, 0x80, 0xfd, 0x65, 0x6f, 0xd8, 0x32,
+ 0x4b, 0x11, 0x9e, 0x0e, 0xe9, 0x32, 0xb3, 0x3e, 0x5b, 0x46, 0x55, 0x88,
+ 0x24, 0xf6, 0x41, 0xa6, 0x52, 0x74, 0x09, 0x04, 0xf5, 0x04, 0x03, 0x1a,
+ 0x31, 0xb7, 0xa7, 0x50, 0xda, 0xc5, 0xd3, 0x1b, 0x54, 0xcd, 0x16, 0x06,
+ 0x55, 0xe1, 0x98, 0xa0, 0xf9, 0x73, 0x1f, 0xd4, 0x2a, 0x02, 0x3f, 0xf0,
+ 0xc4, 0x46, 0x71, 0xd7, 0x5c, 0x06, 0xe5, 0xca, 0x6c, 0xcd, 0x8c, 0x01,
+ 0x56, 0xbc, 0x54, 0xd6, 0x3d, 0x90, 0x0c, 0x4e, 0xd4, 0x39, 0xb1, 0x4e,
+ 0xcd, 0xb2, 0x5c, 0x52, 0xe2, 0xa0, 0x61, 0x66, 0x0b, 0xf5, 0x5d, 0xb5,
+ 0x45, 0x85, 0xef, 0x29, 0xa1, 0x81, 0x46, 0xb4, 0x7e, 0x5d, 0x66, 0x25,
+ 0x5e, 0x90, 0x41, 0x7b, 0xb3, 0xc2, 0x39, 0x88, 0x81, 0x4f, 0x2b, 0x2c,
+ 0x0d, 0x2e, 0xfc, 0x63, 0x46, 0x9c, 0x14, 0xe2, 0x1b, 0x4d, 0x28, 0x08,
+ 0x37, 0x60, 0x8b, 0xda, 0x47, 0x09, 0xab, 0x04, 0x15, 0x0d, 0x55, 0xfa,
+ 0x10, 0xaf, 0x75, 0xdb, 0x2a, 0x15, 0x69, 0x4f, 0xfa, 0x93, 0xdd, 0x8f,
+ 0xce, 0xdb, 0x4e, 0x3a, 0x45, 0x9d, 0x0c, 0x84, 0x41, 0x74, 0x6e, 0x2e,
+ 0xc2, 0xd0, 0xcf, 0xb4, 0xf5, 0x7a, 0x85, 0x70, 0xf4, 0xfd, 0xb7, 0xb2,
+ 0x18, 0x9e, 0x98, 0x3a, 0x3d, 0x31, 0x47, 0x22, 0x92, 0xc6, 0x3f, 0x2d,
+ 0x51, 0x10, 0x11, 0xd0, 0x04, 0x68, 0x57, 0x98, 0x7d, 0xd3, 0x56, 0xf8,
+ 0x61, 0xaa, 0x10, 0x1a, 0xfd, 0x32, 0x4a, 0x87, 0x3e, 0xf0, 0xe9, 0x60,
+ 0xcd, 0x2e, 0x8e, 0x2f, 0x2f, 0x86, 0xc9, 0x96, 0xcf, 0x50, 0xf7, 0x7c,
+ 0xb8, 0x1b, 0x86, 0x6f, 0xa8, 0x38, 0x69, 0xf4, 0xab, 0xa8, 0x5a, 0xba,
+ 0xe2, 0xab, 0x90, 0x0f, 0xf4, 0xdd, 0x10, 0x77, 0xec, 0xb1, 0x52, 0xec,
+ 0xc6, 0xbe, 0xe7, 0x97, 0x40, 0x6d, 0x7d, 0x8f, 0x7e, 0xb1, 0x66, 0x94,
+ 0xdf, 0x1c, 0x9f, 0x46, 0xa8, 0xf7, 0xbf, 0xbb, 0x78, 0xfd, 0xd7, 0xf6,
+ 0x28, 0x9f, 0x3c, 0x8d, 0x7c, 0xf5, 0xb7, 0x74, 0xad, 0x67, 0x75, 0x39,
+ 0x33, 0x4a, 0x0b, 0x92, 0x4b, 0x90, 0x5b, 0x72, 0x60, 0xae, 0x01, 0xc2,
+ 0xa6, 0x7f, 0x11, 0x32, 0xab, 0xc2, 0x39, 0x63, 0x47, 0x28, 0xcf, 0x89,
+ 0xe9, 0xed, 0x6c, 0x6f, 0xce, 0xe0, 0xe1, 0x7b, 0x82, 0x93, 0x4d, 0x16,
+ 0x69, 0x1e, 0xf8, 0xa1, 0xdf, 0xa9, 0xea, 0x93, 0x53, 0x5a, 0x8e, 0xf5,
+ 0x14, 0xab, 0x1a, 0xa7, 0xa4, 0x25, 0x7c, 0x4a, 0xb7, 0xea, 0x6d, 0xa9,
+ 0x1d, 0xbf, 0x2a, 0xba, 0xaf, 0x9d, 0x41, 0xa2, 0x14, 0x55, 0x70, 0x16,
+ 0x33, 0xc7, 0x5d, 0xb2, 0x85, 0x5e, 0x1a, 0x32, 0xe4, 0xa9, 0x7b, 0x29,
+ 0xbc, 0x67, 0xc7, 0x72, 0x29, 0x0f, 0xe1, 0x9c, 0x44, 0x4c, 0x1d, 0x96,
+ 0x17, 0x2e, 0x14, 0xd4, 0xc0, 0xcb, 0x9a, 0xc9, 0x0e, 0x57, 0xb8, 0xf7,
+ 0x75, 0xbf, 0x15, 0x6e, 0xaf, 0xb2, 0x68, 0x41, 0x1e, 0xe9, 0x72, 0x60,
+ 0xaf, 0xb3, 0x9f, 0x7c, 0xe8, 0xaa, 0x26, 0xb0, 0x17, 0x49, 0x32, 0x74,
+ 0xa8, 0x1b, 0x91, 0xf0, 0x7b, 0xbb, 0x50, 0x81, 0x97, 0x10, 0xa9, 0x55,
+ 0xe4, 0x03, 0x29, 0xe8, 0x92, 0xe6, 0x22, 0x4e, 0x15, 0x08, 0x65, 0xdd,
+ 0x40, 0x96, 0x22, 0xb5, 0x7d, 0x13, 0xa8, 0x7b, 0xce, 0x5f, 0xf8, 0x98,
+ 0x83, 0x97, 0xd4, 0x6b, 0xf4, 0x80, 0xf9, 0x4e, 0xd5, 0x84, 0x5f, 0xa0,
+ 0xf2, 0xf5, 0x8a, 0xc4, 0x2f, 0x56, 0x79, 0xb5, 0x65, 0x92, 0xeb, 0x6d,
+ 0x9e, 0xea, 0xf6, 0x68, 0xd4, 0xf9, 0x3e, 0x78, 0x1a, 0x06, 0x10, 0xf2,
+ 0xc5, 0xed, 0x53, 0x78, 0x6c, 0x9e, 0xf7, 0xf9, 0x5f, 0xcf, 0x99, 0xb7,
+ 0xa9, 0x69, 0x87, 0x13, 0x58, 0x71, 0x67, 0x35, 0xf7, 0xe4, 0x5c, 0x13,
+ 0x4d, 0x03, 0x76, 0x65, 0x89, 0xbc, 0x49, 0x4a, 0xbb, 0xe9, 0xa5, 0xa6,
+ 0x8e, 0x99, 0x77, 0xb4, 0xb7, 0x24, 0x03, 0xcd, 0x61, 0xfd, 0x71, 0x5c,
+ 0x51, 0xe9, 0xaf, 0xa6, 0xfe, 0x79, 0x5d, 0x4e, 0xaf, 0x51, 0x72, 0x3f,
+ 0x19, 0xae, 0x48, 0x0e, 0xb5, 0x24, 0x15, 0x88, 0x99, 0xe8, 0x1e, 0xf4,
+ 0x4d, 0x38, 0x72, 0x0f, 0x4d, 0xe5, 0x27, 0x98, 0x62, 0x01, 0x1b, 0x95,
+ 0x81, 0x4a, 0x80, 0x3d, 0xbe, 0x96, 0xa8, 0x79, 0x6f, 0xf8, 0xa4, 0x2d,
+ 0x09, 0x9a, 0xea, 0x1e, 0x09, 0x29, 0xc6, 0xbc, 0x8f, 0x6c, 0xba, 0x93,
+ 0xa2, 0x63, 0xb2, 0xcb, 0xe1, 0xa2, 0xe0, 0x1a, 0xff, 0xd8, 0x1c, 0x64,
+ 0x05, 0xa0, 0x24, 0xc7, 0x94, 0x34, 0x73, 0x71, 0xfc, 0xfa, 0xdd, 0xe8,
+ 0xf8, 0x55, 0x92, 0x46, 0xea, 0xf2, 0x21, 0xee, 0x96, 0xc3, 0xb5, 0xc3,
+ 0xee, 0x6d, 0xd3, 0x68, 0xc9, 0x5b, 0x5b, 0xfa, 0x12, 0x14, 0x32, 0x12,
+ 0x90, 0x8a, 0xb1, 0xad, 0xc2, 0x2c, 0x07, 0xd6, 0x02, 0xe4, 0xc5, 0x5f,
+ 0xc0, 0xbd, 0xc0, 0xa3, 0x9e, 0x66, 0x54, 0x77, 0xe1, 0x05, 0xa3, 0x29,
+ 0x02, 0xc9, 0xf7, 0xc6, 0x6e, 0x9a, 0x7a, 0x96, 0x65, 0x0b, 0xc9, 0x64,
+ 0x9b, 0x97, 0xcb, 0x82, 0x5d, 0x6b, 0x66, 0x65, 0xd4, 0x9b, 0xc4, 0xee,
+ 0xcb, 0x04, 0xad, 0x6a, 0xf8, 0x29, 0x3a, 0x72, 0x54, 0x77, 0x20, 0xcf,
+ 0x01, 0x40, 0xcc, 0x2e, 0x86, 0x96, 0x46, 0x66, 0x66, 0x2b, 0x6f, 0x7c,
+ 0x57, 0xec, 0x8a, 0x2a, 0x22, 0x54, 0x77, 0xce, 0xe8, 0xd6, 0xdc, 0x9d,
+ 0x74, 0x76, 0x5d, 0x56, 0xa6, 0xc1, 0xb9, 0x4d, 0xbf, 0xab, 0x00, 0x9e,
+ 0xa9, 0xb7, 0xdb, 0xb3, 0x1a, 0x26, 0x32, 0x33, 0xa8, 0x1f, 0xa1, 0xd4,
+ 0x8c, 0x13, 0x93, 0xe9, 0x9c, 0xf1, 0x3c, 0xc1, 0xe2, 0xa6, 0x20, 0x13,
+ 0x8b, 0xc6, 0x91, 0xa4, 0x12, 0x63, 0x3e, 0x78, 0x0a, 0x83, 0x8d, 0xf8,
+ 0x8f, 0xac, 0x2a, 0xbb, 0x2e, 0x01, 0x55, 0xfc, 0x62, 0x3d, 0xff, 0x57,
+ 0x96, 0xea, 0xd8, 0xdb, 0x8f, 0x9d, 0x80, 0x79, 0xfa, 0x11, 0x6e, 0x8e,
+ 0x95, 0xdb, 0x81, 0x9d, 0x7e, 0x34, 0x1d, 0xf4, 0x18, 0x10, 0x12, 0xc4,
+ 0x87, 0xdf, 0xd8, 0xf2, 0x8b, 0x0a, 0xee, 0x45, 0xf1, 0x1e, 0xb7, 0xda,
+ 0xe2, 0x09, 0x09, 0xd0, 0x44, 0xbc, 0x30, 0xb6, 0xd7, 0xf0, 0x35, 0xa5,
+ 0x34, 0x4c, 0x32, 0x02, 0xb6, 0xb8, 0x20, 0x01, 0xbe, 0xb7, 0x4d, 0x3f,
+ 0x9e, 0x95, 0x14, 0xe9, 0x62, 0x4f, 0x0e, 0xbe, 0x1f, 0xd6, 0x11, 0x25,
+ 0x15, 0xb3, 0xa2, 0x8d, 0xa8, 0x26, 0x11, 0xfb, 0x15, 0xc1, 0xac, 0x8e,
+ 0xd4, 0xa4, 0x7c, 0x22, 0x5e, 0x73, 0x2d, 0xbd, 0x81, 0x71, 0xf0, 0x9b,
+ 0x81, 0x20, 0xe1, 0x76, 0x94, 0x23, 0xdc, 0x34, 0xd1, 0x6f, 0x93, 0x08,
+ 0x4a, 0xb7, 0x91, 0xfb, 0x87, 0x64, 0x91, 0x1b, 0xf8, 0x9d, 0x39, 0xf1,
+ 0x3b, 0x62, 0x5d, 0xf7, 0x95, 0xcd, 0x1d, 0x89, 0x34, 0x34, 0x1c, 0x98,
+ 0x29, 0x69, 0xe1, 0xf7, 0x15, 0x0b, 0x60, 0xda, 0xc8, 0xcb, 0x29, 0x52,
+ 0x70, 0x98, 0x15, 0x3e, 0xac, 0x6d, 0x25, 0xc5, 0x82, 0xa5, 0x33, 0x14,
+ 0xa7, 0x32, 0xcb, 0x97, 0xcf, 0x97, 0x73, 0x76, 0x2e, 0xf5, 0x39, 0xd0,
+ 0x33, 0x98, 0xd3, 0x55, 0xa0, 0x0b, 0x0b, 0xa4, 0x1a, 0x03, 0x7b, 0xba,
+ 0x7b, 0xdf, 0x86, 0x2e, 0xb1, 0x6d, 0xa5, 0x04, 0x2e, 0xbd, 0xc3, 0x84,
+ 0xd2, 0x58, 0xa8, 0xff, 0xe3, 0x3b, 0x34, 0x79, 0x61, 0x54, 0x83, 0x2f,
+ 0xc2, 0x4e, 0xa4, 0x9e, 0xe4, 0x60, 0xc1, 0x81, 0x9d, 0x49, 0x88, 0xd9,
+ 0x6c, 0xea, 0x59, 0x21, 0xbc, 0xdd, 0xe0, 0xec, 0x95, 0x55, 0x5a, 0x2d,
+ 0xa3, 0xa4, 0x92, 0x10, 0xfa, 0x2b, 0x7b, 0x9e, 0x86, 0xea, 0x5c, 0x88,
+ 0x7c, 0x2d, 0xc9, 0xc6, 0xbf, 0xe6, 0x4a, 0xa3, 0xcb, 0x45, 0x70, 0x8d,
+ 0x5a, 0x49, 0x61, 0xdd, 0x8f, 0xe6, 0xf3, 0xbb, 0x82, 0xad, 0x10, 0xdb,
+ 0x88, 0xbc, 0xae, 0x32, 0xc7, 0xd6, 0x15, 0x92, 0xd7, 0xc9, 0x6a, 0x91,
+ 0x47, 0x9e, 0x90, 0xcb, 0xe0, 0x1a, 0x61, 0x5a, 0x00, 0xe6, 0x83, 0x39,
+ 0xa0, 0x49, 0xe1, 0xe5, 0xeb, 0x6b, 0xe6, 0xd7, 0xd3, 0x8f, 0x1f, 0xc3,
+ 0xcb, 0xd2, 0x19, 0x54, 0x5c, 0x06, 0x97, 0xad, 0xad, 0x67, 0x1f, 0x3b,
+ 0xd6, 0xd6, 0x30, 0x5a, 0xac, 0x56, 0x33, 0x40, 0xd3, 0x71, 0xc9, 0x11,
+ 0x1c, 0x9e, 0xa9, 0xd4, 0x9b, 0x45, 0x75, 0x42, 0x8b, 0x50, 0xb8, 0x4b,
+ 0xf3, 0x68, 0x39, 0x1a, 0x81, 0xf3, 0x79, 0x35, 0xbc, 0x34, 0xce, 0x66,
+ 0xfe, 0x6c, 0x6e, 0x8c, 0xfe, 0x48, 0xb3, 0xa8, 0x93, 0xa4, 0x8d, 0x4e,
+ 0xcb, 0x25, 0xc7, 0xc1, 0xb2, 0x20, 0xb0, 0x92, 0xf3, 0xb4, 0xd3, 0x69,
+ 0x32, 0xb7, 0x55, 0x8e, 0xb2, 0xc8, 0x7c, 0xa4, 0xeb, 0x64, 0xcf, 0xcc,
+ 0x7f, 0x5e, 0x2c, 0x09, 0xd2, 0xe7, 0x91, 0x0f, 0xea, 0xd6, 0x8c, 0x4e,
+ 0x3b, 0xaa, 0x13, 0xe9, 0x8d, 0x22, 0x62, 0xa0, 0xf6, 0xe2, 0x4b, 0x7c,
+ 0x40, 0x50, 0x81, 0x43, 0x0a, 0xbf, 0xf9, 0x17, 0x6c, 0x44, 0xed, 0xb4,
+ 0x41, 0x3c, 0x61, 0x75, 0xcc, 0x3e, 0x9a, 0xc9, 0x66, 0x7e, 0xf7, 0xc4,
+ 0xde, 0x0b, 0xee, 0x36, 0x1b, 0xfa, 0x85, 0xbc, 0x23, 0xd0, 0x91, 0x96,
+ 0xfc, 0xb6, 0xc5, 0x24, 0x20, 0xe2, 0xca, 0x46, 0xce, 0x22, 0xa7, 0x13,
+ 0x4b, 0xb4, 0xf1, 0xbf, 0xc1, 0x99, 0xae, 0xd3, 0x7a, 0x36, 0xc8, 0xbb,
+ 0x62, 0xfc, 0x18, 0x80, 0x34, 0x0b, 0x26, 0xb1, 0xbb, 0xd0, 0x34, 0x31,
+ 0x3a, 0x1c, 0x9d, 0x76, 0x88, 0x8c, 0xd6, 0xb2, 0x29, 0xee, 0xb5, 0x35,
+ 0x9e, 0x47, 0x12, 0xa6, 0x69, 0x04, 0xa1, 0x95, 0x24, 0xbc, 0x8e, 0x2b,
+ 0x8d, 0x29, 0xf8, 0x56, 0x55, 0x84, 0xa9, 0x0f, 0xf8, 0xeb, 0x8e, 0x59,
+ 0x2e, 0xec, 0x0c, 0x33, 0xf2, 0x10, 0xca, 0x83, 0x6b, 0xf7, 0xc4, 0x68,
+ 0x5d, 0xf0, 0xc4, 0x8e, 0x60, 0x48, 0x1e, 0x0a, 0xc4, 0x32, 0x07, 0x9b,
+ 0x8e, 0x7c, 0x44, 0x97, 0x00, 0xd5, 0x9f, 0x1a, 0xc4, 0xe8, 0x67, 0x6c,
+ 0x18, 0x43, 0x54, 0xc9, 0x1a, 0x4f, 0x13, 0x9e, 0xa4, 0x91, 0x1b, 0xcb,
+ 0x8a, 0x2a, 0x6a, 0xc3, 0xc1, 0x32, 0x88, 0xcf, 0x34, 0x64, 0x3f, 0xe5,
+ 0x48, 0xdd, 0x15, 0x57, 0x0f, 0xd2, 0x1e, 0x78, 0x6d, 0x76, 0x05, 0x24,
+ 0x7e, 0xc8, 0xe0, 0xe3, 0xbf, 0x2f, 0x73, 0x52, 0x26, 0x28, 0x79, 0x67,
+ 0x98, 0xbc, 0x62, 0x68, 0x91, 0x54, 0xe1, 0xe1, 0x9a, 0x5c, 0xa8, 0xdb,
+ 0x45, 0x8f, 0xda, 0x0e, 0x04, 0x41, 0x14, 0xd3, 0x21, 0x3a, 0x87, 0x6f,
+ 0xd0, 0xe9, 0x23, 0xea, 0xf4, 0xdc, 0x1c, 0x74, 0x58, 0x80, 0x5c, 0x79,
+ 0xbd, 0x01, 0x98, 0x44, 0x62, 0xce, 0x0a, 0x06, 0x17, 0xea, 0xd9, 0xfa,
+ 0x43, 0x68, 0x6f, 0xf6, 0x5b, 0x85, 0x17, 0x60, 0x7f, 0x89, 0x11, 0xd0,
+ 0x50, 0xdd, 0x8e, 0x22, 0x9d, 0xed, 0xd4, 0xcd, 0x94, 0xe4, 0xdf, 0xb2,
+ 0x98, 0x51, 0x27, 0xa9, 0x29, 0x2d, 0x32, 0xd3, 0x9d, 0x9b, 0x26, 0x46,
+ 0x72, 0x12, 0x2c, 0x10, 0x7c, 0x9e, 0xd6, 0xe4, 0x90, 0xc4, 0x17, 0xdf,
+ 0x4a, 0xa2, 0x9f, 0x88, 0xfc, 0x08, 0xc9, 0x6c, 0xfc, 0xa9, 0x22, 0x3b,
+ 0x94, 0x47, 0x8c, 0x89, 0x6c, 0xad, 0xdb, 0xba, 0x9c, 0xfb, 0x5b, 0xea,
+ 0x90, 0xd9, 0x68, 0xe3, 0xb2, 0x56, 0x26, 0x44, 0x33, 0x48, 0xf3, 0x7a,
+ 0xeb, 0x3c, 0x81, 0x3a, 0xea, 0x17, 0xb2, 0x73, 0x70, 0xbd, 0x3f, 0x8f,
+ 0x9b, 0x63, 0x5d, 0x99, 0xbf, 0xb0, 0x48, 0xe2, 0x2f, 0x26, 0xe6, 0x88,
+ 0x31, 0x0f, 0x91, 0x0d, 0x69, 0xc1, 0x73, 0x82, 0x87, 0x69, 0x31, 0x54,
+ 0xc0, 0x6e, 0xa3, 0xf8, 0x64, 0xa4, 0x28, 0x8e, 0xd9, 0x4e, 0x4b, 0x49,
+ 0xb6, 0x9f, 0xcc, 0x8c, 0xac, 0x8f, 0xd8, 0x9a, 0x5a, 0x13, 0x89, 0xe8,
+ 0xab, 0xfa, 0x5d, 0x71, 0x5a, 0x2f, 0x49, 0xf7, 0x98, 0x2d, 0xe9, 0xdb,
+ 0xcc, 0xfc, 0x64, 0x99, 0x87, 0x34, 0x47, 0x38, 0xca, 0xd6, 0x65, 0xa9,
+ 0x83, 0xe8, 0x8c, 0x7a, 0xc4, 0x65, 0x4b, 0x2d, 0x9f, 0xa6, 0x9c, 0x5e,
+ 0x5d, 0x6e, 0x97, 0xe1, 0x8a, 0xde, 0x91, 0x41, 0xd8, 0xf7, 0x4b, 0x82,
+ 0xfa, 0x41, 0x6b, 0xca, 0x88, 0xd0, 0xee, 0xb4, 0xea, 0x7d, 0xa6, 0x51,
+ 0x36, 0x26, 0x78, 0x3e, 0xf8, 0x92, 0xf1, 0xfb, 0xa6, 0xb7, 0x87, 0xa6,
+ 0xcd, 0x02, 0xa4, 0xdc, 0xaa, 0xb2, 0x79, 0xd2, 0xf5, 0xb3, 0x06, 0xb5,
+ 0x40, 0x59, 0x71, 0xb0, 0x05, 0x3d, 0xe5, 0xec, 0xb5, 0xba, 0xc4, 0xd4,
+ 0x2a, 0x45, 0x0c, 0xec, 0xfa, 0x98, 0x2a, 0xa0, 0xad, 0xba, 0x9f, 0xff,
+ 0xca, 0xfb, 0xf0, 0x59, 0xbb, 0x3e, 0x86, 0x50, 0xb1, 0xfd, 0xaa, 0x03,
+ 0x95, 0x3e, 0xee, 0x44, 0xad, 0x00, 0xa6, 0xff, 0xdf, 0x79, 0xa2, 0xd2,
+ 0xc7, 0x1d, 0xa9, 0xb4, 0x75, 0xa6, 0x56, 0xd4, 0x6e, 0x5d, 0xd9, 0xe3,
+ 0xdf, 0xf0, 0x94, 0xd9, 0xe8, 0xfd, 0x63, 0xcf, 0x98, 0xee, 0x89, 0xff,
+ 0xbb, 0x4f, 0xd9, 0xa7, 0x1d, 0x2d, 0x10, 0xbc, 0x86, 0x8f, 0x2c, 0x43,
+ 0x43, 0x68, 0x62, 0xd2, 0xb5, 0x76, 0x2c, 0x05, 0x59, 0x9c, 0xc5, 0x98,
+ 0xb9, 0x6c, 0x62, 0x01, 0x75, 0xc0, 0xda, 0x30, 0x21, 0xcf, 0xec, 0x72,
+ 0x68, 0x92, 0xee, 0xda, 0x96, 0x03, 0x1b, 0x5d, 0x39, 0x40, 0xfd, 0xaa,
+ 0xd8, 0x43, 0x11, 0x09, 0x6e, 0x5c, 0xd7, 0xe6, 0x6e, 0x5f, 0xe4, 0xac,
+ 0x22, 0x18, 0xed, 0x85, 0x48, 0xf4, 0xbf, 0x1e, 0x8d, 0x06, 0x87, 0xe7,
+ 0x27, 0xdd, 0x93, 0xd7, 0xfe, 0x9c, 0x96, 0xe2, 0x7d, 0xb6, 0xb2, 0x2a,
+ 0xcd, 0x6a, 0xb4, 0x42, 0xfb, 0xdb, 0x46, 0xd3, 0xed, 0x4e, 0xec, 0x61,
+ 0x9d, 0xb4, 0xf0, 0x78, 0xd2, 0x23, 0x9f, 0x51, 0x58, 0xa8, 0x30, 0x39,
+ 0xa7, 0x8e, 0x13, 0xbc, 0x49, 0x6e, 0xe1, 0x81, 0x00, 0xbc, 0x08, 0xca,
+ 0x0a, 0xe2, 0x9a, 0xd8, 0xfb, 0xec, 0xf9, 0x9e, 0x39, 0x17, 0xf7, 0xcc,
+ 0xd7, 0x26, 0x2f, 0x3f, 0x1d, 0x3e, 0xd9, 0xa1, 0x7a, 0xe8, 0x79, 0xa3,
+ 0x91, 0x05, 0x98, 0x75, 0xd2, 0xbc, 0x91, 0x77, 0x91, 0xe0, 0x3d, 0x5f,
+ 0x63, 0x6f, 0x8f, 0x8f, 0x12, 0xc6, 0x78, 0x81, 0xc0, 0x2b, 0x41, 0xc6,
+ 0x09, 0xa5, 0xaf, 0x48, 0x08, 0x14, 0x21, 0x66, 0x12, 0xa6, 0xb2, 0x88,
+ 0xbc, 0x5d, 0x03, 0x73, 0x2c, 0x98, 0x0e, 0x35, 0x26, 0x90, 0xe1, 0x5d,
+ 0xd8, 0x8e, 0x90, 0xc0, 0x63, 0xbb, 0x42, 0xe6, 0x85, 0xfa, 0x18, 0xa6,
+ 0x6b, 0x78, 0x53, 0xf2, 0x48, 0x0a, 0x66, 0x2a, 0xc6, 0xb8, 0x7a, 0x7d,
+ 0xd4, 0x80, 0x59, 0x61, 0x02, 0x39, 0xf7, 0x64, 0x60, 0xe9, 0x88, 0x48,
+ 0x54, 0x84, 0x1a, 0x79, 0x59, 0x26, 0x73, 0x6b, 0x94, 0x5c, 0xfd, 0x7d,
+ 0x5a, 0x0c, 0x7f, 0xa9, 0x45, 0x15, 0x51, 0x89, 0x3d, 0xc3, 0x49, 0xbb,
+ 0x2e, 0xa2, 0x4c, 0xac, 0xa5, 0x55, 0x03, 0x12, 0x23, 0xa9, 0xeb, 0x0b,
+ 0xe0, 0x2d, 0xb0, 0x94, 0x72, 0xd9, 0xd3, 0x1d, 0xaf, 0x29, 0xdb, 0x7e,
+ 0xe4, 0x67, 0xda, 0x7a, 0x04, 0xc5, 0x4f, 0x1f, 0xe3, 0xb6, 0xaa, 0x2c,
+ 0x9d, 0x49, 0xaf, 0xbc, 0xef, 0x84, 0xbf, 0x44, 0xc4, 0x88, 0xc4, 0x6d,
+ 0x1d, 0xa2, 0x97, 0x84, 0xa1, 0xc6, 0xeb, 0x82, 0x85, 0x32, 0xcc, 0xd3,
+ 0x66, 0xa2, 0xf4, 0x6e, 0xe6, 0x42, 0xc9, 0x17, 0xe9, 0x2c, 0x79, 0x04,
+ 0x08, 0x77, 0xf5, 0xe2, 0x3f, 0x86, 0xb2, 0x5d, 0x4f, 0xe7, 0x1a, 0x51,
+ 0xa7, 0x1c, 0x2a, 0xb1, 0x32, 0xe1, 0x6d, 0x39, 0xb7, 0xa2, 0x31, 0x4a,
+ 0x33, 0x16, 0x79, 0xe6, 0x89, 0xb3, 0x6e, 0x8c, 0xd9, 0xd8, 0x92, 0xd6,
+ 0xc7, 0x34, 0x29, 0xe7, 0x0b, 0xc4, 0x0b, 0x70, 0xd1, 0x69, 0xb3, 0x92,
+ 0x20, 0xb6, 0x2d, 0xf5, 0xd0, 0xd7, 0x8a, 0x77, 0xae, 0xeb, 0x3a, 0x79,
+ 0x84, 0xec, 0xfd, 0x2d, 0x84, 0x21, 0x29, 0x71, 0xec, 0x69, 0xf8, 0xe5,
+ 0xea, 0x9c, 0x4c, 0x61, 0xb2, 0x85, 0x98, 0xa9, 0x24, 0xd4, 0x29, 0xa1,
+ 0x9c, 0x06, 0xae, 0x23, 0x7e, 0x2a, 0x8e, 0x3f, 0xd3, 0x57, 0x69, 0x42,
+ 0x1e, 0x51, 0x43, 0xbd, 0xa3, 0xfa, 0x85, 0x74, 0x33, 0xff, 0x37, 0x28,
+ 0x82, 0xcf, 0x12, 0xbb, 0x56, 0x8f, 0x51, 0x08, 0x99, 0x13, 0x99, 0x0b,
+ 0x08, 0x06, 0x74, 0x3f, 0xce, 0xe8, 0xfa, 0x7f, 0xfa, 0xe0, 0xff, 0x2f,
+ 0xe9, 0x83, 0xff, 0xcc, 0x29, 0xa5, 0x6a, 0xb3, 0xd0, 0x21, 0xfc, 0x93,
+ 0xe9, 0x1f, 0xc6, 0x18, 0x32, 0x77, 0x76, 0x3f, 0x74, 0x34, 0x5f, 0xbf,
+ 0xe0, 0x88, 0x86, 0x5b, 0xe1, 0xff, 0x8e, 0x23, 0xfa, 0xa8, 0x93, 0xf9,
+ 0xff, 0xbc, 0x1f, 0xff, 0xdd, 0xce, 0xe1, 0x1a, 0xac, 0xc7, 0x96, 0xd9,
+ 0x66, 0x77, 0x54, 0x75, 0x80, 0xeb, 0x7e, 0xc0, 0xd6, 0xde, 0x76, 0xaa,
+ 0x0f, 0xe5, 0xad, 0xf0, 0xd4, 0x9d, 0x9c, 0x7f, 0xf7, 0x1c, 0x9c, 0x15,
+ 0xa3, 0x6e, 0xd4, 0xb2, 0x4a, 0x4e, 0x5f, 0x1d, 0x9e, 0xff, 0x82, 0xd3,
+ 0xfe, 0x57, 0x38, 0x5a, 0x17, 0x59, 0x36, 0x1d, 0x70, 0x84, 0xe4, 0x05,
+ 0xfe, 0x11, 0x8d, 0x29, 0x6a, 0x2a, 0x3a, 0xb6, 0x2d, 0x05, 0x4e, 0xc2,
+ 0x60, 0x2d, 0x5e, 0x36, 0x6a, 0x4a, 0x21, 0x04, 0x11, 0x84, 0x13, 0xad,
+ 0x43, 0x2f, 0x4b, 0x59, 0x4c, 0xb7, 0x45, 0x05, 0xe4, 0x6f, 0x63, 0xab,
+ 0x48, 0x90, 0x9d, 0x8e, 0xf7, 0x35, 0xd1, 0x48, 0x59, 0x2e, 0x3e, 0xef,
+ 0x19, 0xc6, 0xef, 0x44, 0x11, 0x1f, 0xf7, 0x6e, 0x28, 0x1c, 0xdc, 0x61,
+ 0xb2, 0xa7, 0x27, 0xbb, 0x5c, 0x24, 0x1b, 0x59, 0xb9, 0xbf, 0x63, 0x6a,
+ 0x7a, 0xf7, 0xf3, 0xab, 0x30, 0x03, 0x6b, 0xa7, 0xd2, 0x5f, 0x89, 0xd6,
+ 0x0c, 0x52, 0x2c, 0x70, 0xba, 0xac, 0xc2, 0xa2, 0x40, 0xa9, 0x3f, 0x3b,
+ 0x1c, 0x26, 0xe7, 0xfe, 0xda, 0x4f, 0xb4, 0xe7, 0xd2, 0x7c, 0xbe, 0x35,
+ 0x9d, 0x11, 0x90, 0x7a, 0xbf, 0x05, 0xc9, 0xf0, 0xbb, 0x64, 0x23, 0x82,
+ 0x7b, 0x89, 0x3a, 0xf7, 0x39, 0xfd, 0x5a, 0xb2, 0xbe, 0xff, 0x1a, 0x62,
+ 0xb0, 0xbc, 0xd7, 0x1f, 0x42, 0x3a, 0x95, 0x45, 0x53, 0x31, 0xad, 0xb1,
+ 0x04, 0x4b, 0x6b, 0xa5, 0xdb, 0x5e, 0x7a, 0xc5, 0xd9, 0x52, 0xae, 0x93,
+ 0x4c, 0xb3, 0x16, 0x72, 0x0b, 0xf2, 0xf9, 0xce, 0x9a, 0xc9, 0xd0, 0xae,
+ 0x2c, 0xf8, 0xbe, 0xa8, 0x7e, 0xb2, 0x51, 0x71, 0xb5, 0xc4, 0x9c, 0x19,
+ 0x61, 0xa5, 0x34, 0x71, 0x83, 0xc1, 0x0a, 0x6f, 0x85, 0x06, 0xfb, 0x57,
+ 0x20, 0x91, 0x7f, 0x43, 0xe4, 0xe5, 0xfa, 0x52, 0x40, 0x61, 0xb6, 0xb5,
+ 0x3a, 0x64, 0xac, 0x54, 0x48, 0x51, 0xc8, 0x98, 0xf6, 0x02, 0xd5, 0x3c,
+ 0xcb, 0x9b, 0x7b, 0x4a, 0xd8, 0xbf, 0x93, 0xb4, 0x91, 0xae, 0xbc, 0x1f,
+ 0x9d, 0x3e, 0xc1, 0xb4, 0x5e, 0x9e, 0x8e, 0x7c, 0xe2, 0xeb, 0x3a, 0xe1,
+ 0xaa, 0xdd, 0x46, 0xf8, 0x7c, 0x75, 0x7c, 0x38, 0xba, 0x1c, 0x06, 0x43,
+ 0x34, 0x63, 0x0c, 0x51, 0x21, 0xbc, 0x61, 0x58, 0x08, 0x8f, 0x4e, 0xcd,
+ 0x58, 0xef, 0x89, 0x6d, 0x4e, 0x12, 0x90, 0xa8, 0x73, 0xdc, 0x37, 0x6d,
+ 0x9d, 0xec, 0xdc, 0x94, 0x01, 0xb0, 0x4d, 0x56, 0x85, 0x24, 0x51, 0x66,
+ 0xee, 0xc6, 0xf9, 0x8c, 0x46, 0x60, 0xfa, 0x65, 0xac, 0xa1, 0xb9, 0xe0,
+ 0x8a, 0x91, 0xce, 0x5a, 0xce, 0x08, 0x4f, 0x46, 0x9f, 0x69, 0xfb, 0x21,
+ 0x88, 0xcd, 0x52, 0x72, 0x7c, 0x57, 0x67, 0xec, 0x19, 0x2d, 0xa3, 0xac,
+ 0x33, 0x61, 0x0c, 0xa3, 0x36, 0x74, 0xae, 0xfa, 0x98, 0x0d, 0x0b, 0xe8,
+ 0x67, 0x32, 0x10, 0xe2, 0x3b, 0x08, 0xd3, 0xa1, 0xd2, 0xfa, 0x83, 0xe2,
+ 0xc2, 0x27, 0x0d, 0x72, 0x2b, 0xd3, 0xb5, 0x55, 0x76, 0xf6, 0xbb, 0x96,
+ 0x90, 0x59, 0x68, 0x24, 0x8f, 0x52, 0x12, 0x41, 0xd7, 0xb6, 0xfb, 0x3e,
+ 0x27, 0xfa, 0xdd, 0xed, 0x35, 0xeb, 0x6d, 0x23, 0xe4, 0x54, 0xe4, 0x80,
+ 0x33, 0x3c, 0x80, 0x78, 0xb9, 0x2d, 0xe3, 0x45, 0x75, 0x92, 0xc9, 0x4d,
+ 0x66, 0x2e, 0x91, 0xa1, 0x97, 0x02, 0xfd, 0xe8, 0x09, 0xd9, 0x08, 0xb8,
+ 0xb2, 0x22, 0xd3, 0xf3, 0x8b, 0x27, 0xe4, 0xe9, 0xd3, 0x70, 0x42, 0xaa,
+ 0xec, 0xef, 0xd3, 0x18, 0xbd, 0x30, 0x60, 0xda, 0x40, 0x88, 0x33, 0xb2,
+ 0xfa, 0x82, 0x39, 0x92, 0xa9, 0xab, 0x3b, 0x54, 0x8c, 0x84, 0x8b, 0xb6,
+ 0x67, 0x1e, 0xf3, 0x14, 0x59, 0xd8, 0x14, 0x82, 0x0c, 0xab, 0x2b, 0x36,
+ 0x92, 0xba, 0xec, 0x9e, 0x55, 0xc0, 0x53, 0x37, 0x6f, 0x5e, 0x50, 0x9e,
+ 0xf2, 0x91, 0xb5, 0x1a, 0x24, 0x41, 0x3b, 0x51, 0xd2, 0x82, 0x32, 0xb1,
+ 0xec, 0xe1, 0x19, 0x0c, 0xae, 0x9a, 0x85, 0x1d, 0xd8, 0xda, 0xdd, 0xb1,
+ 0x1b, 0x4c, 0x86, 0x0c, 0x9d, 0xc7, 0xce, 0x83, 0x97, 0xd1, 0x27, 0x97,
+ 0x95, 0xad, 0xee, 0xb1, 0x6e, 0x0a, 0x02, 0x48, 0x19, 0xd5, 0xcb, 0x60,
+ 0xb4, 0x28, 0x48, 0x7e, 0xa4, 0x2a, 0xe2, 0x63, 0x27, 0x22, 0x14, 0x1e,
+ 0x98, 0x96, 0x56, 0x6c, 0xd4, 0x0e, 0x58, 0x24, 0xb8, 0xc6, 0x47, 0x65,
+ 0x0a, 0x38, 0x03, 0x09, 0xd8, 0xdf, 0x41, 0x48, 0xc3, 0x6b, 0xac, 0xf9,
+ 0xdb, 0x6c, 0x86, 0x4c, 0xc8, 0xac, 0x98, 0x54, 0xf7, 0x0b, 0x9f, 0x0f,
+ 0x7b, 0xfa, 0xcf, 0xcc, 0xbf, 0x82, 0xe7, 0x11, 0x3c, 0x36, 0x8a, 0x8f,
+ 0x11, 0x76, 0xdb, 0xa1, 0xfe, 0x45, 0xe9, 0x6c, 0x2a, 0xdf, 0xd8, 0x33,
+ 0x05, 0xc4, 0x2d, 0xc7, 0x88, 0xad, 0xfe, 0x4b, 0xd6, 0x8c, 0x4a, 0x6f,
+ 0xe6, 0x9c, 0xe3, 0xbc, 0xe4, 0x6e, 0xdc, 0x63, 0x09, 0x0a, 0x21, 0x8b,
+ 0x20, 0x7e, 0xf4, 0xda, 0xef, 0xf7, 0x79, 0xc2, 0x6e, 0xf7, 0x83, 0xac,
+ 0x02, 0x12, 0x09, 0xaf, 0xc9, 0x4b, 0xd3, 0x76, 0xc4, 0xd3, 0x81, 0xd5,
+ 0xd2, 0x42, 0xfb, 0xec, 0x8a, 0xb2, 0xbe, 0x50, 0x9b, 0xb7, 0xb6, 0xaa,
+ 0x72, 0x3b, 0xde, 0x76, 0xc9, 0x6c, 0x23, 0x23, 0x5c, 0x19, 0xbd, 0xa5,
+ 0xbe, 0xa5, 0xf1, 0x32, 0x97, 0x5c, 0x7d, 0xba, 0x01, 0xcd, 0xd3, 0xb7,
+ 0xfb, 0xab, 0xd8, 0x9d, 0x87, 0xf2, 0x6b, 0xe4, 0x7b, 0x4e, 0xa9, 0x8e,
+ 0x80, 0xa3, 0x9e, 0x4b, 0x6c, 0x15, 0x4e, 0x80, 0x17, 0xc9, 0x41, 0xfd,
+ 0x7c, 0xef, 0x93, 0xe7, 0xdb, 0xeb, 0xca, 0x0e, 0x52, 0xdd, 0x0d, 0xca,
+ 0x62, 0xe3, 0x4d, 0x44, 0xff, 0xda, 0x1f, 0xfa, 0x13, 0xe4, 0x15, 0x07,
+ 0x90, 0x6c, 0xc4, 0xf0, 0x8e, 0x33, 0x17, 0x0e, 0x6d, 0x0a, 0x4c, 0x84,
+ 0xe5, 0x50, 0xa7, 0xed, 0xc2, 0xe3, 0x6a, 0x4a, 0x7b, 0xce, 0xb1, 0x99,
+ 0xbb, 0x66, 0x61, 0x77, 0x98, 0x6c, 0x26, 0x0e, 0x9e, 0x68, 0x1f, 0xf8,
+ 0xfe, 0xf4, 0x2b, 0xb1, 0x71, 0x67, 0xf1, 0xf7, 0x61, 0xfb, 0x5f, 0x7e,
+ 0x40, 0xd3, 0x35, 0xf0, 0x6b, 0x56, 0xf9, 0xc9, 0xbf, 0x60, 0x95, 0x9f,
+ 0xac, 0x5f, 0xe5, 0x27, 0x8f, 0x5d, 0xe5, 0x4f, 0x9e, 0x3d, 0xff, 0xf4,
+ 0x57, 0xac, 0xb2, 0x37, 0xc3, 0xff, 0xc7, 0x56, 0xd9, 0xdb, 0x69, 0xbf,
+ 0x6e, 0x95, 0x05, 0x18, 0x12, 0x08, 0x62, 0x29, 0x5a, 0x41, 0x10, 0x3e,
+ 0xca, 0x3a, 0x67, 0x08, 0x3f, 0x3f, 0xab, 0x16, 0x68, 0x9b, 0xda, 0xd7,
+ 0x16, 0xac, 0x22, 0x4d, 0x2c, 0x62, 0x66, 0xbb, 0x2c, 0x7c, 0xe8, 0xb8,
+ 0x8b, 0x19, 0xd5, 0x3d, 0xda, 0x1c, 0x6c, 0xaa, 0x83, 0x44, 0x73, 0x8c,
+ 0x94, 0x42, 0x86, 0x3f, 0x67, 0x96, 0xfa, 0x5f, 0x48, 0x41, 0x14, 0xe2,
+ 0x66, 0x3c, 0xe4, 0x53, 0x6b, 0xd2, 0x56, 0xd4, 0xc1, 0x88, 0x16, 0x55,
+ 0xa1, 0xd2, 0x2b, 0xed, 0xda, 0x2b, 0x8c, 0x0f, 0x65, 0x56, 0x26, 0x68,
+ 0xc2, 0x9d, 0xfa, 0xdf, 0x5a, 0x93, 0x24, 0x48, 0x62, 0xa3, 0xbb, 0x4e,
+ 0xc0, 0x4f, 0xed, 0x12, 0x1f, 0x0e, 0x68, 0xe7, 0xaa, 0x99, 0x77, 0x2c,
+ 0x96, 0xc0, 0x7a, 0x22, 0xc0, 0x69, 0x63, 0xab, 0x35, 0x78, 0x10, 0xb2,
+ 0x57, 0x34, 0xe8, 0xe9, 0x72, 0xbe, 0x50, 0x42, 0x2d, 0xca, 0x6d, 0xc8,
+ 0xb9, 0x4e, 0x31, 0x27, 0xd4, 0x02, 0x77, 0x19, 0xf1, 0x2f, 0x59, 0xf7,
+ 0x8b, 0xe0, 0xbe, 0xd8, 0x95, 0xa3, 0x35, 0x44, 0x5c, 0x32, 0x28, 0x8f,
+ 0x81, 0xb6, 0x4a, 0x23, 0xd9, 0x04, 0x45, 0x17, 0x16, 0xc9, 0x59, 0x88,
+ 0x94, 0x81, 0x34, 0xcd, 0xc6, 0xcb, 0x6b, 0xcd, 0x49, 0xb5, 0x35, 0x9b,
+ 0xda, 0x8b, 0x85, 0xec, 0x0b, 0xe2, 0xa9, 0xc8, 0xfa, 0x0c, 0x84, 0xbd,
+ 0x0f, 0xd3, 0xf3, 0x1b, 0x2a, 0x58, 0x36, 0x59, 0x87, 0x9b, 0x0a, 0x06,
+ 0x8e, 0x3d, 0xd0, 0x1a, 0x39, 0x7e, 0xd2, 0xaa, 0xa5, 0x13, 0x29, 0x2e,
+ 0xe3, 0x6f, 0x95, 0x66, 0xb2, 0x18, 0x5c, 0xa5, 0x44, 0x70, 0x17, 0x24,
+ 0x25, 0x0a, 0x56, 0x52, 0x9c, 0x78, 0x97, 0x47, 0xe7, 0xc9, 0xeb, 0x54,
+ 0x4a, 0x5b, 0x24, 0x5b, 0x46, 0x30, 0x7d, 0xf2, 0x74, 0xef, 0xc9, 0xf6,
+ 0x5a, 0x05, 0xb5, 0x4d, 0xd8, 0x82, 0x6f, 0x15, 0x65, 0x0c, 0xb3, 0x7a,
+ 0xb9, 0x34, 0xf6, 0xa4, 0xa6, 0x73, 0x99, 0x2f, 0xbd, 0x7f, 0x7b, 0xf6,
+ 0xea, 0xf8, 0xf4, 0xf0, 0xaf, 0x36, 0xeb, 0x98, 0x26, 0x41, 0xd3, 0xd7,
+ 0xde, 0x1b, 0xbb, 0xee, 0xfe, 0xbd, 0x31, 0x95, 0xcd, 0x2f, 0xb7, 0x9e,
+ 0x6c, 0x53, 0xd6, 0x4e, 0x50, 0xe7, 0xec, 0x3a, 0x6b, 0xe7, 0x6a, 0x33,
+ 0x84, 0x78, 0x0d, 0xe5, 0x88, 0xf5, 0xdc, 0xed, 0x0e, 0xf7, 0x85, 0xbd,
+ 0x5e, 0xe8, 0xb7, 0xdd, 0x51, 0xf6, 0x98, 0xf4, 0x53, 0x21, 0x26, 0xe2,
+ 0x04, 0xaf, 0x30, 0x3f, 0x83, 0x12, 0xc3, 0xf3, 0x49, 0x4e, 0x6a, 0x7c,
+ 0x6d, 0x76, 0x2d, 0x65, 0xc2, 0x52, 0x7c, 0xfa, 0xaa, 0x4d, 0x6d, 0x86,
+ 0x0c, 0x30, 0xfa, 0xc5, 0xfa, 0x78, 0x6b, 0x5b, 0x24, 0x36, 0x90, 0xa1,
+ 0xd9, 0xac, 0xc8, 0x9a, 0x81, 0x74, 0xec, 0x85, 0xf9, 0xf3, 0xe5, 0x6d,
+ 0x3a, 0x0b, 0x72, 0x0b, 0xa9, 0x4c, 0x98, 0xee, 0x4c, 0x8b, 0x2b, 0xa4,
+ 0x37, 0x3d, 0xe6, 0xfe, 0x91, 0xa5, 0xb0, 0xd7, 0x27, 0xcd, 0x51, 0x09,
+ 0x98, 0xea, 0x2f, 0x2f, 0xff, 0x7a, 0x7e, 0xfc, 0xf2, 0x05, 0xa1, 0x12,
+ 0xbf, 0x20, 0xdc, 0x79, 0xdd, 0x02, 0x29, 0x26, 0x54, 0xc5, 0x36, 0x18,
+ 0xc3, 0x0f, 0xaf, 0x4e, 0x46, 0xe7, 0xa7, 0x67, 0x47, 0x2f, 0x5f, 0xfc,
+ 0x40, 0xe6, 0x96, 0x91, 0xa9, 0xf7, 0xde, 0xbb, 0xf6, 0x67, 0x96, 0x8d,
+ 0x3b, 0x4c, 0x48, 0x3f, 0xfe, 0xfe, 0xfd, 0xf1, 0xdb, 0xef, 0x5e, 0xbe,
+ 0xb8, 0x4d, 0xab, 0x3e, 0x8d, 0x8f, 0xdf, 0x5e, 0x51, 0x83, 0xaf, 0xb5,
+ 0xd5, 0x48, 0x6f, 0x1d, 0xcf, 0x3e, 0xd4, 0xf9, 0x3f, 0xb2, 0xc4, 0xbc,
+ 0x3e, 0x5b, 0x86, 0x64, 0xb8, 0x97, 0x52, 0x72, 0xc5, 0x5c, 0x69, 0x64,
+ 0x27, 0x7c, 0x75, 0xfa, 0x2d, 0x11, 0x2e, 0x5a, 0x07, 0xe2, 0x9c, 0x6b,
+ 0x7c, 0x24, 0x5f, 0x3c, 0xdb, 0xdb, 0xdf, 0x76, 0x05, 0xec, 0x40, 0xd8,
+ 0x6a, 0x7a, 0xfc, 0x21, 0xc8, 0x99, 0xf8, 0x87, 0x64, 0x7f, 0xb8, 0x2a,
+ 0x0b, 0x00, 0xf6, 0x7b, 0xf4, 0x08, 0xea, 0x8b, 0x41, 0xa6, 0x35, 0xa0,
+ 0xa1, 0x54, 0xff, 0xaf, 0x02, 0x71, 0x4d, 0xe0, 0x8a, 0xba, 0x7c, 0xed,
+ 0x71, 0x24, 0x7c, 0xe5, 0xb6, 0x9e, 0xe9, 0x8e, 0xb8, 0xb3, 0xd6, 0x5e,
+ 0x1b, 0xbf, 0x63, 0x90, 0xa3, 0x6b, 0x6b, 0x61, 0xb2, 0x8d, 0x29, 0x2e,
+ 0xfb, 0x27, 0x3e, 0xcf, 0x1e, 0xfc, 0x05, 0xd9, 0x1f, 0x25, 0xb3, 0x7b,
+ 0x61, 0x94, 0xba, 0xf1, 0x34, 0x2f, 0xf5, 0x01, 0xe7, 0x56, 0x3e, 0xa7,
+ 0x9c, 0xc1, 0xac, 0x4e, 0xd4, 0xf1, 0xe1, 0xb9, 0x35, 0x66, 0xd9, 0x75,
+ 0x3a, 0xb9, 0xb7, 0x3c, 0xa5, 0x58, 0x90, 0x69, 0x19, 0xc9, 0x9d, 0x4f,
+ 0x27, 0x64, 0xe5, 0xcc, 0xb2, 0xe9, 0x35, 0xc4, 0x33, 0xe7, 0xe1, 0x9b,
+ 0xe3, 0x6a, 0xbd, 0x21, 0xdc, 0x35, 0x4b, 0x36, 0xa0, 0xd7, 0xe5, 0xea,
+ 0xfc, 0x16, 0x5b, 0x8e, 0xac, 0xbd, 0xfb, 0x68, 0xdb, 0xa0, 0xc2, 0xe6,
+ 0xda, 0x39, 0x7d, 0xda, 0x76, 0x25, 0xff, 0x03, 0x87, 0x9c, 0x78, 0x5c,
+ 0xe0, 0xad, 0x7c, 0x41, 0x7f, 0x5d, 0xcd, 0xe6, 0xcc, 0xf6, 0x3c, 0x57,
+ 0x50, 0x65, 0xea, 0x6c, 0x1a, 0xb6, 0x65, 0xe0, 0x92, 0xf2, 0x08, 0x44,
+ 0x0a, 0xdc, 0x38, 0x3f, 0x73, 0x9c, 0x25, 0xc9, 0x7a, 0x7b, 0xcd, 0xf6,
+ 0xcc, 0xb4, 0xa4, 0xca, 0xaa, 0xf6, 0xbc, 0xcc, 0xac, 0x30, 0x76, 0xc1,
+ 0x29, 0x41, 0x14, 0xa5, 0x7f, 0x41, 0x6d, 0x91, 0x48, 0x24, 0x9d, 0xc4,
+ 0xcc, 0xd4, 0x17, 0x1a, 0x0e, 0x41, 0x05, 0x8d, 0x52, 0xb8, 0x7b, 0xf0,
+ 0x10, 0xb3, 0x10, 0xd4, 0x61, 0x0a, 0x37, 0x03, 0xbf, 0xd5, 0xa0, 0x66,
+ 0xe4, 0x02, 0xc5, 0x9a, 0x2c, 0x39, 0xa9, 0xe9, 0x66, 0xad, 0xca, 0x1a,
+ 0xa5, 0x40, 0xc1, 0x7e, 0x75, 0xd4, 0x85, 0x11, 0x0e, 0x0c, 0x3f, 0x63,
+ 0xe7, 0xda, 0xf2, 0x5e, 0xf2, 0xe0, 0x94, 0x96, 0x00, 0x9d, 0xda, 0x9a,
+ 0xd3, 0x60, 0x84, 0xe9, 0x3a, 0x4a, 0x2b, 0x6e, 0x95, 0xcb, 0xd6, 0x3d,
+ 0x65, 0x1a, 0xa5, 0xf7, 0xe5, 0x8e, 0xc2, 0xad, 0x24, 0xd9, 0xbd, 0x68,
+ 0xd6, 0x9b, 0x91, 0x20, 0x23, 0xa4, 0x61, 0x84, 0x7b, 0xf7, 0x92, 0x22,
+ 0x72, 0x5a, 0xc5, 0x95, 0xfb, 0x33, 0xda, 0xaa, 0x7d, 0xb4, 0x35, 0x70,
+ 0x55, 0x63, 0xf2, 0xc6, 0x2a, 0x6d, 0x11, 0xc2, 0x06, 0x4b, 0xa0, 0x6b,
+ 0x89, 0x7f, 0xd8, 0x2b, 0xa8, 0x3b, 0x44, 0xf6, 0x04, 0x7d, 0x6c, 0x87,
+ 0xf3, 0xbe, 0x54, 0x08, 0xe5, 0x91, 0xd4, 0xd3, 0xa0, 0xb1, 0x22, 0xbb,
+ 0xf3, 0x1b, 0x73, 0x0a, 0xb9, 0x6d, 0xf0, 0xf7, 0x74, 0x04, 0x1b, 0x63,
+ 0x82, 0x92, 0x56, 0x92, 0x17, 0xdf, 0x1d, 0x5f, 0x8c, 0x4e, 0xce, 0xde,
+ 0x7e, 0x11, 0xb5, 0x13, 0x13, 0xf9, 0x6d, 0x62, 0xab, 0x0a, 0x69, 0xa6,
+ 0x9b, 0x2b, 0xed, 0x42, 0xde, 0x21, 0x75, 0x43, 0x24, 0x87, 0x94, 0xdd,
+ 0x43, 0x0f, 0x74, 0xb7, 0x40, 0x2d, 0x2d, 0xc0, 0xfd, 0x99, 0x56, 0xd7,
+ 0x98, 0x0b, 0xb3, 0x17, 0x61, 0xd3, 0xa0, 0x6a, 0xa7, 0x1a, 0x3b, 0xf6,
+ 0xaf, 0xfb, 0xc1, 0xf8, 0xe3, 0x50, 0x15, 0x2f, 0x52, 0xbc, 0x5c, 0x70,
+ 0x26, 0x14, 0xe5, 0xbc, 0x33, 0x2b, 0x86, 0xdf, 0xbb, 0x80, 0xde, 0xdb,
+ 0x7c, 0xb8, 0xf5, 0xa2, 0x79, 0xf8, 0x76, 0xcf, 0xcb, 0xde, 0xb0, 0xcf,
+ 0xed, 0xc5, 0x9e, 0xdb, 0x0b, 0x9f, 0xdb, 0x8f, 0x3d, 0xb7, 0x1f, 0x3e,
+ 0xf7, 0x24, 0xf6, 0x9c, 0x97, 0xa0, 0xe3, 0x99, 0xaf, 0x3a, 0x43, 0xeb,
+ 0x2c, 0x42, 0x6f, 0x3d, 0x5b, 0xe5, 0x0c, 0x37, 0x3c, 0x13, 0xce, 0x33,
+ 0x61, 0xd5, 0x82, 0x5d, 0x6d, 0xc0, 0xfa, 0x10, 0x9b, 0x8e, 0x1f, 0xd5,
+ 0x7c, 0x88, 0x10, 0x3b, 0xa4, 0xd2, 0x18, 0xc1, 0x6b, 0xfe, 0xfb, 0x45,
+ 0x98, 0x76, 0x97, 0x60, 0xda, 0xc3, 0xba, 0xe7, 0xa4, 0x06, 0x25, 0x94,
+ 0x19, 0xc2, 0x85, 0x76, 0xfb, 0x6a, 0x50, 0x78, 0x74, 0xd3, 0x21, 0x8b,
+ 0x81, 0xdd, 0xeb, 0xbd, 0xd1, 0xc5, 0x79, 0xaf, 0x2f, 0xc1, 0x3c, 0xf3,
+ 0x81, 0x81, 0xf9, 0x77, 0x02, 0x5d, 0x9b, 0xa8, 0xea, 0x9f, 0x3d, 0x15,
+ 0xdc, 0x0d, 0xf7, 0x91, 0x4b, 0xb6, 0x84, 0xde, 0x65, 0xfc, 0xd2, 0x62,
+ 0x8f, 0xb8, 0xec, 0x9b, 0xab, 0x2a, 0x61, 0xd4, 0xe0, 0xf6, 0x08, 0x19,
+ 0x11, 0xd0, 0x77, 0x04, 0xa6, 0xf1, 0xde, 0x59, 0xf2, 0x24, 0xaa, 0x5b,
+ 0x4c, 0xdd, 0x7c, 0x20, 0x07, 0xfe, 0x69, 0x67, 0x46, 0xb5, 0x43, 0x91,
+ 0xa9, 0x74, 0x65, 0xde, 0xcb, 0x8a, 0x75, 0x25, 0xa5, 0x89, 0x42, 0x99,
+ 0xec, 0xce, 0x14, 0x5b, 0xbe, 0x9a, 0x55, 0x29, 0x1c, 0x9a, 0xb3, 0xee,
+ 0x0d, 0x72, 0xa8, 0xfe, 0x6e, 0x51, 0x08, 0xdc, 0xfc, 0x79, 0x6c, 0xcd,
+ 0x0f, 0x0f, 0xc8, 0x1f, 0x0f, 0xde, 0x8e, 0x62, 0x1c, 0xb1, 0x3b, 0x14,
+ 0x04, 0x96, 0x3c, 0x6a, 0x50, 0x32, 0xa6, 0x5f, 0x39, 0x24, 0xf1, 0xe9,
+ 0x74, 0xd7, 0x9d, 0x46, 0x16, 0x5a, 0xd5, 0x8f, 0x1a, 0x68, 0x6b, 0xa4,
+ 0x74, 0x36, 0x03, 0x95, 0xee, 0x74, 0xb4, 0x9d, 0xa8, 0x8f, 0xcd, 0x01,
+ 0xfc, 0x68, 0x9c, 0x9e, 0x38, 0x82, 0xf8, 0x79, 0x04, 0xb0, 0x4f, 0x5c,
+ 0x6c, 0xf4, 0xa6, 0x92, 0x6b, 0xaf, 0xc9, 0xbb, 0x0b, 0x4f, 0x2b, 0xc9,
+ 0x8b, 0x68, 0x0f, 0x23, 0x4e, 0xc0, 0x76, 0xf7, 0xf6, 0x84, 0x4b, 0xc0,
+ 0xeb, 0x1f, 0xd7, 0x81, 0xfd, 0xed, 0x7b, 0xb8, 0xff, 0xab, 0xe7, 0x70,
+ 0xff, 0x5f, 0x34, 0x87, 0x4f, 0x7e, 0xdd, 0x1c, 0x3e, 0xf9, 0xcd, 0xe6,
+ 0xd0, 0x55, 0xf7, 0xa4, 0x87, 0xa8, 0xe5, 0xbc, 0xee, 0x88, 0x4e, 0xdc,
+ 0xad, 0xe6, 0x9f, 0x63, 0x8a, 0x94, 0x93, 0x57, 0xc2, 0x3c, 0x48, 0xf9,
+ 0xac, 0x19, 0xea, 0x1c, 0x76, 0x06, 0xdc, 0xd8, 0x2c, 0x7c, 0xcb, 0x49,
+ 0x4c, 0xee, 0x3b, 0x24, 0xcb, 0x83, 0x1f, 0x92, 0x64, 0xe3, 0x57, 0x25,
+ 0x69, 0x9c, 0x46, 0x17, 0xe8, 0x27, 0x6f, 0x47, 0x23, 0x8e, 0x5f, 0x8e,
+ 0xe0, 0x81, 0xed, 0xda, 0x20, 0x64, 0xbc, 0xe1, 0x02, 0xd9, 0x22, 0x69,
+ 0x7d, 0x66, 0x7a, 0x88, 0xab, 0x1c, 0x4a, 0x35, 0xbf, 0x37, 0x4f, 0x27,
+ 0xf4, 0xe3, 0xdd, 0xe1, 0xde, 0x13, 0xfb, 0x9b, 0xed, 0x5f, 0x40, 0x9b,
+ 0xe1, 0xdc, 0xa3, 0x71, 0x5d, 0x25, 0x4c, 0x21, 0x68, 0x2f, 0xc5, 0xc7,
+ 0xd0, 0xab, 0xcd, 0x8a, 0xe1, 0x83, 0x4b, 0xc1, 0xc1, 0x1b, 0xce, 0xf1,
+ 0xee, 0x9c, 0xe0, 0x7e, 0x22, 0x3a, 0x4b, 0x4c, 0x5f, 0x79, 0xd0, 0x0b,
+ 0xed, 0x79, 0x7c, 0xff, 0x8f, 0x79, 0xa1, 0xe3, 0x3a, 0x45, 0xeb, 0x5f,
+ 0xad, 0xd4, 0xe1, 0xa6, 0x1a, 0x68, 0xd5, 0x82, 0x38, 0x29, 0xa2, 0xb3,
+ 0xb6, 0x08, 0x37, 0x4c, 0x3a, 0x38, 0xe9, 0x61, 0x62, 0xdc, 0x0f, 0x8e,
+ 0xe5, 0x5d, 0xe7, 0xf4, 0xe4, 0x68, 0x6f, 0xb4, 0x36, 0xa5, 0x50, 0xd3,
+ 0x69, 0x26, 0xb6, 0xa6, 0xc2, 0xf2, 0x28, 0x6b, 0xde, 0x56, 0xcb, 0x42,
+ 0x3f, 0xe3, 0x72, 0x4a, 0x41, 0x07, 0x11, 0x2c, 0xeb, 0x24, 0x63, 0xaa,
+ 0x80, 0xfc, 0x21, 0x21, 0xff, 0xbc, 0x3d, 0xde, 0x74, 0x92, 0x0d, 0xd2,
+ 0x7a, 0x92, 0xe7, 0x71, 0xf3, 0x86, 0x3d, 0x81, 0x30, 0xa7, 0x96, 0x70,
+ 0x6b, 0x50, 0x95, 0x56, 0x72, 0x44, 0x6a, 0x19, 0x44, 0xa2, 0x32, 0xe4,
+ 0x24, 0x7a, 0xb6, 0xac, 0xca, 0x65, 0x73, 0x0d, 0x4a, 0x33, 0x74, 0xb6,
+ 0x1f, 0x58, 0x4b, 0x5a, 0x2c, 0xde, 0x2c, 0xcf, 0xa4, 0xca, 0x17, 0xe0,
+ 0x78, 0xf2, 0xea, 0x2d, 0xf4, 0x6d, 0x49, 0x42, 0xd8, 0x1f, 0xe2, 0x52,
+ 0xe6, 0x0a, 0x7d, 0xef, 0x82, 0xdc, 0xe5, 0xde, 0xa0, 0x47, 0xb6, 0x9e,
+ 0x25, 0xa9, 0x37, 0xef, 0x12, 0x1f, 0x1f, 0x53, 0xe9, 0xf0, 0xab, 0xa8,
+ 0xf8, 0xba, 0xda, 0x65, 0xaf, 0xbe, 0x1d, 0xb3, 0x85, 0xee, 0x95, 0xf2,
+ 0x0d, 0x3c, 0xbc, 0xea, 0xb3, 0x25, 0xb5, 0x69, 0x96, 0x11, 0xc9, 0x5f,
+ 0x52, 0x4a, 0x66, 0xef, 0x4d, 0xf6, 0x91, 0xb3, 0x4e, 0x42, 0x0d, 0x4c,
+ 0x0a, 0xb8, 0xde, 0xa0, 0x30, 0x02, 0x3d, 0x7b, 0x38, 0x3a, 0x3a, 0x39,
+ 0x69, 0xe5, 0xa8, 0xd0, 0xe4, 0x31, 0x71, 0x14, 0x52, 0x89, 0x6b, 0xa2,
+ 0xd0, 0x22, 0x4f, 0x36, 0xba, 0x1b, 0xa3, 0xe0, 0x9d, 0xe7, 0xd7, 0x37,
+ 0x70, 0x47, 0x65, 0x69, 0x9d, 0x6b, 0x91, 0x9c, 0x54, 0x74, 0xa6, 0xc2,
+ 0x74, 0x13, 0x96, 0xc7, 0xcd, 0xd2, 0x18, 0x9a, 0xbf, 0x7f, 0xda, 0x7d,
+ 0x1c, 0xfa, 0x29, 0xb3, 0xc5, 0xe7, 0xca, 0x77, 0x7f, 0x87, 0x7b, 0x2d,
+ 0xc2, 0x77, 0x7b, 0x5e, 0x49, 0x45, 0x14, 0xa6, 0x96, 0x10, 0xc2, 0x5a,
+ 0x2a, 0xda, 0x49, 0xd4, 0x3f, 0xdc, 0xb2, 0x19, 0xab, 0x7a, 0xd4, 0x99,
+ 0x09, 0x52, 0x04, 0x49, 0xa4, 0x36, 0xaa, 0xf8, 0x16, 0xd7, 0x62, 0xeb,
+ 0xf7, 0xba, 0xd7, 0x20, 0x3e, 0xb2, 0xf6, 0x04, 0x10, 0x91, 0x10, 0xce,
+ 0x80, 0xf4, 0xa8, 0x75, 0x0a, 0xec, 0x21, 0xa0, 0x19, 0xb0, 0x47, 0xe0,
+ 0x5f, 0x74, 0x02, 0x80, 0xab, 0x75, 0xb5, 0x1d, 0x1e, 0x3e, 0x04, 0xb0,
+ 0xce, 0x7a, 0x7f, 0xea, 0xc5, 0x19, 0x91, 0x1f, 0x71, 0x92, 0x5a, 0x09,
+ 0xdb, 0xff, 0xda, 0x9d, 0x16, 0xc9, 0x20, 0xf7, 0x84, 0x98, 0xbf, 0xa6,
+ 0xcb, 0x22, 0xff, 0x08, 0xf8, 0xa7, 0xd1, 0x17, 0x5e, 0x10, 0x17, 0xf0,
+ 0x0a, 0x9e, 0xdb, 0x23, 0xd6, 0x5e, 0x5c, 0x05, 0x7b, 0xfa, 0xf0, 0x3b,
+ 0xf3, 0x72, 0x32, 0x2d, 0xe7, 0x14, 0x0b, 0xe4, 0x36, 0xfa, 0x3e, 0xd9,
+ 0x20, 0xc4, 0x7a, 0x24, 0x96, 0x58, 0x64, 0x0d, 0x81, 0xb5, 0xd6, 0xba,
+ 0xfb, 0xda, 0x2e, 0xd4, 0x4b, 0x14, 0x17, 0x59, 0x10, 0xc4, 0x70, 0x4d,
+ 0xf1, 0x3a, 0xf6, 0x82, 0x7a, 0x80, 0x3e, 0x9f, 0xab, 0x8e, 0xdc, 0x7b,
+ 0x8e, 0x94, 0xb9, 0x5d, 0x2e, 0x1c, 0x5c, 0xc7, 0xb1, 0xb0, 0xa7, 0xa5,
+ 0xe5, 0x76, 0xa4, 0xf6, 0x79, 0xd7, 0x59, 0x03, 0xda, 0x74, 0xe7, 0xd3,
+ 0x96, 0x92, 0x33, 0x6b, 0x29, 0xa1, 0x99, 0xc6, 0xdb, 0x15, 0xfb, 0x6a,
+ 0x91, 0xff, 0x83, 0xbf, 0x25, 0x9f, 0xd1, 0xe6, 0xdf, 0xd1, 0x90, 0xcf,
+ 0x2c, 0x44, 0xea, 0x39, 0x46, 0x79, 0x16, 0x75, 0x04, 0x0b, 0x87, 0xdb,
+ 0x97, 0xfe, 0x0d, 0xea, 0x05, 0xa9, 0x23, 0xd6, 0x19, 0x84, 0x54, 0x89,
+ 0x88, 0x56, 0xf6, 0x66, 0xa7, 0xfc, 0x0d, 0x15, 0x1a, 0xd4, 0x7e, 0x55,
+ 0xbc, 0x11, 0xdb, 0xa5, 0x24, 0xd5, 0xcf, 0xef, 0x71, 0xd0, 0x47, 0x8a,
+ 0x0d, 0x8b, 0x0e, 0x26, 0xba, 0x13, 0x93, 0x71, 0x11, 0x2a, 0x9f, 0x58,
+ 0x79, 0x29, 0xa6, 0x6f, 0xeb, 0x9a, 0xf1, 0xc2, 0x7a, 0x05, 0xb2, 0x83,
+ 0x70, 0x11, 0x11, 0x5a, 0xb4, 0x50, 0x96, 0x38, 0x35, 0x65, 0xa1, 0xc0,
+ 0xee, 0x2d, 0xa3, 0x88, 0x6b, 0xf1, 0x68, 0x6a, 0x91, 0x18, 0x75, 0x5d,
+ 0x15, 0xf1, 0x80, 0x1b, 0x76, 0xd5, 0x69, 0xd2, 0x54, 0x03, 0x37, 0x51,
+ 0x24, 0x39, 0xb6, 0x52, 0x25, 0x7c, 0x22, 0xf7, 0xe1, 0xb6, 0xaa, 0x96,
+ 0xe6, 0x84, 0xe7, 0x85, 0xbf, 0xdd, 0x03, 0x35, 0x52, 0x78, 0xf5, 0x59,
+ 0x2a, 0x99, 0xed, 0x2d, 0x84, 0x8d, 0x99, 0xf5, 0x7b, 0x78, 0xdf, 0x19,
+ 0xfa, 0xdf, 0x61, 0x68, 0xed, 0x76, 0x40, 0xf0, 0x7b, 0xdf, 0x2d, 0xfc,
+ 0x67, 0xbf, 0x4d, 0xfd, 0xd4, 0x0c, 0x32, 0xe9, 0x19, 0xc2, 0xb5, 0x84,
+ 0xc2, 0x42, 0x34, 0x26, 0x3c, 0x89, 0x48, 0x69, 0x64, 0x4b, 0x04, 0xbc,
+ 0xda, 0xb8, 0x2f, 0x99, 0x9c, 0x5b, 0x4b, 0x12, 0xb2, 0x48, 0x13, 0x6a,
+ 0x2d, 0xdb, 0x2c, 0x79, 0xb9, 0xc3, 0xe6, 0x78, 0x11, 0x23, 0x93, 0xfa,
+ 0xd7, 0x4e, 0x8a, 0x01, 0xc9, 0xb4, 0xf0, 0x40, 0xdb, 0x1a, 0x1c, 0x44,
+ 0xe9, 0x5d, 0x16, 0xae, 0xf4, 0x77, 0x94, 0xe6, 0x58, 0xa8, 0x2c, 0x93,
+ 0x63, 0x7a, 0x23, 0x6c, 0xec, 0x2f, 0x42, 0x0c, 0x9e, 0xfb, 0x65, 0x76,
+ 0x50, 0xb1, 0x32, 0xd8, 0x59, 0xb2, 0xf7, 0x84, 0x2d, 0x15, 0xf9, 0x80,
+ 0x43, 0x61, 0x90, 0x27, 0xb5, 0x5d, 0x15, 0xcd, 0xa4, 0x77, 0x3d, 0x2b,
+ 0xc7, 0x63, 0x33, 0xec, 0x9e, 0xa7, 0x96, 0x9a, 0x2f, 0x07, 0xce, 0x25,
+ 0xbf, 0x1f, 0xd6, 0xcd, 0xd9, 0xe7, 0x70, 0xbd, 0x50, 0x8f, 0xd2, 0x95,
+ 0xac, 0x89, 0x17, 0xf2, 0x7d, 0x2d, 0x98, 0x1e, 0xb9, 0x69, 0x04, 0x4f,
+ 0x27, 0x5b, 0x83, 0x06, 0xe6, 0xe1, 0x23, 0x25, 0x0f, 0x89, 0x7e, 0xaa,
+ 0x1d, 0x4c, 0xb8, 0x9c, 0xf7, 0x2a, 0x70, 0x4d, 0x8b, 0xe1, 0xbd, 0xaf,
+ 0x25, 0x3e, 0xf2, 0xb0, 0xf6, 0x36, 0xcf, 0x42, 0x7b, 0x40, 0xbd, 0xff,
+ 0xa4, 0x3f, 0xf6, 0xfa, 0xf4, 0xdf, 0xfd, 0xff, 0xea, 0x25, 0x64, 0xc5,
+ 0x1c, 0xec, 0xec, 0xdc, 0xdd, 0xdd, 0x0d, 0x85, 0xbe, 0x78, 0x68, 0x96,
+ 0x6c, 0x23, 0xcc, 0x14, 0x20, 0xe6, 0x96, 0x15, 0x1f, 0xb8, 0x4c, 0x7a,
+ 0xf9, 0xfc, 0xfa, 0xc7, 0xbd, 0xc1, 0xde, 0xee, 0xee, 0xee, 0xcf, 0xc3,
+ 0x05, 0x4d, 0xf1, 0x15, 0x9a, 0x35, 0xff, 0xf5, 0x9b, 0xdd, 0xe1, 0x9e,
+ 0xec, 0x44, 0xc9, 0xb0, 0x64, 0x22, 0x6d, 0xd6, 0x77, 0xc1, 0x4c, 0xb8,
+ 0xbc, 0x95, 0x0f, 0x3c, 0x31, 0xc3, 0xee, 0xf5, 0x74, 0x75, 0xde, 0x1d,
+ 0x97, 0xa6, 0x20, 0x9f, 0xe2, 0xb3, 0x27, 0xfb, 0xfb, 0x09, 0xab, 0x1c,
+ 0x0c, 0x67, 0xe7, 0x18, 0x0f, 0x65, 0x32, 0x4a, 0xfd, 0x3e, 0xbe, 0xcd,
+ 0x26, 0x44, 0xe9, 0x52, 0x71, 0x71, 0xb0, 0xa0, 0x50, 0x94, 0x45, 0x4f,
+ 0x70, 0x25, 0x6e, 0x23, 0xc8, 0x8c, 0xfc, 0x29, 0xa7, 0xf7, 0xae, 0x61,
+ 0xb3, 0xcb, 0x2b, 0x92, 0xae, 0x5c, 0x66, 0xc7, 0xd6, 0xa1, 0x4e, 0xeb,
+ 0x98, 0xde, 0x66, 0xa1, 0xe9, 0xb8, 0xe6, 0xc0, 0x1c, 0x56, 0x94, 0x52,
+ 0x45, 0x0e, 0xe1, 0x8c, 0xab, 0x65, 0x25, 0xe4, 0xe1, 0x88, 0xff, 0xdc,
+ 0xa5, 0xf7, 0xad, 0xeb, 0xde, 0xcc, 0xf8, 0x0b, 0xf3, 0x9f, 0x55, 0x75,
+ 0x5f, 0x53, 0x2d, 0x80, 0x76, 0x95, 0x35, 0x93, 0x9b, 0x80, 0x0a, 0x13,
+ 0x02, 0x9c, 0x94, 0xf7, 0x1b, 0x33, 0x1a, 0xcb, 0x34, 0xb9, 0xaa, 0xb4,
+ 0x8a, 0xcb, 0xe3, 0x31, 0x8d, 0x12, 0x97, 0x2e, 0xaa, 0xab, 0x70, 0xb5,
+ 0x45, 0x96, 0x8a, 0x11, 0xf5, 0xc8, 0xd3, 0xea, 0xa8, 0x2b, 0x04, 0xa5,
+ 0xc9, 0x6b, 0xcd, 0x33, 0x9a, 0xdc, 0x64, 0x73, 0x91, 0x98, 0x5b, 0x8a,
+ 0x24, 0xe9, 0xc9, 0x26, 0xec, 0x85, 0x97, 0x5a, 0xef, 0x4a, 0x7e, 0x63,
+ 0x06, 0xb3, 0x2d, 0x79, 0x3a, 0xf6, 0x9e, 0x13, 0x82, 0xf1, 0xeb, 0x25,
+ 0xd9, 0x8d, 0xe3, 0x54, 0x2e, 0x14, 0xa5, 0xb1, 0x5d, 0x85, 0x83, 0x22,
+ 0xa1, 0x98, 0x55, 0xb8, 0xc7, 0xc8, 0xcd, 0x32, 0x10, 0xed, 0x47, 0xae,
+ 0x55, 0xc4, 0xdd, 0xcc, 0x89, 0x7d, 0x75, 0x72, 0x74, 0x89, 0xa4, 0x99,
+ 0x3e, 0xd0, 0xb5, 0x7d, 0x64, 0xca, 0x84, 0xfc, 0xef, 0xe7, 0x70, 0x83,
+ 0x60, 0xa3, 0x8a, 0x7b, 0x39, 0x75, 0xc8, 0x03, 0xee, 0xa5, 0xa5, 0x63,
+ 0xed, 0x27, 0x3e, 0x73, 0x7f, 0x84, 0x8e, 0xbd, 0xa5, 0x27, 0x5a, 0xbc,
+ 0xc6, 0xd3, 0x67, 0xc3, 0x5d, 0x1e, 0xa3, 0x2b, 0x2f, 0xa7, 0xd8, 0x6e,
+ 0x78, 0x8b, 0x6a, 0xe1, 0xc8, 0x4b, 0x57, 0xf0, 0x7b, 0x6a, 0x77, 0xfa,
+ 0x09, 0x53, 0x42, 0x72, 0xea, 0xa5, 0xfe, 0xd6, 0x03, 0x91, 0xac, 0xd5,
+ 0x4d, 0xfd, 0x7a, 0xbf, 0xb4, 0x2d, 0x3b, 0x4c, 0x7e, 0x14, 0x08, 0x2d,
+ 0x6d, 0x56, 0x86, 0xe4, 0x65, 0xc7, 0xe0, 0xf5, 0xd8, 0x13, 0x89, 0x38,
+ 0xaa, 0x9a, 0xac, 0xe8, 0x3b, 0x3a, 0xf7, 0x92, 0x6e, 0x01, 0xb9, 0xb2,
+ 0x04, 0xaa, 0xdc, 0xaa, 0x81, 0x14, 0xd3, 0x50, 0x02, 0xa6, 0xfc, 0xc1,
+ 0x57, 0x52, 0xc6, 0x8e, 0x35, 0xe5, 0x18, 0x54, 0x9c, 0x96, 0x72, 0x5b,
+ 0xc1, 0x3f, 0x6c, 0xb9, 0xaa, 0xca, 0x39, 0x24, 0x6f, 0x60, 0xc2, 0xeb,
+ 0x2e, 0xfd, 0xe5, 0x32, 0x84, 0xf0, 0x35, 0x07, 0x45, 0x1a, 0xb2, 0x02,
+ 0x19, 0xd1, 0x42, 0x2a, 0x21, 0xa4, 0xf6, 0x72, 0x02, 0x69, 0x27, 0xc0,
+ 0xdc, 0x83, 0x83, 0xaa, 0xf7, 0x39, 0xf9, 0xb4, 0x5f, 0x1e, 0xf6, 0x5a,
+ 0x27, 0x32, 0x46, 0x08, 0x5f, 0xb3, 0x74, 0x6b, 0xdb, 0x32, 0x22, 0xd3,
+ 0x48, 0xee, 0x67, 0x1f, 0x1b, 0xbe, 0xf9, 0xaf, 0x50, 0xda, 0xad, 0x78,
+ 0xb2, 0x9f, 0xd4, 0xf7, 0x46, 0x8d, 0x98, 0xfb, 0x93, 0xd0, 0xad, 0xe5,
+ 0x17, 0xf5, 0xe3, 0xb7, 0x0a, 0x60, 0xb0, 0xdc, 0x7a, 0x47, 0xaf, 0x1c,
+ 0xe2, 0x15, 0xa1, 0xcb, 0x57, 0x18, 0xc3, 0x23, 0x0a, 0x44, 0x96, 0x89,
+ 0x4a, 0xb1, 0xf1, 0x2c, 0x2d, 0x3e, 0xd4, 0x56, 0xd3, 0x46, 0x4b, 0x7d,
+ 0xaa, 0xbb, 0xc4, 0x99, 0x27, 0xee, 0x87, 0x82, 0x6b, 0xc0, 0xcd, 0xd8,
+ 0x69, 0xee, 0xef, 0x4b, 0xd2, 0x4c, 0xe7, 0x69, 0x45, 0x29, 0x09, 0x0f,
+ 0x17, 0x9f, 0x74, 0xd5, 0x27, 0xe3, 0x73, 0xeb, 0xca, 0x51, 0xfe, 0x7e,
+ 0x11, 0xd9, 0xa5, 0xce, 0xba, 0x91, 0xd0, 0xe6, 0xbf, 0x07, 0x1a, 0xab,
+ 0x58, 0x57, 0xa3, 0x1b, 0x8f, 0xdb, 0xca, 0x81, 0x36, 0xba, 0xe1, 0xd7,
+ 0x82, 0x62, 0x65, 0xce, 0x45, 0x54, 0x62, 0xc9, 0x1b, 0xc3, 0xe4, 0xcc,
+ 0x19, 0x8f, 0x45, 0x1f, 0x84, 0x79, 0x4d, 0x35, 0x11, 0xd3, 0x11, 0x7f,
+ 0x1f, 0x68, 0x59, 0xd7, 0xd8, 0x0c, 0xa0, 0x28, 0x02, 0x21, 0x43, 0xee,
+ 0xad, 0xc8, 0x6f, 0xf5, 0xae, 0xaf, 0x0e, 0x7c, 0x96, 0x69, 0x46, 0x86,
+ 0x50, 0x6d, 0x1e, 0x8e, 0xe3, 0xa5, 0x01, 0x38, 0x8d, 0x07, 0x11, 0x2f,
+ 0xc7, 0xc0, 0x51, 0x3d, 0x5b, 0x8d, 0xc9, 0x3d, 0x5e, 0x4b, 0x24, 0x6f,
+ 0x66, 0xee, 0xc0, 0xe5, 0xc2, 0x55, 0x4d, 0xe2, 0x0c, 0xce, 0x59, 0x59,
+ 0xf4, 0x03, 0xee, 0x07, 0x22, 0x9f, 0x64, 0xff, 0x12, 0xc1, 0x22, 0xe6,
+ 0x52, 0x04, 0xcf, 0x56, 0xd2, 0x4a, 0xf9, 0x3d, 0xdd, 0x87, 0xfe, 0x97,
+ 0x1f, 0xa8, 0xd7, 0xc5, 0xec, 0xe2, 0xba, 0x18, 0x66, 0xe3, 0xf5, 0x19,
+ 0xe3, 0x3f, 0x5c, 0xa1, 0xba, 0xf0, 0xc9, 0xff, 0xd6, 0xd8, 0xeb, 0x59,
+ 0x55, 0x1a, 0xa1, 0xf1, 0xdd, 0x33, 0x05, 0x2c, 0x48, 0xfd, 0x3f, 0xb9,
+ 0x9f, 0x64, 0x2d, 0x31, 0xdb, 0xe0, 0x56, 0x89, 0xba, 0x4d, 0x58, 0x1e,
+ 0xea, 0x9b, 0x72, 0x41, 0xb1, 0xd9, 0x56, 0x74, 0x97, 0x85, 0xae, 0x2e,
+ 0xd3, 0x47, 0x14, 0x05, 0x0c, 0xae, 0x4f, 0x36, 0x9f, 0xc5, 0x18, 0x20,
+ 0x43, 0xc1, 0x5c, 0xb9, 0xa4, 0xeb, 0x90, 0x83, 0xc7, 0x08, 0xac, 0x72,
+ 0xdc, 0xe0, 0xea, 0x4b, 0x5d, 0xcf, 0x2f, 0x73, 0x72, 0x02, 0xac, 0xa8,
+ 0xb7, 0xc6, 0x98, 0x3e, 0xb9, 0xe8, 0x1c, 0xc7, 0x64, 0x27, 0xd6, 0x47,
+ 0x9a, 0x45, 0x7d, 0x43, 0x77, 0x33, 0xdd, 0x19, 0x30, 0xfc, 0x36, 0xe2,
+ 0x9c, 0x89, 0x34, 0x69, 0x6f, 0x2f, 0x4f, 0xdf, 0xf4, 0x3b, 0x27, 0x21,
+ 0x28, 0x90, 0xae, 0x5b, 0x53, 0x53, 0xab, 0xc3, 0xac, 0x32, 0x59, 0xd8,
+ 0xbe, 0x2b, 0x55, 0xc4, 0x59, 0x8d, 0x34, 0x75, 0x7d, 0x49, 0x5a, 0xa9,
+ 0x04, 0xfa, 0xac, 0xb6, 0x20, 0xcf, 0x6b, 0xe8, 0xdd, 0x24, 0xc4, 0x4f,
+ 0x0d, 0x3f, 0x01, 0xcc, 0x67, 0x23, 0x6a, 0xcc, 0x76, 0xf4, 0x0a, 0x7c,
+ 0x84, 0xfb, 0xba, 0x6c, 0x1d, 0x1a, 0x7f, 0xc1, 0x68, 0x1b, 0x32, 0xa5,
+ 0x6c, 0xf2, 0xaa, 0xbc, 0x2b, 0x06, 0xa7, 0x94, 0xbf, 0x92, 0x9c, 0x96,
+ 0xd7, 0x64, 0x21, 0xbd, 0x8d, 0x5b, 0xf2, 0xef, 0xce, 0xdf, 0x26, 0x5b,
+ 0x24, 0x89, 0x93, 0x73, 0xcb, 0x5a, 0x42, 0x8f, 0x6e, 0x8b, 0xc6, 0x59,
+ 0xf3, 0x2d, 0x25, 0xbd, 0xe9, 0x27, 0xc7, 0x3f, 0x1c, 0xbe, 0x39, 0x3f,
+ 0x3d, 0xfe, 0x89, 0x95, 0xce, 0x60, 0x38, 0xf4, 0xe3, 0x2f, 0x3d, 0x2d,
+ 0x1c, 0x5e, 0x7b, 0x8a, 0x63, 0x99, 0x9e, 0xdc, 0xaf, 0x92, 0x05, 0x7c,
+ 0x7c, 0x74, 0x0b, 0x8e, 0x46, 0xe7, 0x27, 0x03, 0x25, 0x1c, 0xe1, 0x8a,
+ 0x30, 0x79, 0x41, 0x0a, 0x33, 0x1f, 0x60, 0x25, 0x03, 0xfe, 0x36, 0x0c,
+ 0x50, 0xd8, 0xf3, 0xd0, 0x4f, 0xde, 0x2a, 0x83, 0x67, 0x1f, 0x8b, 0x4e,
+ 0x57, 0xfc, 0xab, 0xfc, 0x1a, 0x51, 0x86, 0x0e, 0x7d, 0x88, 0x96, 0xd0,
+ 0x9e, 0x04, 0xb8, 0x57, 0xca, 0x70, 0xb3, 0xe1, 0xa1, 0x3a, 0x9b, 0xb1,
+ 0x43, 0x6b, 0xa5, 0x14, 0xe5, 0x7a, 0x79, 0x58, 0x45, 0x00, 0x2a, 0x83,
+ 0xf0, 0x89, 0x00, 0x2c, 0xc7, 0x56, 0xea, 0x89, 0x9a, 0xca, 0x3b, 0x84,
+ 0xa5, 0x87, 0x5c, 0x33, 0x56, 0x38, 0x1c, 0x18, 0x5b, 0x7d, 0x99, 0x1c,
+ 0xf4, 0x7e, 0xc7, 0x8b, 0xc4, 0xf7, 0xfe, 0x45, 0x38, 0xe5, 0x6d, 0x34,
+ 0xd5, 0xfa, 0x8a, 0x39, 0xd9, 0x97, 0xdd, 0x98, 0xea, 0x84, 0x81, 0xff,
+ 0xd3, 0x9c, 0x74, 0x51, 0xf1, 0xc6, 0xcb, 0xeb, 0xeb, 0x48, 0x42, 0x30,
+ 0x95, 0x80, 0xc9, 0x32, 0x5c, 0xc5, 0x46, 0x63, 0xd9, 0xac, 0x13, 0xf6,
+ 0xe9, 0x9a, 0xfe, 0xf7, 0x10, 0xab, 0x52, 0x32, 0x86, 0x72, 0x6a, 0x54,
+ 0x97, 0xe4, 0x50, 0xdd, 0xd2, 0xa8, 0x22, 0x1e, 0x36, 0xc7, 0x19, 0x26,
+ 0x9b, 0x5f, 0x6c, 0x2a, 0x9d, 0xb2, 0x51, 0xee, 0xe5, 0x56, 0x26, 0xad,
+ 0xa6, 0xc7, 0x6a, 0xcd, 0x98, 0xcb, 0x0a, 0xf5, 0x93, 0xcd, 0x17, 0x9b,
+ 0xf2, 0x9c, 0x3c, 0xd6, 0x15, 0x38, 0x78, 0x87, 0xa3, 0x3e, 0xac, 0xec,
+ 0x4e, 0xac, 0x5f, 0xcc, 0x4c, 0xef, 0x4d, 0x3e, 0x9d, 0x72, 0x81, 0x79,
+ 0x29, 0xd2, 0x21, 0x1c, 0x41, 0x52, 0xee, 0x2d, 0xb8, 0x98, 0xd0, 0x75,
+ 0xed, 0x39, 0xf7, 0x75, 0xf3, 0xcf, 0xda, 0x03, 0xaf, 0x88, 0x15, 0xb9,
+ 0xa9, 0x5d, 0x6d, 0x09, 0xf9, 0xea, 0xaa, 0x93, 0x82, 0x58, 0x08, 0xcc,
+ 0x25, 0xe8, 0x46, 0x6a, 0x2d, 0x8a, 0xa4, 0x66, 0x75, 0xb6, 0xdf, 0x01,
+ 0xb1, 0x23, 0xd6, 0x11, 0xba, 0xb4, 0x1a, 0xcb, 0x89, 0x85, 0xaa, 0xf0,
+ 0x15, 0xb1, 0x9c, 0x73, 0x8d, 0x49, 0xaa, 0xc2, 0xb1, 0xe2, 0xfb, 0xea,
+ 0xed, 0x73, 0x1b, 0x8f, 0xb3, 0xd1, 0x14, 0x49, 0x48, 0x96, 0x18, 0x1e,
+ 0xcc, 0x0a, 0xf8, 0x7d, 0x55, 0xdb, 0xef, 0x87, 0xf9, 0xd0, 0x5c, 0x81,
+ 0x41, 0x09, 0x98, 0x6d, 0x44, 0xa2, 0x1d, 0x3f, 0x53, 0x24, 0x60, 0x94,
+ 0x89, 0xd5, 0x4b, 0xd7, 0x68, 0x57, 0xcd, 0x10, 0xff, 0x26, 0x28, 0x6a,
+ 0xa3, 0x31, 0x56, 0x51, 0xb1, 0x69, 0x9e, 0xdc, 0x44, 0x05, 0x39, 0x14,
+ 0xce, 0x43, 0xee, 0x07, 0x63, 0x42, 0x7c, 0x50, 0xd4, 0x55, 0xfe, 0x9d,
+ 0x9c, 0xaa, 0x08, 0x1e, 0xf1, 0x95, 0x04, 0x53, 0x5a, 0x35, 0xd1, 0x19,
+ 0x53, 0xcf, 0xae, 0x24, 0xd1, 0x5a, 0x35, 0x64, 0xab, 0xd1, 0xe3, 0x1c,
+ 0x1e, 0xdf, 0x7a, 0x18, 0x51, 0x74, 0x58, 0x71, 0xc1, 0x96, 0x93, 0xd1,
+ 0xb0, 0xcb, 0x15, 0xc1, 0x15, 0x7d, 0xbf, 0x14, 0x86, 0xa6, 0xbe, 0x17,
+ 0x0d, 0x8e, 0x84, 0xdb, 0x70, 0x7f, 0x3c, 0xb1, 0xc5, 0x79, 0xcd, 0xa3,
+ 0x55, 0x5a, 0x71, 0x7d, 0xb4, 0xe2, 0x83, 0xa2, 0x67, 0xa8, 0xf1, 0xec,
+ 0x63, 0x36, 0x59, 0x36, 0x6d, 0xac, 0xb8, 0xaf, 0x7c, 0x29, 0x4f, 0x38,
+ 0xba, 0xb5, 0x85, 0xa3, 0xa0, 0x06, 0xca, 0xb9, 0x66, 0x76, 0x1f, 0xf4,
+ 0xb6, 0x25, 0xb4, 0x47, 0x21, 0x1f, 0x9b, 0xf0, 0x1d, 0x8b, 0xd9, 0x69,
+ 0x9f, 0xab, 0x8c, 0x7d, 0x6c, 0x2e, 0x7c, 0x1d, 0xfd, 0x3c, 0x17, 0x18,
+ 0x8e, 0x7c, 0xfb, 0x35, 0x7b, 0x63, 0xbc, 0x4f, 0xdb, 0xfa, 0x34, 0xe2,
+ 0xa8, 0xa9, 0x83, 0xa3, 0x1c, 0x7c, 0x19, 0xf5, 0xe1, 0x86, 0xc9, 0xa1,
+ 0xad, 0xec, 0xa8, 0xaf, 0xea, 0xfc, 0x07, 0x0e, 0xb2, 0x93, 0xf3, 0xdb,
+ 0xe7, 0x9e, 0x7f, 0x93, 0xee, 0x3c, 0xfc, 0xc8, 0x4a, 0xfc, 0x60, 0x14,
+ 0x1f, 0xaa, 0xf1, 0x53, 0xf3, 0xc7, 0xb7, 0xf4, 0x07, 0x89, 0x55, 0x32,
+ 0x27, 0x99, 0x96, 0x85, 0x3d, 0x73, 0xe1, 0xd6, 0xa6, 0xa4, 0x3a, 0xf9,
+ 0x43, 0x16, 0x1d, 0x58, 0x60, 0x82, 0xf4, 0x13, 0x89, 0x8b, 0xcb, 0xa7,
+ 0x87, 0xf2, 0xab, 0xed, 0xf4, 0x35, 0xcd, 0x26, 0x8e, 0x93, 0x04, 0xe7,
+ 0x08, 0x73, 0x7a, 0xf4, 0xe1, 0x85, 0x18, 0xb1, 0x20, 0x2f, 0x63, 0x89,
+ 0x16, 0x66, 0xaa, 0xfe, 0x41, 0xce, 0x6b, 0x2d, 0x07, 0x8d, 0xea, 0xa4,
+ 0x73, 0x0b, 0xac, 0x85, 0x61, 0x64, 0x63, 0xfc, 0xec, 0xaf, 0xa4, 0x63,
+ 0xc6, 0xe2, 0x2c, 0xc4, 0x57, 0x59, 0xaa, 0x95, 0x55, 0x43, 0xc6, 0xe5,
+ 0x2e, 0x7f, 0x84, 0xb4, 0x65, 0xab, 0xdf, 0x7b, 0x85, 0x34, 0x23, 0x39,
+ 0xf0, 0x7c, 0x14, 0x96, 0x5c, 0xc0, 0x55, 0x17, 0xdb, 0x65, 0x20, 0xf2,
+ 0xc3, 0x62, 0x17, 0xb2, 0x62, 0xb2, 0xa2, 0x9f, 0x54, 0x07, 0x90, 0x89,
+ 0x9b, 0x21, 0x15, 0x3e, 0x68, 0xf4, 0x72, 0x9e, 0xcd, 0x29, 0x18, 0x62,
+ 0xef, 0x45, 0xa6, 0x81, 0x60, 0xf3, 0x9f, 0x3e, 0x36, 0x88, 0x37, 0x37,
+ 0x25, 0xfd, 0x8d, 0xae, 0x58, 0xc6, 0xed, 0xfc, 0x21, 0x88, 0x80, 0xd5,
+ 0xf7, 0xc5, 0xe4, 0xe6, 0xd5, 0xdb, 0x51, 0xfc, 0xf5, 0x70, 0x70, 0x78,
+ 0xde, 0xe8, 0x21, 0xb4, 0x19, 0xa4, 0x46, 0x2e, 0x58, 0x90, 0xa8, 0x62,
+ 0xb8, 0xf7, 0xbb, 0x78, 0x73, 0xad, 0x17, 0xac, 0x6f, 0x88, 0x14, 0x0b,
+ 0x16, 0xe2, 0xa2, 0x79, 0x02, 0xaf, 0x3d, 0x48, 0xe9, 0x28, 0xc4, 0x2b,
+ 0x2f, 0xd9, 0x33, 0x4d, 0x11, 0x04, 0x54, 0xa8, 0x44, 0x93, 0x95, 0x87,
+ 0x3c, 0xea, 0xee, 0x6b, 0x90, 0xb6, 0xeb, 0x1f, 0xbf, 0x64, 0x99, 0x4f,
+ 0xa9, 0xc8, 0x69, 0x24, 0xe0, 0xe4, 0xcf, 0x50, 0x0b, 0x22, 0xe2, 0xc5,
+ 0x03, 0xcd, 0x5e, 0x9d, 0xd1, 0xeb, 0xbc, 0x4d, 0xfb, 0xb2, 0x5b, 0xf1,
+ 0xa3, 0x6a, 0xd5, 0x90, 0xcc, 0xa4, 0xec, 0x7f, 0xfd, 0x55, 0x78, 0x7b,
+ 0xbe, 0x7a, 0xbb, 0xe2, 0x73, 0xf4, 0x9b, 0x81, 0xc2, 0xee, 0x45, 0x23,
+ 0xf0, 0x54, 0xfa, 0x70, 0x2e, 0xe2, 0x04, 0xa1, 0xed, 0x5f, 0x3e, 0x24,
+ 0x25, 0xcc, 0x13, 0xf2, 0xc7, 0xda, 0x07, 0x05, 0x32, 0x1b, 0xff, 0x14,
+ 0x61, 0x69, 0xb7, 0x18, 0xd9, 0x95, 0x5c, 0x70, 0x60, 0xef, 0x5c, 0x34,
+ 0xe1, 0xed, 0xc8, 0x12, 0xad, 0x84, 0xeb, 0x3a, 0x33, 0x28, 0x89, 0x91,
+ 0x1a, 0x90, 0x5c, 0xd8, 0xe7, 0x3f, 0x76, 0xf6, 0x2d, 0x5c, 0xc9, 0xe6,
+ 0x4e, 0xe0, 0x90, 0x9a, 0x0b, 0x3c, 0x54, 0x10, 0x8a, 0xfc, 0xe3, 0x08,
+ 0x31, 0xe6, 0x15, 0xbb, 0x19, 0xc1, 0x68, 0x8e, 0x42, 0xdb, 0x39, 0xa0,
+ 0x8e, 0xaa, 0x26, 0x16, 0xed, 0xc9, 0x88, 0xf3, 0x00, 0x1f, 0xda, 0x4c,
+ 0x79, 0x04, 0x61, 0xb5, 0x8e, 0xb9, 0xe9, 0x8d, 0x51, 0x92, 0xe8, 0x72,
+ 0x7d, 0xf8, 0x18, 0xdb, 0x7d, 0x63, 0xdf, 0x49, 0xb6, 0xc6, 0xe6, 0xc6,
+ 0xf6, 0x32, 0xb1, 0x49, 0xde, 0x3c, 0x05, 0xca, 0x39, 0xde, 0xdc, 0xb3,
+ 0x4f, 0x9f, 0x3d, 0xdd, 0xde, 0xd6, 0x8a, 0x92, 0x0c, 0x98, 0x18, 0x13,
+ 0x50, 0x3f, 0x27, 0xb9, 0xc5, 0xb5, 0xe9, 0x68, 0x82, 0x6f, 0xe0, 0x67,
+ 0xf5, 0x1c, 0x31, 0xf1, 0xe6, 0xe8, 0x1e, 0xd3, 0x57, 0x69, 0x11, 0xc9,
+ 0x04, 0x87, 0x44, 0xb7, 0x66, 0x70, 0xaa, 0x32, 0xb1, 0x76, 0x5e, 0xf8,
+ 0x95, 0x52, 0x01, 0x71, 0x23, 0xe7, 0x87, 0xe2, 0x72, 0xd8, 0x10, 0xa3,
+ 0x7a, 0xd3, 0x86, 0x08, 0xc0, 0x73, 0xbe, 0xf6, 0xe8, 0x0f, 0xda, 0xcf,
+ 0x37, 0x5a, 0x0a, 0xed, 0x7c, 0x39, 0x9e, 0x99, 0x1b, 0x68, 0x44, 0x65,
+ 0x3d, 0x3f, 0x26, 0xa7, 0x79, 0xdd, 0x88, 0x30, 0x86, 0xad, 0xa0, 0xa0,
+ 0xb9, 0x55, 0x77, 0x0e, 0x0f, 0x1c, 0xe9, 0xaa, 0xd8, 0x6a, 0xb2, 0xa4,
+ 0x7c, 0x23, 0xb8, 0x64, 0x27, 0xd6, 0xdb, 0x7a, 0x0b, 0xfe, 0x56, 0xbd,
+ 0xbc, 0x1a, 0xac, 0x1a, 0xd8, 0xc7, 0xac, 0xf6, 0xcc, 0xb8, 0xc1, 0x1d,
+ 0x29, 0x88, 0xc8, 0xb6, 0x26, 0x37, 0x74, 0xf2, 0x82, 0x55, 0xc1, 0xd5,
+ 0x55, 0xbd, 0x34, 0xbd, 0xcf, 0x57, 0x1a, 0xa1, 0x7f, 0xc3, 0x65, 0x9b,
+ 0x5e, 0x51, 0x2e, 0x12, 0x23, 0xe8, 0x66, 0x19, 0x4a, 0xdb, 0x92, 0x20,
+ 0x0b, 0xe0, 0xcf, 0xb6, 0x42, 0xb0, 0x98, 0xf7, 0x89, 0x78, 0x29, 0xc4,
+ 0xff, 0x0a, 0x6c, 0x54, 0x8a, 0x0c, 0x7a, 0x78, 0x6b, 0x38, 0x71, 0x9b,
+ 0xdd, 0xc0, 0x66, 0x00, 0xd3, 0x98, 0x05, 0xd6, 0x76, 0xd0, 0x6b, 0xfa,
+ 0x60, 0xcd, 0x6e, 0x2d, 0xf9, 0x4a, 0xe8, 0x64, 0x89, 0x55, 0x5b, 0x9b,
+ 0x99, 0xc9, 0x20, 0xe3, 0x35, 0xe9, 0x71, 0x7f, 0x08, 0xbc, 0x4f, 0x77,
+ 0x88, 0x46, 0x3f, 0x81, 0x9e, 0x51, 0x0d, 0x9f, 0x75, 0x64, 0x69, 0x1f,
+ 0xb6, 0x77, 0x1a, 0x2b, 0x45, 0xce, 0x3a, 0xdf, 0x97, 0x0a, 0xc2, 0xe9,
+ 0x69, 0xec, 0xb6, 0x65, 0xdc, 0xdb, 0xe6, 0xec, 0xac, 0x44, 0x72, 0x08,
+ 0x39, 0xa0, 0x8d, 0x52, 0x83, 0xb4, 0x6a, 0xa6, 0xd1, 0x41, 0x2f, 0xae,
+ 0xf8, 0xda, 0x39, 0x00, 0x03, 0x39, 0xac, 0xd0, 0x96, 0x85, 0xa6, 0x5f,
+ 0x51, 0x83, 0x9c, 0x00, 0xb8, 0x4d, 0xde, 0x2c, 0x43, 0xe9, 0x28, 0x11,
+ 0x3e, 0x64, 0x5c, 0x22, 0x4c, 0x41, 0x2b, 0xe1, 0xd2, 0x22, 0x61, 0x8e,
+ 0x11, 0x56, 0x8f, 0x0a, 0x07, 0xd5, 0x89, 0x3d, 0xcd, 0xc8, 0x25, 0x9b,
+ 0x95, 0x77, 0x01, 0x86, 0x97, 0xdc, 0xa9, 0xae, 0x77, 0xed, 0x64, 0x06,
+ 0x2a, 0x10, 0xff, 0x9f, 0xfa, 0xcb, 0xf7, 0x34, 0x59, 0xff, 0xa5, 0x93,
+ 0x25, 0xdd, 0x4e, 0x83, 0xc4, 0x3f, 0xd8, 0xc1, 0x7f, 0xc2, 0xa4, 0xfc,
+ 0x8d, 0x10, 0x29, 0x3c, 0x33, 0xa6, 0xcb, 0x73, 0x34, 0xf7, 0xa7, 0xa1,
+ 0xd5, 0x77, 0xb5, 0x09, 0x4a, 0x63, 0x62, 0xab, 0x7e, 0x7c, 0x1f, 0xf8,
+ 0x8e, 0x68, 0x0f, 0xfe, 0x54, 0xf4, 0xc1, 0xaa, 0x67, 0x4c, 0xaf, 0x14,
+ 0xe5, 0x67, 0xa9, 0x34, 0x14, 0x2f, 0xe3, 0x4f, 0x95, 0x64, 0xd0, 0x1b,
+ 0xa3, 0xc3, 0x74, 0x9c, 0x0c, 0x32, 0xfe, 0x79, 0x68, 0x01, 0x10, 0x5a,
+ 0xe6, 0x00, 0xab, 0xf1, 0xa7, 0x41, 0x7d, 0x3f, 0x1f, 0x97, 0x33, 0xd9,
+ 0xe8, 0x34, 0x5c, 0xd3, 0x67, 0xfd, 0x19, 0x2f, 0x0b, 0x22, 0x1b, 0x03,
+ 0x2f, 0x0b, 0xb6, 0x1f, 0x65, 0xfe, 0x25, 0x13, 0xa5, 0x9c, 0x4c, 0x90,
+ 0x8e, 0x42, 0x28, 0x6e, 0xb3, 0xdd, 0xff, 0x94, 0x30, 0x14, 0x07, 0x81,
+ 0x37, 0x2e, 0x71, 0x34, 0xd5, 0x40, 0xe7, 0xd2, 0x15, 0x0f, 0x8d, 0x66,
+ 0x81, 0x44, 0x37, 0x8f, 0xb7, 0x3a, 0xd6, 0xb6, 0x88, 0x65, 0x10, 0xd3,
+ 0x09, 0x35, 0x1d, 0x7d, 0x8f, 0xac, 0x13, 0xd9, 0x77, 0x47, 0xfc, 0xb3,
+ 0xc1, 0x25, 0x7e, 0xa6, 0xb8, 0x03, 0xc9, 0x58, 0xa3, 0x48, 0xb6, 0xa4,
+ 0x94, 0x91, 0x8f, 0x32, 0x2e, 0xa5, 0xda, 0x60, 0x26, 0x14, 0x88, 0x2c,
+ 0xc2, 0xfb, 0x4a, 0x0f, 0xd3, 0x7b, 0x4e, 0xdb, 0x37, 0x36, 0xff, 0xfa,
+ 0xd6, 0xc0, 0xa1, 0x3e, 0x6b, 0xf2, 0x79, 0x2a, 0xf0, 0x1f, 0xc6, 0xfb,
+ 0xd8, 0x6d, 0xac, 0xa4, 0x13, 0x40, 0x83, 0x9a, 0xfd, 0x36, 0x7c, 0xa8,
+ 0x39, 0xba, 0x10, 0x15, 0xcc, 0x2e, 0x48, 0x09, 0xf2, 0x3d, 0x99, 0x2b,
+ 0x47, 0xef, 0xdf, 0xa6, 0x9c, 0x31, 0x44, 0x83, 0x5a, 0x7e, 0x60, 0xac,
+ 0xa5, 0xe6, 0x79, 0x8a, 0x47, 0x89, 0xc1, 0x1a, 0x67, 0xfd, 0xc4, 0x45,
+ 0x03, 0x15, 0x06, 0x95, 0x50, 0xe0, 0x70, 0x7d, 0x73, 0x36, 0xaa, 0x68,
+ 0xdd, 0xfb, 0x27, 0xe4, 0xe9, 0x42, 0x0c, 0x78, 0xc9, 0x3e, 0xb2, 0x1c,
+ 0xa5, 0xdd, 0xc9, 0xab, 0x19, 0x89, 0x1d, 0x25, 0x11, 0x11, 0x8b, 0xb8,
+ 0xd3, 0x7f, 0x78, 0xd1, 0x49, 0x76, 0xfc, 0x0c, 0xbc, 0xa8, 0xe4, 0x50,
+ 0xeb, 0x00, 0xaf, 0x6f, 0x6e, 0x75, 0x51, 0xe2, 0xab, 0x66, 0xf1, 0x9e,
+ 0x4a, 0xaa, 0xde, 0xbf, 0x27, 0x5c, 0x1f, 0xd6, 0x4c, 0x7d, 0xee, 0xf8,
+ 0x01, 0x66, 0x96, 0x73, 0xe4, 0x96, 0x0b, 0x6a, 0x07, 0x9b, 0x7c, 0x56,
+ 0xb2, 0x41, 0xf3, 0xd0, 0x30, 0xda, 0x08, 0x3a, 0x3f, 0x17, 0x7b, 0xab,
+ 0x5d, 0x65, 0xe3, 0x69, 0xd0, 0x31, 0x0a, 0xd8, 0xbf, 0x47, 0xa4, 0xcf,
+ 0x6e, 0x26, 0x73, 0xdd, 0x64, 0x55, 0x3e, 0xf1, 0x4b, 0x4e, 0xe1, 0x01,
+ 0x6c, 0x29, 0xe6, 0x5e, 0xa2, 0xd0, 0x5f, 0x94, 0x64, 0xae, 0xf3, 0x3f,
+ 0xf0, 0x8e, 0x4a, 0x85, 0x2d, 0x94, 0xdb, 0x55, 0x80, 0x58, 0x22, 0xb1,
+ 0x59, 0x42, 0x22, 0xb8, 0x88, 0xed, 0xc9, 0x03, 0xe3, 0x04, 0x8b, 0xe5,
+ 0x3e, 0xc6, 0x6a, 0xd4, 0xb3, 0xb4, 0xb6, 0x1d, 0xe4, 0x11, 0xd8, 0x92,
+ 0xab, 0x1c, 0x20, 0xb9, 0x09, 0x88, 0x02, 0xc3, 0x73, 0xc8, 0x90, 0x1d,
+ 0xba, 0xf5, 0x87, 0x2b, 0x66, 0x86, 0xa1, 0x96, 0x22, 0x03, 0xdc, 0xd4,
+ 0xf0, 0x94, 0x88, 0x9e, 0xd3, 0x9d, 0x94, 0x18, 0x46, 0x30, 0xe9, 0xe2,
+ 0xdf, 0x95, 0x64, 0x64, 0x8b, 0x5d, 0xdb, 0xa9, 0x90, 0x12, 0x6f, 0x0b,
+ 0x0e, 0x4c, 0x75, 0x24, 0xe5, 0x25, 0x79, 0xa8, 0x39, 0x88, 0xa1, 0xce,
+ 0x82, 0xef, 0xaf, 0x5a, 0x70, 0x55, 0x68, 0x65, 0x58, 0xf4, 0x33, 0xeb,
+ 0xd4, 0xf0, 0x07, 0x95, 0x58, 0x19, 0x34, 0xbb, 0x4f, 0xa2, 0x44, 0xa6,
+ 0x9d, 0xff, 0xf1, 0x3f, 0xff, 0x2c, 0x56, 0x2d, 0x1b, 0xc8, 0xcb, 0xf7,
+ 0xf9, 0xc2, 0x13, 0x5e, 0x5e, 0x19, 0x5d, 0x8b, 0xe6, 0x62, 0x80, 0x26,
+ 0x9d, 0x08, 0x0f, 0xe2, 0x45, 0xa7, 0xfc, 0xa1, 0x69, 0x98, 0x20, 0x97,
+ 0x31, 0x61, 0xd3, 0xd9, 0x23, 0x3b, 0x1b, 0xa8, 0x96, 0x24, 0x86, 0xf4,
+ 0xc9, 0x39, 0x4a, 0x04, 0xaf, 0x6f, 0x0e, 0x2e, 0xa4, 0x56, 0xc1, 0xf1,
+ 0xcf, 0x56, 0x0e, 0x89, 0xcb, 0x5c, 0xcb, 0x90, 0xb8, 0xfb, 0x3e, 0x99,
+ 0xb1, 0x60, 0xe9, 0x19, 0xac, 0xd2, 0xee, 0xe6, 0xfa, 0x3e, 0x78, 0x63,
+ 0x78, 0xb0, 0x27, 0xe6, 0x5b, 0xef, 0x2d, 0x19, 0xa6, 0xb9, 0xa6, 0xa5,
+ 0x7c, 0xb4, 0xf9, 0xb6, 0xd1, 0x0b, 0x1c, 0x4d, 0x26, 0xea, 0x74, 0xca,
+ 0x4e, 0xe5, 0xae, 0xc4, 0xf5, 0xd9, 0x24, 0xa2, 0xde, 0x76, 0xf6, 0xd7,
+ 0x93, 0x68, 0x1f, 0xb4, 0xe8, 0x57, 0x6d, 0xfb, 0x60, 0xba, 0xe0, 0x7e,
+ 0x28, 0xfb, 0x8b, 0x2e, 0x41, 0x73, 0x6c, 0xa4, 0x14, 0x9f, 0x32, 0xda,
+ 0xfc, 0xba, 0x7d, 0x1e, 0xf6, 0x03, 0x87, 0xe9, 0x7d, 0x5d, 0xcf, 0x68,
+ 0xb3, 0xe7, 0x57, 0xf7, 0xa6, 0x53, 0xf5, 0xca, 0x6c, 0x65, 0xff, 0x2e,
+ 0xe5, 0xe7, 0x74, 0xc1, 0x3c, 0xcb, 0x72, 0xb3, 0x86, 0xf3, 0x6f, 0x91,
+ 0x51, 0xc1, 0x63, 0x26, 0x62, 0x7c, 0x60, 0xc6, 0xc0, 0xd3, 0x88, 0xcf,
+ 0xbb, 0x80, 0x98, 0xc8, 0x50, 0xab, 0x37, 0x0c, 0xa9, 0x06, 0x26, 0x8c,
+ 0xa6, 0x07, 0x07, 0xdf, 0x6a, 0x89, 0x1a, 0x71, 0x31, 0xe0, 0xf6, 0x84,
+ 0x50, 0xaa, 0x56, 0x30, 0x21, 0x3a, 0xff, 0xef, 0x59, 0xac, 0x20, 0x70,
+ 0xab, 0x55, 0x2e, 0x6d, 0x25, 0xd7, 0x54, 0x76, 0x87, 0x86, 0x5e, 0x07,
+ 0xa7, 0x74, 0x2f, 0xce, 0x22, 0x3c, 0x93, 0x49, 0x88, 0x5c, 0xe0, 0xba,
+ 0x02, 0x00, 0xb0, 0xba, 0xc5, 0xde, 0x22, 0x6c, 0x0b, 0x7d, 0x8b, 0xab,
+ 0xaf, 0xe2, 0x17, 0xab, 0x7d, 0x91, 0x8e, 0x50, 0xa9, 0xd9, 0xb6, 0xb8,
+ 0x1d, 0xd5, 0xda, 0x04, 0xb2, 0x00, 0x46, 0x24, 0xdc, 0x01, 0x13, 0xa2,
+ 0xe0, 0x06, 0x46, 0x27, 0x7d, 0x68, 0xdb, 0x08, 0x09, 0x17, 0x97, 0xa6,
+ 0x80, 0xa9, 0x73, 0x0d, 0xb2, 0x88, 0xb2, 0xb3, 0x95, 0xcc, 0xfd, 0x12,
+ 0x99, 0x39, 0xba, 0x57, 0xad, 0xd0, 0xba, 0x74, 0x57, 0x6d, 0x5b, 0x74,
+ 0xfd, 0xd3, 0x07, 0x7c, 0x85, 0x90, 0xea, 0xc8, 0xa1, 0x87, 0xee, 0xc8,
+ 0xa8, 0x68, 0x90, 0x31, 0xa8, 0x94, 0xf2, 0xc6, 0xb0, 0x4a, 0x4a, 0xfd,
+ 0x5e, 0x42, 0x4a, 0x80, 0x83, 0x2d, 0x9b, 0x0e, 0x48, 0x32, 0xf9, 0xc5,
+ 0x56, 0xed, 0xf8, 0xea, 0x28, 0xd3, 0x68, 0x6a, 0x3d, 0xeb, 0xdb, 0x31,
+ 0xee, 0x8e, 0xae, 0x46, 0x67, 0x76, 0xb0, 0x7f, 0x69, 0x21, 0x6e, 0xfb,
+ 0xe0, 0xd9, 0x20, 0xf2, 0x93, 0xf7, 0x96, 0x38, 0x99, 0x23, 0x1c, 0xa8,
+ 0x16, 0xea, 0x4a, 0x7c, 0x33, 0x8d, 0x0d, 0x9f, 0x5f, 0x92, 0x5c, 0xfa,
+ 0x74, 0xc4, 0x99, 0x85, 0xd6, 0x34, 0x58, 0xba, 0xae, 0x35, 0x4d, 0xb0,
+ 0xb2, 0x4d, 0x21, 0xe6, 0xf8, 0xc0, 0x49, 0x23, 0x42, 0xb2, 0xe8, 0x17,
+ 0xf5, 0x10, 0xcb, 0x9c, 0xf2, 0x27, 0xd7, 0x8c, 0xc0, 0x33, 0x9d, 0xd7,
+ 0x7f, 0xd1, 0x17, 0x11, 0xf1, 0x4f, 0x0b, 0x72, 0x3a, 0x79, 0xdc, 0xd4,
+ 0xad, 0x84, 0xa7, 0x83, 0x33, 0xda, 0xad, 0x03, 0xb5, 0x95, 0x52, 0xc4,
+ 0xfd, 0xda, 0x63, 0xb5, 0x66, 0xa6, 0x71, 0x67, 0xde, 0x18, 0xd9, 0x59,
+ 0x2f, 0x2b, 0xae, 0xe5, 0xfa, 0xb0, 0xba, 0xa7, 0x1e, 0x1c, 0xdb, 0x1e,
+ 0xd1, 0x15, 0xb5, 0xe9, 0xb6, 0x57, 0xf4, 0xca, 0x0e, 0x11, 0x93, 0xab,
+ 0xdd, 0x52, 0xcc, 0xf8, 0x6f, 0xd4, 0x2b, 0x6e, 0xed, 0x31, 0x7d, 0xfa,
+ 0x67, 0xef, 0xb5, 0xee, 0x4d, 0xc6, 0x94, 0xc2, 0x7a, 0xc3, 0x3c, 0x4a,
+ 0xd8, 0xaf, 0xbf, 0xca, 0x5a, 0xb7, 0xd5, 0xc3, 0x67, 0x76, 0xd5, 0x55,
+ 0xb6, 0x17, 0x13, 0x21, 0x24, 0x1d, 0xde, 0xa7, 0x8b, 0x85, 0x88, 0x9d,
+ 0x87, 0xc7, 0xce, 0x84, 0x30, 0x5c, 0x19, 0x8b, 0xb8, 0xd9, 0xa5, 0xa6,
+ 0x75, 0x53, 0x96, 0x1f, 0x12, 0x81, 0x96, 0x30, 0xc0, 0x8a, 0x42, 0x99,
+ 0xeb, 0x9b, 0xe3, 0x1a, 0xca, 0xfc, 0x38, 0xb1, 0xe2, 0x8e, 0x46, 0xdf,
+ 0xec, 0x64, 0xcd, 0xc4, 0xca, 0xc0, 0x1d, 0x07, 0x9a, 0x62, 0xb3, 0xec,
+ 0xa1, 0x9b, 0x09, 0x42, 0x18, 0x25, 0x32, 0x68, 0x1e, 0xac, 0x8b, 0xf1,
+ 0xb1, 0xd3, 0xd0, 0xb6, 0x50, 0x7e, 0xa7, 0x81, 0x12, 0xa1, 0x5e, 0x62,
+ 0xbf, 0xc4, 0x65, 0x58, 0xb3, 0x56, 0xdf, 0xb7, 0x1e, 0xda, 0xe7, 0x62,
+ 0xdc, 0xb4, 0xc7, 0x18, 0x1d, 0x11, 0xd9, 0xdd, 0x84, 0x96, 0x58, 0x2e,
+ 0xfe, 0x0f, 0x2c, 0x2c, 0xb2, 0x08, 0x5c, 0x2c, 0x0e, 0xe8, 0x92, 0x87,
+ 0xbb, 0xbc, 0x20, 0x13, 0x97, 0xad, 0xd8, 0x87, 0xfb, 0xac, 0x65, 0xe9,
+ 0x49, 0xe1, 0x8d, 0x74, 0x1b, 0xbd, 0x66, 0x5c, 0xed, 0x2f, 0xe8, 0x33,
+ 0x67, 0xd2, 0x49, 0x1f, 0xd0, 0x65, 0xb8, 0x0c, 0x6d, 0x3d, 0x72, 0xa3,
+ 0x55, 0x5c, 0xe7, 0xc5, 0x63, 0x7c, 0x3f, 0x16, 0xe2, 0xc0, 0x98, 0x81,
+ 0x6c, 0x60, 0x5b, 0x95, 0x2c, 0x2e, 0x8e, 0x62, 0x50, 0xe2, 0xfe, 0x83,
+ 0x62, 0x22, 0x15, 0x3a, 0x3f, 0x12, 0x15, 0x9e, 0x3f, 0x74, 0xa2, 0x1e,
+ 0x0b, 0x02, 0x41, 0xe4, 0x93, 0x25, 0xa5, 0x30, 0x47, 0x0a, 0xbe, 0x05,
+ 0x5e, 0x0e, 0xa3, 0x03, 0x70, 0xea, 0xc2, 0x2d, 0xc5, 0x34, 0x57, 0xac,
+ 0x85, 0xd5, 0xf5, 0x56, 0x6c, 0x10, 0xaa, 0x06, 0x8e, 0x79, 0x96, 0xb2,
+ 0xea, 0xfa, 0xfc, 0x83, 0x62, 0xca, 0x88, 0xb8, 0x45, 0xed, 0xa5, 0xc3,
+ 0x62, 0x9b, 0xf0, 0x46, 0xed, 0xeb, 0xe1, 0xe8, 0x27, 0x8f, 0xde, 0x0a,
+ 0x42, 0xeb, 0x25, 0x73, 0xeb, 0xd1, 0x93, 0x91, 0x55, 0xc4, 0x44, 0x85,
+ 0xf4, 0xcb, 0x74, 0xa2, 0xea, 0xfe, 0x43, 0xbd, 0x4b, 0xb9, 0xd0, 0x43,
+ 0x7b, 0x12, 0x18, 0x83, 0xd1, 0xba, 0x64, 0x18, 0x5a, 0xf2, 0x18, 0x11,
+ 0xcf, 0xd9, 0xcd, 0x0c, 0x0d, 0xd6, 0xac, 0x28, 0x7f, 0xbe, 0xea, 0xe1,
+ 0xe3, 0xb5, 0xd2, 0xa8, 0x91, 0x86, 0xbe, 0xa2, 0xe7, 0x8f, 0x3f, 0x3e,
+ 0xbf, 0x8f, 0x88, 0x63, 0x8c, 0x0f, 0x69, 0x2a, 0x91, 0xc3, 0x33, 0xce,
+ 0x1e, 0x6b, 0x20, 0x13, 0x73, 0x5e, 0xe7, 0x18, 0x75, 0x05, 0x84, 0x22,
+ 0xda, 0xc2, 0xf2, 0xf5, 0x11, 0xcd, 0x40, 0x56, 0xa0, 0x85, 0xfe, 0x25,
+ 0x1a, 0x4f, 0x26, 0xf2, 0x24, 0x0b, 0x73, 0x46, 0xc7, 0x87, 0xc3, 0x02,
+ 0x0f, 0x7a, 0x9c, 0xa8, 0x4e, 0x66, 0x74, 0x09, 0x44, 0x57, 0x6c, 0xe9,
+ 0x6f, 0xe1, 0x3c, 0x6b, 0x12, 0xab, 0x64, 0x95, 0x03, 0x9e, 0xf8, 0x98,
+ 0x6d, 0x44, 0xde, 0xb0, 0xc8, 0x69, 0x05, 0x3d, 0xaa, 0xaa, 0xea, 0xfc,
+ 0x65, 0x9b, 0x6e, 0x01, 0x8f, 0x1a, 0xa5, 0x3d, 0x81, 0x09, 0x90, 0x0c,
+ 0x7e, 0xe5, 0x3d, 0x80, 0x6d, 0x42, 0x5a, 0xc6, 0xe0, 0x21, 0x5f, 0xac,
+ 0x7a, 0xad, 0x09, 0x80, 0x87, 0x54, 0xdc, 0xd9, 0xd4, 0xab, 0xef, 0x27,
+ 0x86, 0xaa, 0x25, 0xf4, 0x3c, 0x58, 0xdf, 0x9c, 0x52, 0x01, 0xff, 0x8e,
+ 0x24, 0x70, 0x1f, 0x53, 0x73, 0x0a, 0xa2, 0xa0, 0xf4, 0x3a, 0xc5, 0x45,
+ 0x64, 0x93, 0x40, 0xad, 0x53, 0xbd, 0x5d, 0x55, 0xaa, 0x5d, 0x34, 0xa2,
+ 0x6e, 0xca, 0x20, 0x6f, 0x87, 0x94, 0x3d, 0x8a, 0x39, 0xe2, 0xb6, 0x30,
+ 0x56, 0x56, 0xca, 0xe9, 0x77, 0x85, 0x11, 0x09, 0x0d, 0x7b, 0x9f, 0xc5,
+ 0x57, 0x4f, 0x5d, 0xc9, 0xc7, 0xcb, 0x06, 0x61, 0x6a, 0x47, 0x11, 0x16,
+ 0x01, 0xa5, 0x4b, 0x62, 0x18, 0xbe, 0x66, 0xfd, 0x9f, 0x1f, 0xa7, 0xd7,
+ 0xc3, 0xb2, 0xca, 0xe9, 0xc6, 0x01, 0xe6, 0x4e, 0x5b, 0xa3, 0xad, 0xdf,
+ 0x87, 0x3c, 0x21, 0x9b, 0x22, 0xd6, 0x9c, 0x44, 0x5e, 0x12, 0xe5, 0xfb,
+ 0x6a, 0xb7, 0x3b, 0xc7, 0x66, 0x45, 0x00, 0xc6, 0xb6, 0xe9, 0xaa, 0x87,
+ 0xc5, 0x22, 0x94, 0x92, 0x51, 0x93, 0xb8, 0x72, 0x4a, 0x8a, 0x19, 0xb0,
+ 0x43, 0x76, 0x63, 0xa5, 0xd8, 0xd8, 0x5d, 0x5a, 0x21, 0x37, 0x34, 0xf0,
+ 0x50, 0xe4, 0x75, 0xbd, 0xc4, 0x82, 0xbd, 0x3e, 0x39, 0x3d, 0xb6, 0xa0,
+ 0xa0, 0xff, 0xbd, 0x33, 0xa4, 0x09, 0xaf, 0x26, 0x01, 0x04, 0x8a, 0x93,
+ 0xb2, 0xbc, 0x0c, 0x3b, 0xc9, 0xda, 0xfa, 0xb6, 0xcf, 0xa5, 0x67, 0xf0,
+ 0xe3, 0x56, 0xca, 0xd6, 0xf1, 0xdb, 0xef, 0x4e, 0x2e, 0xce, 0xde, 0xbe,
+ 0x39, 0x7e, 0x6b, 0xbd, 0xbd, 0x74, 0x28, 0x62, 0xfc, 0xb1, 0x75, 0x18,
+ 0xf4, 0xcd, 0x29, 0x5e, 0x40, 0x24, 0x86, 0xa8, 0x99, 0x45, 0x54, 0x1b,
+ 0x8b, 0x85, 0xfc, 0x6b, 0xe8, 0x37, 0xe7, 0x3d, 0xa4, 0x1e, 0x5f, 0x8a,
+ 0xc3, 0x2f, 0xc8, 0xde, 0x9f, 0x52, 0xe8, 0x6d, 0xc8, 0x3e, 0x62, 0x5b,
+ 0xba, 0x8b, 0x28, 0x6c, 0x3f, 0x4e, 0x32, 0x29, 0x5d, 0x4a, 0x09, 0x1a,
+ 0x1b, 0x76, 0x4a, 0x38, 0x4a, 0xe4, 0x82, 0x69, 0xad, 0x4e, 0xb8, 0xcd,
+ 0xfd, 0x8e, 0x93, 0x06, 0xe3, 0x5c, 0xb8, 0x0c, 0x00, 0x6f, 0x5c, 0xe9,
+ 0x4f, 0xce, 0xec, 0x54, 0xe7, 0xbc, 0xd2, 0x57, 0x7b, 0x10, 0x3a, 0x97,
+ 0x71, 0xeb, 0x57, 0x19, 0xeb, 0xc6, 0xfd, 0xbc, 0x51, 0xfc, 0xa8, 0x2e,
+ 0x84, 0x83, 0x9d, 0x9d, 0x9f, 0x51, 0xe0, 0xee, 0x0b, 0xa9, 0x70, 0x17,
+ 0x12, 0xa2, 0xd5, 0x5e, 0x47, 0x44, 0xe4, 0x7a, 0x29, 0x3c, 0xb4, 0x6f,
+ 0xed, 0x74, 0xc2, 0x39, 0xf8, 0xfe, 0xfc, 0xe2, 0xec, 0x87, 0xbf, 0xfe,
+ 0xc6, 0x9f, 0xf0, 0xb0, 0x3a, 0x3f, 0x12, 0x84, 0x4d, 0x1b, 0xff, 0xf9,
+ 0x57, 0x7d, 0x6d, 0xed, 0xe7, 0xda, 0xed, 0xf7, 0xdb, 0x75, 0x58, 0x83,
+ 0x04, 0x25, 0x64, 0x43, 0x32, 0xed, 0xbc, 0xe6, 0x46, 0x3a, 0xab, 0xd7,
+ 0x02, 0x68, 0xf8, 0x86, 0xab, 0x7d, 0xc2, 0x07, 0xa8, 0xbb, 0x5d, 0x37,
+ 0x1d, 0xc8, 0x1e, 0x90, 0xa2, 0xe7, 0x00, 0x90, 0x9a, 0xa6, 0x49, 0xa9,
+ 0x98, 0x9c, 0xac, 0x09, 0x40, 0x9f, 0x9d, 0x8f, 0xc3, 0xd3, 0xd3, 0x5f,
+ 0x3f, 0x09, 0x5a, 0xa8, 0xb0, 0x3d, 0x0d, 0xa8, 0x13, 0x66, 0x07, 0x34,
+ 0xb0, 0x5a, 0xaa, 0x1e, 0x81, 0x75, 0xbc, 0x74, 0x6f, 0xcf, 0xa4, 0x37,
+ 0x2f, 0xa0, 0x1e, 0x0f, 0xea, 0xcc, 0x28, 0xb5, 0x54, 0x97, 0x39, 0x99,
+ 0x11, 0x26, 0xc6, 0x98, 0xdb, 0xd4, 0xb1, 0xa0, 0x1a, 0x98, 0xff, 0x4b,
+ 0x06, 0xa3, 0xf1, 0x3c, 0x72, 0x2e, 0x11, 0xd0, 0xde, 0xa5, 0x25, 0xf8,
+ 0xe0, 0x42, 0x85, 0x52, 0xb1, 0xf2, 0x2a, 0x89, 0x54, 0x42, 0xc3, 0x8d,
+ 0x40, 0xd7, 0x6c, 0x95, 0xd7, 0x1f, 0x00, 0x85, 0xa7, 0x83, 0x09, 0x65,
+ 0x57, 0xf3, 0x60, 0x49, 0xd7, 0x45, 0x57, 0x56, 0xf0, 0x89, 0x93, 0x6f,
+ 0xec, 0x09, 0x51, 0x68, 0xf1, 0x9d, 0x12, 0x3d, 0xa9, 0x5a, 0x88, 0xc8,
+ 0xed, 0x27, 0x24, 0x93, 0x77, 0x04, 0xe5, 0x95, 0xcd, 0xa1, 0xf1, 0x8f,
+ 0xa7, 0x0b, 0xa5, 0x72, 0xf1, 0x15, 0xf2, 0xec, 0xea, 0xe4, 0xbd, 0x64,
+ 0x95, 0x12, 0x19, 0xe6, 0x41, 0xa2, 0xbc, 0xe4, 0xba, 0xc8, 0xdd, 0x3d,
+ 0xf8, 0x98, 0x68, 0xaa, 0x3b, 0x4f, 0x89, 0x9f, 0x0f, 0xa3, 0xbf, 0x79,
+ 0x4c, 0x73, 0x66, 0x37, 0xc2, 0xe5, 0x40, 0xa1, 0x71, 0xd9, 0x1c, 0xe6,
+ 0x0f, 0x02, 0x20, 0x36, 0xb2, 0x35, 0x81, 0x12, 0xcd, 0x39, 0x1d, 0xbc,
+ 0xaf, 0x3a, 0x7b, 0x00, 0x85, 0x08, 0x47, 0xe0, 0x3e, 0xf1, 0x70, 0x97,
+ 0x23, 0xd1, 0x39, 0xf3, 0x18, 0xb9, 0x40, 0x99, 0xff, 0xc0, 0x6f, 0xcf,
+ 0xf5, 0x97, 0x55, 0x43, 0xe9, 0x2b, 0x7a, 0x2a, 0x5b, 0x25, 0x16, 0x04,
+ 0x31, 0xeb, 0xcd, 0x3b, 0xd4, 0xfc, 0xf7, 0xf2, 0xec, 0xe8, 0xec, 0xd4,
+ 0xfc, 0xe5, 0xf8, 0xf5, 0xc9, 0x0f, 0xee, 0x12, 0x93, 0x0d, 0x60, 0x33,
+ 0x51, 0x38, 0x0c, 0xa8, 0x85, 0x2b, 0x7d, 0xe9, 0xc1, 0x48, 0xa6, 0x80,
+ 0xfd, 0xa2, 0xcd, 0xdc, 0xe6, 0x1d, 0x4b, 0xa9, 0x3d, 0xd9, 0xaa, 0x23,
+ 0x29, 0xd4, 0x1b, 0xa4, 0xf4, 0x71, 0xab, 0x16, 0x39, 0xed, 0x76, 0xe6,
+ 0x49, 0xeb, 0x44, 0x42, 0x11, 0xf0, 0x2f, 0xba, 0xf6, 0x59, 0xe6, 0x4e,
+ 0x21, 0xa4, 0x9c, 0x5f, 0x59, 0xed, 0xdf, 0xaf, 0x99, 0xa7, 0x19, 0x14,
+ 0x42, 0xc6, 0x4c, 0xd1, 0x55, 0x47, 0xd3, 0x47, 0x4a, 0x59, 0xdf, 0x1b,
+ 0xa4, 0xea, 0x67, 0x4d, 0x95, 0xe1, 0x1c, 0x03, 0xa7, 0xd1, 0xca, 0xf2,
+ 0xee, 0x00, 0x0d, 0xe9, 0x56, 0x75, 0xcd, 0xb5, 0xc7, 0x24, 0x13, 0x20,
+ 0x78, 0x20, 0xc4, 0x89, 0x51, 0xfc, 0xdb, 0x41, 0x4e, 0xb8, 0xde, 0xa3,
+ 0x99, 0xab, 0x68, 0x7a, 0x50, 0xce, 0xf7, 0x22, 0xb1, 0xd1, 0xdd, 0xa6,
+ 0x48, 0xc6, 0xa0, 0x22, 0xa5, 0x52, 0x24, 0xb2, 0xd3, 0x46, 0xfa, 0xab,
+ 0x1a, 0x49, 0xdb, 0xad, 0x3c, 0xfb, 0x35, 0x8d, 0x3c, 0xeb, 0xb4, 0x71,
+ 0xf3, 0xab, 0x1a, 0xb1, 0x95, 0xa2, 0x8d, 0x2a, 0xf4, 0xc3, 0xc9, 0x65,
+ 0x72, 0x74, 0xf6, 0xca, 0xed, 0xd1, 0x4b, 0x0b, 0x77, 0x4c, 0x93, 0xf1,
+ 0xb2, 0x30, 0xab, 0x48, 0x3c, 0xdc, 0xa8, 0x2e, 0x45, 0xcd, 0x30, 0x08,
+ 0x92, 0xc3, 0xf2, 0x4a, 0xf0, 0x60, 0xbe, 0x94, 0xe3, 0x47, 0x15, 0x47,
+ 0xdb, 0x7d, 0x92, 0x3c, 0x79, 0x7c, 0x4e, 0x74, 0x11, 0xd7, 0x8e, 0xe6,
+ 0x8f, 0x76, 0x36, 0xb1, 0x06, 0xa5, 0x95, 0x26, 0x62, 0x8d, 0x53, 0x22,
+ 0x85, 0x28, 0x38, 0xa3, 0x88, 0xa0, 0xdc, 0x2d, 0xa6, 0xc6, 0x0d, 0x3f,
+ 0xe3, 0xd4, 0x27, 0x6c, 0x34, 0x2a, 0x53, 0xde, 0x48, 0x6f, 0x5a, 0x08,
+ 0xa3, 0x3d, 0x45, 0xc8, 0xb6, 0x76, 0x8c, 0xd4, 0x37, 0x80, 0x91, 0x43,
+ 0x50, 0x48, 0x10, 0xc9, 0xe0, 0x3c, 0x92, 0x2e, 0x54, 0x38, 0xa4, 0x2b,
+ 0x57, 0xfe, 0x0a, 0xae, 0x24, 0xdb, 0x84, 0xfd, 0xce, 0x3e, 0xff, 0xf1,
+ 0x3a, 0x45, 0xa9, 0x70, 0x73, 0xfe, 0x04, 0x6f, 0x92, 0xff, 0xc3, 0xd3,
+ 0xcb, 0x9e, 0xd8, 0x6b, 0xd8, 0x8c, 0x7c, 0x86, 0x9a, 0x5a, 0x53, 0x86,
+ 0x16, 0xd6, 0xf7, 0x45, 0x93, 0x7e, 0x84, 0x1d, 0x46, 0x4a, 0xb3, 0xd0,
+ 0x62, 0xb8, 0x37, 0x9f, 0xca, 0x65, 0x9c, 0x58, 0xfe, 0x0d, 0x9c, 0x3f,
+ 0xcd, 0xee, 0xf1, 0x20, 0x04, 0x62, 0xae, 0x9a, 0x1e, 0x68, 0x76, 0x21,
+ 0x57, 0x99, 0xac, 0xa9, 0xce, 0xd7, 0x46, 0x34, 0xbc, 0x6b, 0x3f, 0xab,
+ 0x89, 0x8a, 0x65, 0x25, 0x70, 0x04, 0x57, 0xaa, 0xc2, 0x11, 0x27, 0x50,
+ 0x75, 0x6e, 0x9e, 0xb4, 0xc1, 0x0a, 0x5e, 0xf7, 0x32, 0xe1, 0xfc, 0x25,
+ 0xc9, 0x00, 0x12, 0x9d, 0x73, 0x5a, 0x62, 0x26, 0xfb, 0x00, 0xd8, 0x51,
+ 0xd5, 0x41, 0xf3, 0x8b, 0x7b, 0x2e, 0x92, 0x91, 0x16, 0x48, 0xd4, 0xe9,
+ 0xe2, 0x05, 0x75, 0x61, 0x24, 0x8b, 0xc1, 0xa5, 0x0c, 0x3c, 0xe3, 0x3f,
+ 0x8e, 0xf4, 0xee, 0xd6, 0xfa, 0xc7, 0x7e, 0xfd, 0x77, 0xa5, 0x20, 0x12,
+ 0xa9, 0xc5, 0x45, 0x91, 0x27, 0x88, 0x47, 0x62, 0xac, 0x21, 0x27, 0x81,
+ 0xb4, 0xe2, 0x19, 0x89, 0xcf, 0x57, 0x7c, 0x87, 0x59, 0x32, 0x2e, 0x2d,
+ 0x5b, 0x47, 0xd7, 0xab, 0x4c, 0xed, 0x87, 0xad, 0x7d, 0xd2, 0xdd, 0x22,
+ 0xea, 0xe1, 0x25, 0x2e, 0xb5, 0xd2, 0x8f, 0xf5, 0x7c, 0x2a, 0xd6, 0x68,
+ 0x46, 0x59, 0x3f, 0xa2, 0x3b, 0x55, 0xd9, 0x82, 0x4a, 0x37, 0x5f, 0xba,
+ 0x12, 0x72, 0x08, 0x28, 0xc1, 0xa2, 0xc4, 0x3c, 0x4f, 0xb4, 0x97, 0x46,
+ 0x21, 0xf2, 0x8d, 0x81, 0xcf, 0xe4, 0xb3, 0x94, 0x93, 0xc2, 0x57, 0x1a,
+ 0x61, 0x2b, 0x8b, 0xdc, 0x6e, 0x3d, 0x29, 0x48, 0x87, 0x1f, 0x11, 0x06,
+ 0xca, 0x08, 0xfc, 0xd2, 0xfe, 0x5b, 0xde, 0x08, 0xc8, 0x83, 0x3a, 0xee,
+ 0x44, 0x1a, 0xed, 0xb2, 0xe2, 0xac, 0x37, 0x47, 0x98, 0x05, 0x7c, 0x69,
+ 0x5a, 0x34, 0x02, 0x11, 0xaa, 0x88, 0xe5, 0xc8, 0x2c, 0xcf, 0x9b, 0x10,
+ 0x58, 0x52, 0x5e, 0x35, 0x42, 0xa7, 0xc2, 0xdc, 0xfb, 0x3c, 0x3f, 0x37,
+ 0x69, 0x71, 0x9d, 0xb1, 0xb2, 0xe5, 0x71, 0x7e, 0x71, 0xdd, 0x06, 0xbe,
+ 0x61, 0xcc, 0xb1, 0x87, 0x99, 0x1f, 0xab, 0x52, 0xde, 0x61, 0x92, 0xdd,
+ 0xdb, 0xb5, 0xf3, 0x40, 0x83, 0x5a, 0x34, 0x80, 0x77, 0xd3, 0x2c, 0x7c,
+ 0x0f, 0x92, 0xa7, 0xbb, 0x14, 0xe2, 0xc4, 0x16, 0xfb, 0x73, 0x3a, 0xab,
+ 0xf5, 0xc4, 0x53, 0x52, 0x47, 0x08, 0xa6, 0x24, 0x45, 0xbb, 0xa0, 0xe8,
+ 0x38, 0x5d, 0xb1, 0x8c, 0x06, 0xe3, 0x04, 0x21, 0xf1, 0x4e, 0xf4, 0x61,
+ 0x89, 0x41, 0x00, 0x5a, 0xdc, 0x14, 0xd6, 0x8e, 0xa0, 0xe5, 0x2b, 0x6c,
+ 0x72, 0xa2, 0x02, 0xf1, 0xa2, 0xbc, 0x04, 0x22, 0x67, 0xee, 0x49, 0x6f,
+ 0x3c, 0x7b, 0x76, 0x3c, 0x77, 0xd8, 0x28, 0xe7, 0x87, 0xa3, 0x91, 0x6e,
+ 0x93, 0xa3, 0x70, 0x47, 0x48, 0x0c, 0x01, 0x44, 0x05, 0x92, 0x65, 0x18,
+ 0xb1, 0xe2, 0xa5, 0x91, 0x4e, 0xf0, 0x71, 0x8f, 0xc5, 0xdb, 0x2b, 0x96,
+ 0xd1, 0x09, 0x88, 0x3d, 0xc4, 0x8f, 0x84, 0x7d, 0xa5, 0x23, 0xbe, 0x5b,
+ 0x3f, 0x93, 0xf1, 0x42, 0xb2, 0x98, 0x56, 0xcc, 0x33, 0xf2, 0xf9, 0x54,
+ 0xdc, 0x93, 0x33, 0xd0, 0x08, 0xa0, 0x76, 0x79, 0xc2, 0xbd, 0x27, 0xe1,
+ 0xa0, 0xbf, 0xe3, 0x51, 0xf5, 0xff, 0xa9, 0x41, 0x7f, 0x17, 0x19, 0xf4,
+ 0x53, 0x77, 0x70, 0xf8, 0x63, 0xc9, 0xfe, 0xfe, 0x27, 0x0a, 0xab, 0x66,
+ 0x47, 0xcd, 0x2c, 0x71, 0x1f, 0xf4, 0xbe, 0x68, 0x9e, 0x1b, 0x00, 0x18,
+ 0x1c, 0x7e, 0xcb, 0x3b, 0xbc, 0xde, 0xa7, 0x9e, 0xd9, 0x4f, 0x4d, 0x52,
+ 0x58, 0x23, 0x46, 0xd3, 0x64, 0x29, 0x13, 0x08, 0x1f, 0xa5, 0xe9, 0x21,
+ 0x34, 0xc4, 0x1d, 0xe1, 0x2a, 0x9a, 0x55, 0x60, 0x1e, 0xed, 0x85, 0xf7,
+ 0x9d, 0xe7, 0xd6, 0x90, 0xde, 0xd9, 0xe7, 0x3d, 0x49, 0x65, 0x0b, 0xa4,
+ 0x06, 0x2c, 0x76, 0xe6, 0x34, 0x6b, 0xcc, 0x9a, 0x38, 0x1f, 0x10, 0x27,
+ 0xad, 0x5c, 0x55, 0x29, 0xe8, 0x2b, 0x51, 0x77, 0x76, 0xb8, 0x82, 0x23,
+ 0x95, 0xd5, 0xe8, 0x94, 0x7a, 0x5f, 0x10, 0x6e, 0x0f, 0x6a, 0x81, 0x38,
+ 0x4e, 0xc8, 0x13, 0x87, 0x2a, 0xbf, 0x57, 0xd6, 0x59, 0xa7, 0x95, 0x67,
+ 0xfb, 0xc1, 0x0c, 0xf1, 0x20, 0xf9, 0xc8, 0x88, 0xca, 0x10, 0xa7, 0xdb,
+ 0xd9, 0xfb, 0xc4, 0x2d, 0x91, 0x5b, 0x07, 0x94, 0x4a, 0xe6, 0x3c, 0xfb,
+ 0xa1, 0x27, 0xbd, 0xad, 0x3c, 0x51, 0xcf, 0xb0, 0x70, 0xab, 0x07, 0xfb,
+ 0x52, 0x5e, 0x75, 0x5f, 0x61, 0x79, 0x7c, 0x4e, 0xe2, 0x4e, 0x78, 0x0c,
+ 0x87, 0xc9, 0x19, 0x3c, 0x31, 0x2d, 0xe6, 0x56, 0xc6, 0xe8, 0xa7, 0x2e,
+ 0xef, 0xaa, 0xbd, 0x75, 0x3f, 0x73, 0x6b, 0xac, 0x5d, 0xd2, 0xb0, 0xf8,
+ 0x8e, 0x8a, 0x59, 0x7b, 0xa5, 0xa8, 0xbb, 0x31, 0x4b, 0x2e, 0x8e, 0x2f,
+ 0x2f, 0x00, 0xeb, 0x81, 0x08, 0xe8, 0xde, 0xb9, 0x46, 0x24, 0x6c, 0x5b,
+ 0xbe, 0x3f, 0x11, 0x68, 0x4e, 0x29, 0x71, 0x22, 0x82, 0x49, 0x61, 0xec,
+ 0x8a, 0xf3, 0x3f, 0xf5, 0x3d, 0xc6, 0xa5, 0x9b, 0x35, 0xe7, 0x29, 0x77,
+ 0x21, 0xb1, 0x36, 0x5d, 0xcd, 0xfe, 0xbe, 0xc3, 0x27, 0x70, 0x21, 0x2d,
+ 0xbe, 0x49, 0x2d, 0xe0, 0x54, 0xaf, 0x5e, 0x87, 0xd2, 0xd6, 0x4a, 0x0b,
+ 0xf4, 0x1c, 0x43, 0x36, 0x83, 0xc0, 0xa5, 0xfd, 0xb8, 0x68, 0x01, 0xd2,
+ 0x09, 0x8b, 0x15, 0xc6, 0xe7, 0x3c, 0x75, 0x33, 0x91, 0x24, 0x9a, 0xe4,
+ 0xe9, 0xee, 0x6e, 0x84, 0x03, 0x22, 0x1d, 0x1b, 0xb1, 0x2a, 0xaa, 0x9d,
+ 0xe0, 0xed, 0xf1, 0x16, 0x7b, 0xce, 0xa0, 0x6b, 0xd6, 0x64, 0xb7, 0x0c,
+ 0xae, 0xc8, 0x56, 0xa6, 0x19, 0x53, 0x39, 0xed, 0xcd, 0x1b, 0x4b, 0x99,
+ 0xef, 0x91, 0x00, 0xa0, 0x93, 0xd6, 0x11, 0x2f, 0x9c, 0x1d, 0xa0, 0x95,
+ 0x9a, 0x52, 0x8f, 0xe3, 0x52, 0x5c, 0xa0, 0x41, 0xcf, 0x02, 0x09, 0xbe,
+ 0xff, 0x2c, 0xdc, 0x11, 0xa3, 0xcb, 0xb3, 0x0b, 0xd9, 0x61, 0xe1, 0xe5,
+ 0x2c, 0x61, 0x70, 0x7a, 0xc4, 0xb1, 0x15, 0xf4, 0x23, 0x95, 0xa2, 0x6d,
+ 0x8a, 0xad, 0xa5, 0x86, 0xf3, 0xbe, 0xca, 0x32, 0xe0, 0x82, 0xd2, 0x44,
+ 0x64, 0x68, 0xdf, 0x49, 0x4e, 0xad, 0xd2, 0x20, 0xea, 0xc9, 0xf4, 0x5e,
+ 0xe2, 0x83, 0x76, 0xc6, 0x27, 0x98, 0x53, 0x40, 0x51, 0xf0, 0x84, 0x93,
+ 0x41, 0x89, 0x46, 0x51, 0x80, 0x72, 0xb6, 0xa6, 0x4c, 0x77, 0x2f, 0xf2,
+ 0x21, 0x3a, 0xb3, 0x4c, 0x97, 0x2a, 0xe4, 0x75, 0xd3, 0x78, 0xbe, 0x2b,
+ 0x54, 0x37, 0x22, 0x69, 0xc1, 0x6c, 0x90, 0x02, 0x7b, 0x48, 0x29, 0x3c,
+ 0xd1, 0x5d, 0xed, 0x89, 0x51, 0x95, 0xa7, 0x42, 0xb7, 0x24, 0x97, 0xa7,
+ 0xda, 0x0e, 0x4e, 0xed, 0x76, 0x37, 0xff, 0xf9, 0xd9, 0xc5, 0xa5, 0xbd,
+ 0xf7, 0xe9, 0xb3, 0xf8, 0x41, 0xe7, 0xfc, 0x10, 0xdb, 0x7c, 0xc2, 0xe4,
+ 0xd5, 0x72, 0xbb, 0xa1, 0x62, 0xd4, 0x46, 0x34, 0x8f, 0x57, 0x16, 0x05,
+ 0xed, 0x68, 0x43, 0x64, 0xc4, 0x57, 0x40, 0x72, 0x09, 0xaf, 0x95, 0x93,
+ 0x39, 0xec, 0x4b, 0xa5, 0x0b, 0x27, 0x5e, 0x27, 0xc8, 0x29, 0xb9, 0x4f,
+ 0xf6, 0xc2, 0xdd, 0x41, 0xde, 0xb3, 0x8b, 0x63, 0x2a, 0x1a, 0x7e, 0x79,
+ 0xc3, 0x7f, 0x0b, 0xfa, 0xce, 0x99, 0x7b, 0xf2, 0xc3, 0x78, 0xe1, 0x79,
+ 0xec, 0x0e, 0x8a, 0x4f, 0x19, 0xf3, 0x03, 0xed, 0xdb, 0x3c, 0x51, 0x6f,
+ 0xce, 0x9e, 0x78, 0x58, 0x24, 0x88, 0x4d, 0xd9, 0x2b, 0xc0, 0xb6, 0xe0,
+ 0x07, 0x3d, 0xf9, 0x4a, 0xcf, 0x28, 0x67, 0x7c, 0x24, 0x5a, 0xcc, 0xb6,
+ 0x4f, 0x9e, 0xba, 0x16, 0x16, 0x74, 0x5f, 0x49, 0x03, 0x27, 0x5a, 0x96,
+ 0x89, 0x7e, 0x38, 0xd0, 0xed, 0x82, 0x2b, 0x83, 0x37, 0x06, 0x3f, 0xe7,
+ 0xda, 0x79, 0x66, 0xf3, 0xc1, 0x55, 0x61, 0xf0, 0xba, 0x42, 0x3f, 0x56,
+ 0x08, 0x08, 0x74, 0x8e, 0xce, 0xb6, 0x7b, 0xc2, 0xbb, 0xfd, 0x2b, 0xc2,
+ 0x12, 0x59, 0x50, 0x13, 0x8f, 0xdd, 0xbb, 0x5b, 0x49, 0xe5, 0xca, 0x8b,
+ 0x65, 0x06, 0x4d, 0x2d, 0xad, 0x66, 0x44, 0xa3, 0x6d, 0x04, 0x49, 0xc5,
+ 0x89, 0x26, 0x77, 0x41, 0xf0, 0x0b, 0xb0, 0x21, 0xf7, 0x0d, 0xb9, 0x85,
+ 0x4e, 0x4e, 0x8f, 0xdd, 0x52, 0x31, 0x05, 0x37, 0x0e, 0xb2, 0xd3, 0xf8,
+ 0xa9, 0x94, 0xa2, 0xbd, 0x2a, 0x86, 0xc9, 0x39, 0xd5, 0xc8, 0x83, 0xe6,
+ 0x54, 0xff, 0xbb, 0x6b, 0x8d, 0x0f, 0x0a, 0x3c, 0xb1, 0xe6, 0xf2, 0x44,
+ 0xd6, 0x60, 0x5e, 0x98, 0x95, 0xc5, 0x4f, 0xe8, 0xaf, 0x1e, 0x5d, 0x6c,
+ 0x30, 0xdc, 0xcf, 0xdc, 0xcb, 0xb5, 0x19, 0x89, 0xb1, 0xdb, 0xbb, 0x8f,
+ 0x3c, 0x95, 0x7d, 0x65, 0x8c, 0x7a, 0x34, 0x61, 0x45, 0x33, 0x9d, 0x67,
+ 0x2d, 0x08, 0xcd, 0x2d, 0x5c, 0xe9, 0x33, 0x2d, 0x11, 0xee, 0x35, 0xc5,
+ 0x17, 0xc2, 0xe1, 0xd8, 0x16, 0x60, 0x20, 0x08, 0x21, 0xa9, 0x73, 0xa6,
+ 0xad, 0x82, 0xa4, 0xed, 0xcc, 0x22, 0x71, 0x6d, 0x38, 0x90, 0xa4, 0x25,
+ 0xbd, 0x60, 0x39, 0x57, 0xba, 0x93, 0xdb, 0x29, 0xf8, 0xf7, 0x94, 0x77,
+ 0xa2, 0xdd, 0x36, 0xf6, 0x0e, 0x6b, 0xf5, 0x4e, 0xb0, 0x8b, 0xc2, 0x1d,
+ 0x45, 0x5e, 0x04, 0xf2, 0x0b, 0x9b, 0x1b, 0xde, 0x37, 0x01, 0x9e, 0x3e,
+ 0x73, 0x4d, 0x5d, 0x81, 0xa3, 0x5b, 0x65, 0xfb, 0x61, 0x4b, 0xfe, 0x58,
+ 0x82, 0xee, 0xdc, 0x3e, 0xc9, 0x96, 0x23, 0xa7, 0x70, 0x46, 0x8e, 0x94,
+ 0xf7, 0x0d, 0xde, 0x0c, 0x97, 0x25, 0x91, 0x78, 0x14, 0xf7, 0x0e, 0x9a,
+ 0x3b, 0xe4, 0xe8, 0x22, 0x3b, 0xa4, 0xb8, 0x06, 0x80, 0xfc, 0x46, 0x38,
+ 0x94, 0x6f, 0xc4, 0x5b, 0x43, 0x55, 0xa6, 0x02, 0xea, 0xd7, 0xe5, 0x5c,
+ 0x10, 0x7e, 0xde, 0x97, 0x3e, 0x15, 0xd7, 0x06, 0xd7, 0xe4, 0xb6, 0xce,
+ 0x00, 0x5f, 0x90, 0x96, 0x96, 0xf0, 0xc1, 0xc6, 0xc9, 0xa7, 0x00, 0x9f,
+ 0xd5, 0x96, 0xe6, 0x38, 0xc2, 0x41, 0x46, 0x97, 0xb1, 0xa8, 0xbc, 0x1a,
+ 0xeb, 0x2c, 0x3d, 0x02, 0x19, 0x9a, 0x6f, 0x79, 0x8c, 0x7f, 0xb5, 0x86,
+ 0x81, 0xa3, 0xca, 0xfe, 0x06, 0x75, 0x72, 0xc8, 0x17, 0x0e, 0x67, 0xdb,
+ 0xf0, 0x28, 0x8b, 0x65, 0xea, 0xd9, 0xf4, 0x4f, 0x3f, 0x13, 0xbf, 0x95,
+ 0xf8, 0x45, 0xb4, 0x1a, 0x65, 0x37, 0xcc, 0xf4, 0x6c, 0xcf, 0x3a, 0x01,
+ 0x09, 0x50, 0x27, 0x28, 0x71, 0x1f, 0x56, 0x47, 0xbc, 0x92, 0xa3, 0x6f,
+ 0x92, 0x37, 0xaf, 0x9e, 0x11, 0xb0, 0xe3, 0x3a, 0xab, 0x16, 0xc6, 0x6a,
+ 0x71, 0x86, 0xf9, 0xd9, 0xb7, 0x5e, 0x63, 0xfb, 0x0e, 0x26, 0xa4, 0xf1,
+ 0x7e, 0x11, 0x66, 0x62, 0x35, 0x98, 0x25, 0xa4, 0xc4, 0xc4, 0x6b, 0xcd,
+ 0x31, 0x56, 0x32, 0x2c, 0xaf, 0x2c, 0x73, 0xc0, 0xb5, 0xd4, 0x11, 0x60,
+ 0xcf, 0x9e, 0x38, 0x01, 0x46, 0x85, 0xd7, 0xcb, 0x24, 0x2b, 0xae, 0xc9,
+ 0x38, 0x88, 0x9c, 0xa8, 0x67, 0x2c, 0x34, 0x8f, 0xf8, 0xdc, 0x93, 0x22,
+ 0x1b, 0xbe, 0x06, 0x25, 0x1d, 0xe1, 0x4e, 0xef, 0xbd, 0x67, 0xbe, 0x6f,
+ 0x81, 0x78, 0x07, 0x01, 0x99, 0x61, 0xb6, 0x71, 0x68, 0x29, 0xde, 0xb3,
+ 0xcf, 0xed, 0xb3, 0xe4, 0x48, 0xca, 0x0b, 0xaf, 0x3a, 0xc4, 0x8a, 0x37,
+ 0x44, 0x01, 0x56, 0x33, 0x41, 0x55, 0x33, 0xd6, 0x79, 0xbc, 0xb9, 0xf7,
+ 0x5e, 0xf9, 0xac, 0xed, 0x3a, 0x01, 0x6d, 0xb4, 0xdd, 0x98, 0x18, 0x54,
+ 0xbe, 0xb8, 0xf1, 0x0f, 0xe7, 0x73, 0xbe, 0xa5, 0xcf, 0xbb, 0x28, 0x49,
+ 0x95, 0x81, 0x99, 0x9f, 0x89, 0xaf, 0x47, 0x9d, 0xb7, 0xfe, 0xd1, 0x61,
+ 0xb2, 0x2a, 0x45, 0x00, 0x7b, 0xdd, 0xfb, 0xc8, 0x9e, 0x9c, 0x19, 0x2a,
+ 0x93, 0x76, 0x5d, 0xe4, 0xff, 0xd0, 0xe4, 0x62, 0xba, 0x9b, 0xb5, 0xb2,
+ 0x87, 0xf7, 0xf8, 0xbe, 0x08, 0x8c, 0xdb, 0x74, 0x96, 0x8b, 0x50, 0xa4,
+ 0x20, 0x9a, 0x7b, 0xe0, 0x89, 0xec, 0x5a, 0x2e, 0x0c, 0x07, 0x0b, 0x00,
+ 0xa5, 0x1d, 0x29, 0x84, 0x9b, 0xb5, 0x40, 0xb7, 0xcf, 0x9f, 0x8a, 0xde,
+ 0xa5, 0xba, 0x31, 0xdd, 0xbc, 0x34, 0x11, 0x33, 0x30, 0x9b, 0x75, 0xc5,
+ 0xf4, 0x73, 0xb9, 0xf6, 0x64, 0x29, 0x6d, 0x75, 0x0f, 0x5b, 0x29, 0x85,
+ 0xfe, 0x7a, 0x97, 0x17, 0x02, 0x83, 0x0d, 0x5e, 0x7f, 0xbe, 0xc2, 0x1f,
+ 0x29, 0xd5, 0xce, 0x8f, 0xb1, 0x97, 0xbc, 0xe7, 0x3f, 0x71, 0x27, 0xa1,
+ 0xc5, 0x0a, 0xa7, 0x94, 0x60, 0x7d, 0xcf, 0x09, 0x61, 0xcf, 0x12, 0x3b,
+ 0x52, 0xa4, 0x18, 0x74, 0x84, 0xb2, 0xf7, 0xca, 0x7e, 0x7e, 0x56, 0x92,
+ 0x34, 0xf5, 0xbe, 0xc7, 0x5b, 0xea, 0x35, 0x68, 0xc0, 0x9d, 0x71, 0x50,
+ 0xb4, 0x6a, 0x9b, 0xba, 0xa7, 0x3f, 0x93, 0xbd, 0xa1, 0xf7, 0xa5, 0x35,
+ 0x59, 0x57, 0xbd, 0xf1, 0xc9, 0xae, 0xaf, 0xb0, 0x4e, 0x29, 0x4c, 0xc7,
+ 0x49, 0xb6, 0x2b, 0x5f, 0xe0, 0x9d, 0x71, 0x32, 0xa3, 0x32, 0xa1, 0x33,
+ 0x2d, 0x3e, 0xaa, 0x8c, 0x60, 0xee, 0xb1, 0xfd, 0x96, 0xd0, 0xbd, 0xf4,
+ 0xd5, 0xa7, 0xe4, 0xe4, 0x95, 0xf7, 0xe0, 0x13, 0x37, 0xc0, 0x74, 0x46,
+ 0xda, 0xc0, 0x3d, 0x7b, 0xab, 0x6a, 0x29, 0x7b, 0xea, 0x3d, 0xca, 0x3b,
+ 0xe3, 0x6d, 0xc9, 0xdc, 0x35, 0x98, 0xfe, 0xe0, 0x19, 0xde, 0x0e, 0x47,
+ 0x37, 0xe6, 0x56, 0x9b, 0x34, 0x40, 0x07, 0x16, 0x1a, 0x3a, 0xea, 0xae,
+ 0xfd, 0x27, 0xcf, 0xd7, 0x3c, 0x2b, 0x97, 0x66, 0x6d, 0xaf, 0x7a, 0xef,
+ 0xbd, 0x4f, 0xc2, 0x63, 0xae, 0x26, 0x81, 0x82, 0x98, 0xcd, 0x51, 0xa3,
+ 0x93, 0x96, 0x6c, 0x51, 0x1e, 0xe5, 0xbf, 0xab, 0x7b, 0xb0, 0x22, 0x5a,
+ 0xae, 0xfa, 0xdf, 0xfd, 0xfe, 0x7e, 0xea, 0x23, 0xa1, 0xd9, 0x37, 0x58,
+ 0x65, 0x88, 0x1e, 0x4c, 0x5a, 0x3c, 0xdc, 0x0e, 0x29, 0x82, 0xd9, 0xf1,
+ 0x5a, 0xe0, 0x35, 0x37, 0x7a, 0xc4, 0xb2, 0x70, 0x92, 0x83, 0x0d, 0x41,
+ 0x49, 0x5c, 0x9e, 0xfa, 0xf4, 0x6d, 0x24, 0xf3, 0xc5, 0x0f, 0xe5, 0x79,
+ 0x52, 0x77, 0x3b, 0xc7, 0xa0, 0xbe, 0x59, 0xb2, 0xd9, 0x6d, 0x47, 0xe4,
+ 0xdc, 0x6c, 0xde, 0x6b, 0xfb, 0x4e, 0x7a, 0xa1, 0x6f, 0x50, 0x1b, 0x8f,
+ 0x4c, 0x6f, 0xd9, 0x2e, 0xb7, 0xc4, 0xcc, 0xf0, 0xc2, 0xdf, 0x55, 0x25,
+ 0xfd, 0x55, 0xd3, 0xed, 0xb7, 0x38, 0x29, 0x32, 0x04, 0xe9, 0x09, 0xae,
+ 0xd8, 0xfb, 0x8c, 0xa8, 0x36, 0x04, 0x75, 0x31, 0xab, 0x74, 0x93, 0x4d,
+ 0x3e, 0xe8, 0x91, 0x91, 0x46, 0x1c, 0x1a, 0xd9, 0x7b, 0xeb, 0xa9, 0x9d,
+ 0x5a, 0x98, 0x34, 0x17, 0xc7, 0x5d, 0x2b, 0xc0, 0x3d, 0xca, 0xbb, 0xe6,
+ 0xe2, 0x72, 0x74, 0x7e, 0x40, 0x7d, 0xe6, 0x78, 0x9c, 0x39, 0x10, 0x47,
+ 0xa3, 0xec, 0xef, 0x92, 0x85, 0x52, 0xbb, 0xa7, 0x9f, 0xaf, 0x78, 0x7a,
+ 0x24, 0xee, 0xbd, 0x93, 0x29, 0x89, 0x5f, 0xb3, 0x0e, 0xfe, 0x4b, 0x9f,
+ 0x08, 0xb6, 0x4f, 0xfd, 0xfc, 0xec, 0x05, 0xa3, 0x9e, 0x41, 0x1a, 0x52,
+ 0xe4, 0xdd, 0x3d, 0xfc, 0xa9, 0xb3, 0x69, 0x6e, 0x96, 0xc5, 0x07, 0xab,
+ 0x2f, 0x0a, 0x1d, 0x95, 0x2e, 0xb0, 0x7b, 0xe1, 0x33, 0x3d, 0x1a, 0x9e,
+ 0x37, 0xd4, 0xe2, 0x5f, 0xfa, 0xe2, 0xa5, 0xd0, 0x42, 0xa7, 0x1c, 0x48,
+ 0x34, 0xf2, 0x75, 0xe9, 0xcd, 0xc1, 0x67, 0xbb, 0xf6, 0xfa, 0x15, 0x62,
+ 0x8b, 0x0f, 0xd9, 0xbd, 0xdb, 0x75, 0x1c, 0xaf, 0x37, 0xea, 0x62, 0x5e,
+ 0x90, 0x13, 0xc2, 0x3d, 0x62, 0x1b, 0xf8, 0xe1, 0x07, 0x96, 0xf1, 0x96,
+ 0x0f, 0x49, 0xe2, 0x4c, 0xb6, 0xe6, 0x85, 0x11, 0x88, 0xac, 0x16, 0xd0,
+ 0xf1, 0x42, 0x70, 0xa6, 0xca, 0x66, 0x19, 0xf1, 0xe9, 0xb1, 0x8d, 0x82,
+ 0x8d, 0x3d, 0x08, 0xec, 0x3d, 0x94, 0x7d, 0xe2, 0x40, 0x25, 0x17, 0xb4,
+ 0x37, 0x93, 0x57, 0x90, 0x6f, 0x4c, 0x1c, 0x55, 0x66, 0xc5, 0x0f, 0xdf,
+ 0x5d, 0x7e, 0x73, 0x76, 0x31, 0x4a, 0x76, 0x28, 0x2d, 0xf5, 0xf2, 0xe2,
+ 0xe4, 0xab, 0x77, 0xc6, 0xf6, 0xb7, 0x31, 0xba, 0x57, 0x69, 0x91, 0x9b,
+ 0x9b, 0x63, 0xd4, 0x64, 0x85, 0x59, 0xc7, 0x6b, 0x2d, 0x4d, 0xc1, 0xe4,
+ 0x9c, 0xe6, 0xae, 0x2c, 0x2b, 0x2e, 0x4f, 0x04, 0x56, 0x80, 0x9b, 0x52,
+ 0x16, 0x83, 0xa9, 0xd3, 0xc8, 0xc7, 0x4c, 0x28, 0xac, 0xd2, 0xd9, 0xb5,
+ 0x79, 0x27, 0xab, 0x56, 0xa1, 0x15, 0xc9, 0xe5, 0x37, 0x87, 0x6f, 0xbf,
+ 0x1d, 0x29, 0x6d, 0xf9, 0xf7, 0xdf, 0x7f, 0xef, 0x43, 0x7e, 0xea, 0x83,
+ 0x9d, 0x1d, 0xe8, 0x97, 0x37, 0xe9, 0xc7, 0x8f, 0xc3, 0x3a, 0xdb, 0xd8,
+ 0x18, 0x1d, 0x1f, 0x27, 0x87, 0xa7, 0xa3, 0xb3, 0x0d, 0x97, 0x8c, 0xbd,
+ 0xb5, 0x47, 0x24, 0x2d, 0xd7, 0x59, 0x63, 0xfe, 0xb2, 0xb1, 0x71, 0x7a,
+ 0x78, 0x49, 0x96, 0xab, 0x94, 0x57, 0xa5, 0x79, 0x26, 0x62, 0x85, 0x74,
+ 0x76, 0x47, 0x3c, 0x72, 0x57, 0x39, 0xd0, 0xce, 0x77, 0x5a, 0x99, 0xbd,
+ 0x4b, 0xae, 0x68, 0x6e, 0x9e, 0x3b, 0xa2, 0xbb, 0x10, 0xcc, 0x12, 0x81,
+ 0x31, 0xcd, 0x98, 0x94, 0x21, 0x6c, 0x23, 0x71, 0xde, 0x2b, 0xe6, 0x3b,
+ 0xcf, 0xc6, 0x5c, 0x5d, 0xb7, 0xcf, 0xd0, 0x43, 0x00, 0xd0, 0x3c, 0x02,
+ 0x82, 0x15, 0x43, 0x38, 0x21, 0x5e, 0xd0, 0xe4, 0xdd, 0xe8, 0xf0, 0xeb,
+ 0x63, 0x7a, 0xf6, 0xeb, 0xac, 0x71, 0x53, 0xcb, 0x25, 0xe4, 0xe9, 0x2b,
+ 0x6f, 0xb3, 0xa6, 0x9e, 0xa4, 0x8b, 0x6c, 0x93, 0xfa, 0x34, 0x1e, 0x08,
+ 0xe3, 0xbe, 0x6b, 0x9c, 0xd5, 0x7a, 0x57, 0x28, 0xa0, 0x90, 0xe7, 0x41,
+ 0xe9, 0xef, 0xb7, 0x7b, 0x71, 0x7c, 0xf8, 0xea, 0xcd, 0xb1, 0x16, 0x68,
+ 0x66, 0x56, 0x4e, 0xd3, 0xe8, 0x0d, 0x95, 0xad, 0x76, 0x91, 0x0f, 0xba,
+ 0xe6, 0x97, 0xa6, 0x0d, 0xf3, 0x1b, 0xaa, 0x22, 0x1d, 0xff, 0x9c, 0xab,
+ 0x1f, 0x80, 0x67, 0x87, 0x57, 0xf9, 0x0e, 0xb7, 0xae, 0xdf, 0x4b, 0xed,
+ 0x9c, 0x08, 0xd3, 0x88, 0x6a, 0xbe, 0xec, 0x9a, 0x80, 0x4f, 0xe3, 0xd3,
+ 0xdd, 0xdd, 0xdd, 0x35, 0xe3, 0x80, 0x69, 0x20, 0x17, 0xa8, 0x19, 0xca,
+ 0x01, 0x3d, 0xbe, 0xe3, 0xda, 0x77, 0x3d, 0xa6, 0xfd, 0x86, 0x75, 0xbb,
+ 0x22, 0xcb, 0x1a, 0xd7, 0x6e, 0xde, 0x64, 0xf1, 0x2e, 0x4f, 0xca, 0xd2,
+ 0xae, 0x40, 0x6b, 0x72, 0x50, 0x3b, 0x37, 0x6f, 0x94, 0x72, 0x0d, 0x6f,
+ 0x70, 0xc7, 0x8d, 0x29, 0x03, 0x9a, 0xa9, 0xea, 0xbe, 0xdb, 0x24, 0xfd,
+ 0x06, 0xc0, 0x94, 0x49, 0x33, 0x2c, 0xab, 0xeb, 0x9d, 0xf9, 0x01, 0xb4,
+ 0x13, 0xf3, 0xd0, 0x6b, 0x82, 0xb9, 0x26, 0x46, 0xcb, 0xb5, 0x0c, 0x12,
+ 0x35, 0x4d, 0x6c, 0x69, 0xae, 0xa5, 0x47, 0xf4, 0xeb, 0x17, 0xcc, 0x02,
+ 0xb3, 0xff, 0x5c, 0xe9, 0xc8, 0xb5, 0x9e, 0x5e, 0xe4, 0x23, 0xb4, 0xff,
+ 0xe0, 0x38, 0x1c, 0x1a, 0x59, 0x60, 0xbe, 0x42, 0x3c, 0x54, 0xd8, 0x22,
+ 0xe6, 0xaf, 0x95, 0xd9, 0x32, 0xc3, 0xe6, 0x23, 0x44, 0xa8, 0x94, 0x0b,
+ 0xe5, 0x94, 0x41, 0x8a, 0xcc, 0x2f, 0xa8, 0x34, 0x79, 0x45, 0xcc, 0xb0,
+ 0xfc, 0x05, 0x73, 0x80, 0x48, 0x88, 0x5c, 0xcb, 0xc4, 0x01, 0xcf, 0x47,
+ 0x0d, 0x77, 0xbf, 0x39, 0x18, 0x60, 0xff, 0xd4, 0x76, 0xb7, 0x3c, 0xe2,
+ 0xe3, 0xde, 0xa0, 0x78, 0xf6, 0x0b, 0xb9, 0x71, 0xbd, 0xbd, 0x33, 0x32,
+ 0xbd, 0x08, 0xbe, 0xb5, 0x74, 0x15, 0x4f, 0x6b, 0xfe, 0x9c, 0x5f, 0xd8,
+ 0xc2, 0xac, 0xc6, 0x0e, 0xa0, 0x9e, 0x8f, 0xfe, 0xc6, 0xd1, 0xb9, 0xfc,
+ 0x8d, 0x30, 0x71, 0xf9, 0x2d, 0x0d, 0x9e, 0xa4, 0xb5, 0xb9, 0x77, 0x49,
+ 0x9c, 0xab, 0xba, 0x0a, 0x88, 0x1d, 0x2c, 0x4f, 0x54, 0xad, 0xf1, 0x4d,
+ 0x87, 0x35, 0x3d, 0x3c, 0x30, 0x53, 0x43, 0xb7, 0xc3, 0xff, 0xde, 0x19,
+ 0xd6, 0xf5, 0xcd, 0x4e, 0x3e, 0x7d, 0x5f, 0xd5, 0x69, 0xf2, 0xd3, 0x46,
+ 0x27, 0xa3, 0xb2, 0x3b, 0x88, 0xff, 0x8d, 0x19, 0xfc, 0x45, 0x33, 0xb5,
+ 0x7a, 0x14, 0xbf, 0xc7, 0x08, 0x06, 0x03, 0x6a, 0x55, 0xbf, 0xf4, 0xde,
+ 0x3c, 0xf0, 0xde, 0x52, 0xfd, 0xfe, 0x8a, 0xd1, 0x45, 0x44, 0xa1, 0x19,
+ 0x24, 0x33, 0x40, 0x1a, 0xd9, 0x12, 0xdf, 0xe8, 0x5a, 0xac, 0xe2, 0xc7,
+ 0xfd, 0xdd, 0xdd, 0xbd, 0x83, 0xbd, 0x4f, 0x3f, 0xdb, 0x3d, 0xd8, 0xdb,
+ 0xdb, 0xdb, 0x3f, 0xd8, 0x3b, 0x38, 0xd8, 0xdf, 0xfd, 0x79, 0xa7, 0xb7,
+ 0x6a, 0xea, 0xde, 0x7c, 0xb5, 0xa2, 0x41, 0x33, 0xea, 0x1e, 0xd3, 0xcb,
+ 0xfd, 0x64, 0x47, 0x8f, 0x51, 0x4d, 0x7b, 0x49, 0x3d, 0x1f, 0x13, 0xae,
+ 0x8b, 0x0f, 0xa7, 0x3f, 0x98, 0xda, 0x28, 0xc5, 0x99, 0x37, 0xa0, 0x57,
+ 0x67, 0xdf, 0xbf, 0x3d, 0x3d, 0x3b, 0x7c, 0x95, 0x5c, 0x9e, 0x25, 0x87,
+ 0x70, 0xe1, 0x45, 0xe4, 0x24, 0x28, 0x22, 0x09, 0x19, 0xcd, 0x65, 0x3c,
+ 0xbc, 0x72, 0x56, 0xe2, 0x6f, 0xb2, 0x10, 0x46, 0x74, 0xa2, 0xdb, 0xcf,
+ 0x12, 0x26, 0x1a, 0xb5, 0x34, 0xbc, 0x69, 0xe6, 0x0f, 0xdf, 0x08, 0x8f,
+ 0xf9, 0x72, 0x9f, 0x21, 0x16, 0xce, 0x0a, 0x47, 0x77, 0xf4, 0xe4, 0x4b,
+ 0x59, 0x7b, 0x89, 0x4b, 0x09, 0x3c, 0xc1, 0x16, 0x61, 0xdf, 0x62, 0x00,
+ 0xa6, 0x2b, 0xc1, 0xc4, 0xd5, 0xbd, 0x3a, 0xa0, 0x2f, 0x5b, 0x27, 0x47,
+ 0xf0, 0x2f, 0x50, 0x77, 0x48, 0xbf, 0xdc, 0x0e, 0x06, 0x78, 0xb6, 0x72,
+ 0x48, 0xe6, 0x32, 0xcf, 0x3e, 0x62, 0xd4, 0x6d, 0xd9, 0xcb, 0xfc, 0x83,
+ 0x6e, 0x74, 0x60, 0x59, 0x52, 0xbf, 0x42, 0x5e, 0x69, 0x97, 0x81, 0xd4,
+ 0x8c, 0x7c, 0x8e, 0xbe, 0xa3, 0x22, 0xd9, 0x7d, 0x82, 0x7e, 0xe3, 0xdf,
+ 0xe3, 0x3b, 0x36, 0xeb, 0x94, 0x3b, 0xf0, 0x6e, 0x74, 0xf2, 0xf6, 0x6b,
+ 0x44, 0xb8, 0xbf, 0x3f, 0xbb, 0x78, 0x35, 0x32, 0xcd, 0x1a, 0x79, 0x85,
+ 0xc6, 0x2f, 0x4b, 0x92, 0x84, 0xd2, 0x2b, 0x3e, 0x97, 0xf4, 0xe9, 0xbf,
+ 0xf0, 0x76, 0xea, 0xfb, 0xec, 0xf2, 0x73, 0xdf, 0x76, 0xa1, 0x12, 0x42,
+ 0xf1, 0x5b, 0xc3, 0xdb, 0x8d, 0x5f, 0xce, 0xd3, 0xc9, 0x0d, 0x19, 0xdb,
+ 0xbc, 0x59, 0x01, 0x99, 0xdd, 0xa1, 0x9c, 0x8e, 0x1d, 0xb2, 0xa1, 0x76,
+ 0x9a, 0x12, 0xdb, 0x11, 0xad, 0x94, 0x95, 0xcf, 0x87, 0xee, 0x79, 0x5a,
+ 0xcc, 0x5e, 0xbf, 0x9a, 0xa5, 0xd7, 0xf8, 0x60, 0x78, 0x0c, 0xbc, 0x8f,
+ 0xc9, 0xe7, 0x1f, 0xfb, 0x49, 0xba, 0x36, 0xd0, 0xde, 0x09, 0x36, 0x00,
+ 0xf2, 0x70, 0x50, 0x17, 0x49, 0x02, 0x48, 0xac, 0x40, 0xa2, 0x48, 0x1b,
+ 0x41, 0xb5, 0x88, 0x69, 0xb8, 0x5b, 0xe0, 0x06, 0x65, 0x48, 0x99, 0x6d,
+ 0xdb, 0xe8, 0xd8, 0x0e, 0xcd, 0x2b, 0x05, 0x46, 0xd0, 0x92, 0xe7, 0xcf,
+ 0xa9, 0x1d, 0xbc, 0xd8, 0x15, 0xf5, 0xe5, 0x29, 0xa7, 0xce, 0x10, 0x88,
+ 0x91, 0xe1, 0xf1, 0x84, 0x63, 0x14, 0x8d, 0xb6, 0x47, 0x24, 0xf6, 0x04,
+ 0x44, 0xea, 0xe1, 0x8a, 0x83, 0x03, 0x4c, 0xc9, 0xc1, 0x5c, 0x46, 0x75,
+ 0xdd, 0x98, 0xae, 0xa4, 0x54, 0x0e, 0x81, 0x61, 0x08, 0xc2, 0xb7, 0x61,
+ 0x2c, 0x23, 0x4e, 0x3c, 0xe8, 0x29, 0x9c, 0x89, 0x5b, 0xc9, 0x6b, 0x66,
+ 0x2d, 0xb1, 0x25, 0xa5, 0xe8, 0xf2, 0xa2, 0xaf, 0xb3, 0x0f, 0x13, 0xb3,
+ 0x6e, 0xef, 0x49, 0xe7, 0x85, 0xa4, 0x3b, 0xce, 0xe8, 0xe3, 0x46, 0x80,
+ 0xf3, 0xce, 0xd1, 0xd8, 0xb7, 0x2b, 0x0d, 0xda, 0x9a, 0x36, 0xa5, 0xc7,
+ 0xe5, 0xe6, 0x48, 0x32, 0x3b, 0x8f, 0xaa, 0x9d, 0xc1, 0x0d, 0x40, 0xca,
+ 0xec, 0x2d, 0x60, 0x71, 0xd2, 0xae, 0xc8, 0x59, 0xea, 0x6a, 0x43, 0x78,
+ 0xd3, 0xc6, 0x20, 0x4a, 0xf7, 0x9e, 0x59, 0x23, 0x6a, 0x2a, 0x6f, 0xea,
+ 0x6c, 0x76, 0x45, 0xa6, 0x90, 0xbd, 0x42, 0xb8, 0x38, 0xb2, 0x2b, 0x92,
+ 0x21, 0x3c, 0xe0, 0xcb, 0xc2, 0x58, 0x2a, 0xa9, 0xe0, 0x73, 0x58, 0x96,
+ 0x5c, 0x43, 0xac, 0xbb, 0x8a, 0xec, 0x6d, 0x19, 0xc2, 0xb1, 0xcd, 0xcf,
+ 0x19, 0x80, 0x67, 0x9b, 0x6b, 0x89, 0x0e, 0x2f, 0x5b, 0x80, 0x6f, 0x1d,
+ 0x9d, 0x3b, 0x9a, 0xad, 0xfb, 0x05, 0xd1, 0xf9, 0x10, 0x58, 0xc3, 0x2b,
+ 0x1b, 0xa8, 0xfc, 0xba, 0x20, 0xba, 0xce, 0x3e, 0x12, 0xdb, 0xac, 0x8c,
+ 0xcd, 0xd9, 0x6b, 0x56, 0xab, 0x97, 0xf1, 0x52, 0x6b, 0xf8, 0x39, 0x64,
+ 0x21, 0xcd, 0x36, 0x11, 0x51, 0x91, 0xcd, 0x25, 0x88, 0x7a, 0x56, 0x03,
+ 0xd5, 0xca, 0xb3, 0xb5, 0x2a, 0x49, 0x63, 0x32, 0xb7, 0x30, 0x13, 0x41,
+ 0xdb, 0xea, 0xd1, 0x88, 0xa1, 0xa6, 0x6c, 0x0b, 0x42, 0x09, 0xf6, 0x3e,
+ 0x8c, 0xdc, 0x1d, 0x3a, 0x17, 0x2d, 0x08, 0x6e, 0x6b, 0x94, 0xcb, 0xb1,
+ 0x5b, 0x58, 0xda, 0x23, 0x00, 0xaf, 0x52, 0x93, 0x47, 0x61, 0x35, 0x35,
+ 0xad, 0x35, 0xe0, 0xcd, 0x9e, 0xb0, 0x82, 0x18, 0x81, 0x82, 0xdc, 0xa5,
+ 0x65, 0x6d, 0x77, 0x8e, 0x99, 0xad, 0x0f, 0x72, 0x21, 0x6e, 0x00, 0xc5,
+ 0x1e, 0x8a, 0x1b, 0x91, 0xbc, 0xab, 0xe5, 0xcd, 0xc3, 0xa2, 0x26, 0xec,
+ 0x92, 0x9a, 0x7e, 0xb3, 0x7b, 0x96, 0x06, 0x79, 0xb1, 0x5e, 0xe8, 0x48,
+ 0x27, 0x1e, 0xf5, 0x61, 0x8c, 0x15, 0x94, 0xd3, 0x35, 0x47, 0x48, 0x1c,
+ 0xaa, 0x94, 0x01, 0x19, 0x20, 0x6a, 0xe8, 0xb0, 0xae, 0xaa, 0x7f, 0xd1,
+ 0xce, 0x23, 0x0e, 0x3c, 0x03, 0x49, 0x0e, 0x92, 0xaf, 0xd2, 0x3a, 0x9f,
+ 0xf4, 0xa5, 0x28, 0x82, 0x14, 0x49, 0xa0, 0x37, 0x6c, 0xe1, 0x84, 0x64,
+ 0x8b, 0xf9, 0x76, 0xb7, 0x87, 0xc9, 0xf7, 0x5a, 0xe5, 0xc2, 0x18, 0x91,
+ 0x4c, 0xde, 0x9f, 0x4f, 0x80, 0xe3, 0xb6, 0x68, 0x10, 0x9a, 0x0f, 0xd9,
+ 0x9f, 0xe2, 0x67, 0x07, 0x4b, 0x36, 0x3e, 0xe2, 0x38, 0x00, 0xb1, 0xaa,
+ 0x69, 0xfd, 0xc1, 0x06, 0xb5, 0xb0, 0x56, 0x22, 0x8a, 0x90, 0x35, 0xc7,
+ 0xba, 0x34, 0x1b, 0xf9, 0x02, 0x7d, 0x41, 0xc8, 0xab, 0xd0, 0xe0, 0x8b,
+ 0x87, 0x8d, 0x62, 0x47, 0x6a, 0x6d, 0x21, 0x53, 0xb6, 0x0a, 0x18, 0x76,
+ 0xa6, 0x15, 0x51, 0x83, 0x81, 0x99, 0x30, 0x9a, 0x1a, 0x11, 0xa0, 0x67,
+ 0x97, 0xc7, 0x7f, 0x48, 0x0e, 0xbb, 0x31, 0x70, 0xba, 0x99, 0x54, 0x0c,
+ 0x4b, 0xc9, 0x58, 0xbb, 0xc1, 0xd0, 0x77, 0x86, 0x98, 0x32, 0x2b, 0x66,
+ 0x8a, 0xe5, 0xdf, 0x90, 0x0c, 0x59, 0xe7, 0xed, 0xad, 0x4b, 0xc9, 0x90,
+ 0x40, 0x49, 0x3d, 0x5b, 0x7b, 0x0d, 0xd1, 0x81, 0x3b, 0x57, 0x85, 0x84,
+ 0x49, 0xdd, 0xf3, 0x94, 0x33, 0x54, 0x3e, 0x9a, 0x83, 0xad, 0x29, 0x0a,
+ 0x34, 0xcd, 0xd7, 0x37, 0x5a, 0x50, 0x90, 0x40, 0xd8, 0x04, 0x47, 0x26,
+ 0x53, 0x8b, 0xa9, 0x95, 0xb9, 0xf8, 0x95, 0x57, 0xd0, 0xc4, 0xb6, 0x40,
+ 0xbb, 0xff, 0x3d, 0x1d, 0xb9, 0xf7, 0x7a, 0xb1, 0xc8, 0x15, 0xc8, 0x7d,
+ 0xb9, 0x62, 0x3b, 0xa8, 0xbd, 0x65, 0xf5, 0xd8, 0xf1, 0x6d, 0x76, 0xae,
+ 0xf0, 0x52, 0x2c, 0x04, 0x5d, 0x01, 0x80, 0x7f, 0x20, 0xf8, 0x8d, 0x3b,
+ 0x55, 0xa5, 0xa6, 0x7f, 0x31, 0x81, 0x76, 0x92, 0xee, 0x08, 0x2e, 0x98,
+ 0x2c, 0xa4, 0x93, 0x0c, 0xe6, 0x37, 0xad, 0xb6, 0x53, 0x6e, 0x40, 0x54,
+ 0x8b, 0x59, 0x45, 0x55, 0xf8, 0xb3, 0xa3, 0x6f, 0x47, 0xad, 0x94, 0x1f,
+ 0xd3, 0x1a, 0x3e, 0xa4, 0xa5, 0x83, 0x3a, 0x1b, 0xda, 0x48, 0xc3, 0x93,
+ 0xa6, 0x23, 0x9e, 0x2c, 0x9d, 0xa3, 0x87, 0x3d, 0xa6, 0xcb, 0xa6, 0xd5,
+ 0x2c, 0x55, 0xd8, 0x98, 0x64, 0x1e, 0x1b, 0x6d, 0x51, 0x6e, 0x78, 0x37,
+ 0x1f, 0xef, 0x9f, 0xb2, 0x56, 0x99, 0xc8, 0x6c, 0xa5, 0x5c, 0xd7, 0x60,
+ 0x9c, 0x31, 0xd9, 0x10, 0x31, 0x09, 0x62, 0x15, 0xa9, 0x7f, 0x38, 0x81,
+ 0xbc, 0x33, 0xe7, 0xd8, 0xdc, 0x1b, 0x6e, 0x77, 0xd3, 0x1d, 0xb4, 0x6a,
+ 0x9c, 0x39, 0x17, 0x67, 0xb4, 0xae, 0x6f, 0x57, 0xae, 0xb1, 0x90, 0xea,
+ 0x21, 0xa4, 0x5b, 0x69, 0xaf, 0x69, 0x75, 0xa0, 0xd9, 0x16, 0x56, 0xcf,
+ 0xd2, 0x45, 0x17, 0xe1, 0xc7, 0x83, 0x24, 0x99, 0x32, 0x4d, 0xe6, 0xf7,
+ 0x92, 0xc3, 0x22, 0xba, 0x01, 0x71, 0x73, 0xc0, 0x2b, 0xf1, 0xe9, 0xa7,
+ 0x81, 0x2e, 0xf8, 0xd1, 0x3e, 0x7d, 0x60, 0x7e, 0xed, 0x79, 0x3f, 0x66,
+ 0x84, 0x17, 0x21, 0x6f, 0x03, 0xf4, 0x50, 0xeb, 0x02, 0x89, 0x58, 0x18,
+ 0x5e, 0x65, 0x2e, 0xfe, 0xa2, 0x0d, 0xb1, 0x04, 0xbb, 0xac, 0xef, 0xe4,
+ 0xfe, 0x06, 0x9b, 0xd7, 0xdc, 0xd1, 0xb4, 0x66, 0xdc, 0xd1, 0x0a, 0xc3,
+ 0x4c, 0xc5, 0x64, 0xb7, 0xb7, 0x9e, 0xd6, 0x6c, 0x34, 0xf7, 0x21, 0x5d,
+ 0xaa, 0x64, 0x04, 0x8c, 0x4a, 0x69, 0x98, 0x26, 0x59, 0x3a, 0x63, 0x77,
+ 0x47, 0x67, 0x1f, 0xd9, 0x92, 0x58, 0x4e, 0x46, 0xbc, 0x5b, 0xdd, 0x9d,
+ 0x77, 0xbf, 0xa6, 0x3b, 0x87, 0xc9, 0xda, 0x54, 0x2b, 0x4c, 0x10, 0x4b,
+ 0xfc, 0x5a, 0x89, 0x98, 0x4b, 0xec, 0x6a, 0xd5, 0x7b, 0x78, 0x8e, 0x50,
+ 0x93, 0x66, 0xdc, 0x26, 0x69, 0x0d, 0x1d, 0x13, 0x45, 0xc9, 0x4f, 0xc3,
+ 0xa8, 0xa1, 0xf6, 0xfb, 0xda, 0x95, 0xc7, 0x76, 0xf7, 0xe4, 0xca, 0xfb,
+ 0x68, 0x4b, 0x33, 0xc1, 0x86, 0x97, 0xfc, 0xa8, 0xbd, 0xe1, 0xae, 0xaf,
+ 0x5f, 0xd9, 0xa4, 0xc6, 0x0a, 0x49, 0x54, 0x34, 0xc5, 0x1b, 0x9e, 0x8a,
+ 0x42, 0x23, 0x01, 0x68, 0xb2, 0xf3, 0x9a, 0xfc, 0x6c, 0x8f, 0xd9, 0x0d,
+ 0xcc, 0x49, 0x12, 0xf6, 0x40, 0x4a, 0x72, 0xcd, 0xe6, 0x0b, 0x4e, 0xfe,
+ 0x8a, 0x94, 0x54, 0xc5, 0x39, 0x7a, 0xea, 0x8e, 0xd4, 0x33, 0xbb, 0xdc,
+ 0xd2, 0x47, 0xce, 0x15, 0x91, 0x22, 0x64, 0x9c, 0xae, 0x01, 0xe5, 0x33,
+ 0xcb, 0xb8, 0xa5, 0x66, 0x65, 0xa2, 0xea, 0x51, 0x9b, 0x01, 0x9e, 0xf6,
+ 0x33, 0x2e, 0x5b, 0x5b, 0x1d, 0x53, 0x58, 0xbf, 0x05, 0x65, 0x4c, 0xad,
+ 0x12, 0x1e, 0x3b, 0x22, 0x69, 0xc0, 0x20, 0x91, 0xa1, 0xa4, 0x18, 0x9d,
+ 0x6b, 0x76, 0x74, 0xd3, 0xd6, 0x52, 0xae, 0x5c, 0x17, 0x46, 0xb3, 0xea,
+ 0x99, 0x69, 0x77, 0x96, 0x9b, 0x0e, 0x6d, 0x82, 0x4e, 0x47, 0xab, 0x25,
+ 0x89, 0x2c, 0xd4, 0x2d, 0x6c, 0x89, 0x2d, 0xda, 0xa5, 0x88, 0x42, 0x3e,
+ 0xcd, 0xae, 0xd0, 0xe5, 0x6b, 0xa0, 0x9f, 0x0c, 0xfe, 0x87, 0xcc, 0x0c,
+ 0xa9, 0xe7, 0x04, 0x01, 0x03, 0xf3, 0xd1, 0xc2, 0x63, 0xbf, 0x10, 0xd4,
+ 0x29, 0x04, 0x3e, 0xe1, 0x3b, 0x75, 0x1c, 0x96, 0x10, 0x5f, 0x73, 0xfd,
+ 0x20, 0xff, 0x74, 0xec, 0x79, 0xd6, 0xad, 0x10, 0x25, 0xa2, 0x82, 0x9b,
+ 0xdb, 0x70, 0x75, 0x54, 0x01, 0xf9, 0x0b, 0x3a, 0x6c, 0x2f, 0xb2, 0xaf,
+ 0x88, 0xe2, 0xf8, 0xa8, 0x4c, 0xfd, 0x69, 0x55, 0x5b, 0x6e, 0x43, 0x7b,
+ 0xca, 0x9b, 0xdf, 0xba, 0x32, 0x98, 0x78, 0x7e, 0x60, 0x5e, 0x18, 0xbc,
+ 0x13, 0x77, 0xc6, 0x97, 0xfc, 0x85, 0x21, 0xc9, 0x33, 0xf9, 0xc2, 0x39,
+ 0xb5, 0x65, 0x1f, 0x38, 0x90, 0x97, 0x88, 0xad, 0xbe, 0x27, 0x9e, 0x9c,
+ 0xf6, 0xac, 0xf0, 0xf3, 0xca, 0x66, 0xdf, 0xa9, 0x69, 0x8b, 0x43, 0xc6,
+ 0x7f, 0xe5, 0x77, 0xc5, 0x78, 0xbc, 0xa7, 0x26, 0x86, 0x9c, 0x4d, 0x21,
+ 0xbe, 0x97, 0xfd, 0xbd, 0x1d, 0xee, 0x8c, 0x96, 0xa2, 0x85, 0x5e, 0x27,
+ 0x5b, 0xd2, 0xe1, 0x39, 0x70, 0x10, 0x50, 0x36, 0xca, 0x0d, 0x9c, 0x72,
+ 0x3f, 0x08, 0x87, 0x33, 0x17, 0x40, 0x34, 0x02, 0x65, 0x74, 0x35, 0x99,
+ 0xbb, 0x96, 0x09, 0x0a, 0x4b, 0x59, 0x9f, 0x0d, 0xb7, 0x40, 0x7d, 0xab,
+ 0xf2, 0x6d, 0x52, 0x51, 0x77, 0xdf, 0x6a, 0xca, 0x28, 0xa2, 0x92, 0xa2,
+ 0x68, 0xec, 0x9d, 0xcd, 0x85, 0xcd, 0x6b, 0x45, 0x3d, 0x98, 0x1d, 0x7d,
+ 0x71, 0xf8, 0xf6, 0xeb, 0x63, 0x68, 0x02, 0x90, 0xed, 0x74, 0x40, 0x73,
+ 0xda, 0xed, 0xd3, 0xe5, 0x04, 0xa6, 0x90, 0x99, 0x31, 0x40, 0xd8, 0xea,
+ 0xa1, 0xa4, 0x4a, 0x73, 0x62, 0x4a, 0x2a, 0x9b, 0x17, 0xcb, 0x2d, 0xc0,
+ 0xb4, 0x8d, 0x44, 0x3d, 0xaa, 0xd0, 0x20, 0x00, 0x63, 0xae, 0xd8, 0xfd,
+ 0x5a, 0x2f, 0xc7, 0x0b, 0x94, 0x62, 0x81, 0x7d, 0xe6, 0xc4, 0x8c, 0xfa,
+ 0x59, 0x86, 0xed, 0xb3, 0xb8, 0xa1, 0x69, 0x4b, 0xd6, 0xa6, 0xaf, 0x60,
+ 0xd3, 0x0f, 0x7d, 0xaf, 0x1a, 0xf3, 0x62, 0xec, 0xed, 0xee, 0x3a, 0xca,
+ 0xb2, 0xd4, 0x36, 0x18, 0x48, 0xcb, 0x2a, 0xd9, 0x1d, 0x7c, 0xf6, 0xd9,
+ 0x2a, 0x41, 0x68, 0x1b, 0x05, 0x15, 0xc2, 0xb3, 0x47, 0xb7, 0x39, 0xa0,
+ 0x47, 0x57, 0xb5, 0x19, 0xb1, 0x68, 0x50, 0x62, 0x4e, 0x40, 0x81, 0xb5,
+ 0xd5, 0x5a, 0xc4, 0xc3, 0xc3, 0xd1, 0x1a, 0xc4, 0xc1, 0x6c, 0x69, 0x32,
+ 0x4c, 0xe5, 0x46, 0x62, 0xed, 0x0f, 0x50, 0x87, 0xa8, 0x33, 0x68, 0x41,
+ 0xb8, 0xc0, 0xdc, 0x86, 0x63, 0x1f, 0x35, 0x31, 0x9e, 0x01, 0xbf, 0x62,
+ 0x8a, 0xae, 0xc2, 0xd1, 0xa8, 0x4a, 0xf0, 0xee, 0x9c, 0xfc, 0x7f, 0x27,
+ 0x6f, 0xbf, 0x66, 0x77, 0x88, 0xb1, 0xed, 0xe1, 0x4b, 0xdf, 0xe9, 0x58,
+ 0xfa, 0xef, 0xa4, 0x5a, 0x36, 0x15, 0x88, 0x22, 0x1c, 0x06, 0xd3, 0xd5,
+ 0xe7, 0x85, 0x94, 0xa8, 0xb6, 0xab, 0xbf, 0xc2, 0x57, 0x79, 0x99, 0x0c,
+ 0x3c, 0xe5, 0x44, 0x88, 0xc7, 0x48, 0x33, 0x99, 0xdf, 0xab, 0x65, 0x24,
+ 0x5f, 0x40, 0xeb, 0x1a, 0x99, 0xb1, 0xcd, 0xb2, 0x9d, 0xcb, 0xe6, 0x39,
+ 0x76, 0x50, 0xa0, 0x9b, 0x44, 0x3e, 0xc9, 0x9f, 0xc1, 0xf9, 0xee, 0x68,
+ 0x22, 0x8f, 0xeb, 0x4a, 0xcb, 0xd5, 0xd9, 0x66, 0x3d, 0x26, 0xcd, 0xaa,
+ 0xaf, 0xbe, 0x9f, 0xae, 0x1b, 0x92, 0xeb, 0xc9, 0xf9, 0x52, 0x9d, 0x56,
+ 0x1b, 0x6c, 0xea, 0x65, 0xf9, 0xcf, 0xf7, 0x73, 0x4d, 0x0f, 0xe9, 0xa0,
+ 0xd2, 0x4d, 0x55, 0x4c, 0x9d, 0x4f, 0x43, 0x7a, 0x1c, 0x0d, 0x84, 0x5c,
+ 0xf2, 0xfb, 0xfc, 0xe9, 0x34, 0xfe, 0x39, 0x7e, 0x5f, 0xa7, 0x26, 0x72,
+ 0x00, 0x48, 0xa5, 0x15, 0x62, 0x3a, 0x9b, 0x42, 0xae, 0xb6, 0x0c, 0x69,
+ 0xe1, 0x90, 0x1c, 0x79, 0x5b, 0x2d, 0xd9, 0x48, 0x84, 0xab, 0x02, 0xb4,
+ 0x75, 0xb4, 0x87, 0xc0, 0x8f, 0x82, 0xcb, 0xeb, 0x03, 0x30, 0x9e, 0xe6,
+ 0xf9, 0x65, 0x51, 0x64, 0x64, 0xa4, 0xa2, 0xaa, 0x64, 0xce, 0xf6, 0x42,
+ 0xdf, 0x9e, 0xa2, 0x6a, 0x29, 0x35, 0x9d, 0x01, 0x34, 0x30, 0x9d, 0x4f,
+ 0xeb, 0x1b, 0x54, 0x31, 0xb3, 0xae, 0xa8, 0x50, 0xbd, 0xc2, 0xe7, 0xb9,
+ 0x5d, 0xd2, 0xa7, 0x58, 0x99, 0x82, 0x72, 0xdd, 0x9a, 0x8a, 0xf6, 0x0c,
+ 0x6c, 0x6c, 0x90, 0x13, 0x7e, 0x87, 0x5c, 0xf1, 0xa3, 0x70, 0x02, 0xd5,
+ 0x97, 0xbe, 0xd6, 0x1f, 0xef, 0x62, 0x0c, 0x0f, 0x78, 0xe6, 0x3d, 0xef,
+ 0xc9, 0x63, 0x4f, 0x1c, 0xeb, 0xef, 0x91, 0xb8, 0x22, 0x0e, 0x9d, 0x27,
+ 0xc8, 0xa2, 0x5b, 0xbd, 0xed, 0x4d, 0xf3, 0x6d, 0x01, 0x38, 0x7d, 0x60,
+ 0x99, 0xa1, 0x66, 0x46, 0x67, 0xb9, 0x38, 0x85, 0xec, 0xfc, 0xdd, 0xa5,
+ 0x50, 0x49, 0xa9, 0x78, 0xf7, 0x6b, 0x09, 0xf9, 0x45, 0x43, 0x21, 0xcd,
+ 0x48, 0xb7, 0x60, 0xf3, 0x17, 0xb1, 0x6e, 0xce, 0x8a, 0xc4, 0x37, 0x31,
+ 0x42, 0xee, 0x60, 0xdf, 0x66, 0xc0, 0x9c, 0x9f, 0x8d, 0x2e, 0xc9, 0x8d,
+ 0x80, 0xab, 0x4f, 0xed, 0xd1, 0xef, 0x8e, 0x2f, 0xbe, 0x3a, 0x1b, 0x1d,
+ 0x9b, 0xf5, 0x78, 0x75, 0xfc, 0xd5, 0x3b, 0x92, 0x5a, 0xb4, 0x3b, 0xd8,
+ 0xf5, 0x4c, 0xd9, 0x31, 0xe2, 0xff, 0xa2, 0xba, 0xae, 0x48, 0x91, 0xc3,
+ 0x36, 0x65, 0x3d, 0x48, 0xeb, 0x79, 0x5a, 0x15, 0x8f, 0xeb, 0x92, 0xce,
+ 0x32, 0xf6, 0x55, 0xe6, 0xc8, 0x25, 0x60, 0x0a, 0x1f, 0xc9, 0x43, 0x42,
+ 0x25, 0x43, 0x98, 0x97, 0x72, 0x94, 0x98, 0x46, 0xbb, 0x3e, 0x70, 0x4e,
+ 0xcd, 0x5b, 0xf6, 0x4c, 0xcb, 0xe1, 0x73, 0xb5, 0x17, 0xc1, 0x27, 0x84,
+ 0xcd, 0x7b, 0x64, 0xf5, 0x68, 0x61, 0xd4, 0x99, 0x95, 0x7c, 0x6b, 0xa2,
+ 0x5c, 0x20, 0xb5, 0x8d, 0x7b, 0x3c, 0x6f, 0x70, 0x85, 0xb3, 0x41, 0x21,
+ 0xa5, 0x0b, 0x6b, 0xde, 0xdc, 0x5c, 0xa7, 0x95, 0x60, 0x64, 0x99, 0x57,
+ 0xb6, 0xb2, 0xce, 0xb8, 0x8c, 0x01, 0xdf, 0xda, 0x12, 0x0f, 0x67, 0xcc,
+ 0xae, 0xd0, 0x78, 0x6d, 0x89, 0x11, 0x7c, 0x87, 0x71, 0x0a, 0x45, 0x39,
+ 0xd7, 0xfe, 0xb3, 0x7c, 0xb6, 0x34, 0xf3, 0x7e, 0x1d, 0x16, 0xde, 0x3a,
+ 0xb7, 0xab, 0x45, 0xcf, 0x25, 0x8f, 0x94, 0xfc, 0x1c, 0xac, 0x08, 0x48,
+ 0x5a, 0x12, 0xfa, 0xdd, 0xa9, 0x68, 0xe2, 0x14, 0x14, 0x3e, 0xbb, 0x94,
+ 0x16, 0xe0, 0x99, 0x90, 0xab, 0x8b, 0x05, 0xaa, 0x36, 0x2b, 0x01, 0x26,
+ 0x97, 0x14, 0xc4, 0xc2, 0x55, 0x10, 0x75, 0xb4, 0xa4, 0x08, 0x09, 0xf0,
+ 0xe6, 0x0b, 0xcf, 0x3b, 0xb7, 0x8e, 0xff, 0xe2, 0x8c, 0x7a, 0x81, 0x93,
+ 0x8d, 0x8d, 0x8d, 0x57, 0xc7, 0x97, 0x87, 0x27, 0xa7, 0xc7, 0xaf, 0x92,
+ 0x93, 0xb7, 0xaf, 0xcf, 0x2e, 0xde, 0x1c, 0x5e, 0x0a, 0x1c, 0xe3, 0x95,
+ 0xf5, 0xc8, 0xb9, 0x2a, 0x6b, 0x52, 0x4b, 0xc8, 0xf3, 0xd6, 0x61, 0x0b,
+ 0x9b, 0x55, 0xbc, 0x96, 0x32, 0xea, 0x3c, 0x0d, 0x59, 0x6b, 0x0e, 0x36,
+ 0x12, 0x81, 0x71, 0xb8, 0xb2, 0x74, 0xa4, 0x17, 0xec, 0xd8, 0xd8, 0xfb,
+ 0x50, 0xa7, 0xd3, 0xf2, 0x28, 0x11, 0xdd, 0xf0, 0xda, 0xa6, 0x6c, 0x95,
+ 0x51, 0xbe, 0x13, 0x5d, 0x49, 0x60, 0xec, 0xc9, 0xc1, 0xc9, 0x0e, 0x17,
+ 0xb4, 0xf6, 0x4a, 0x16, 0x68, 0xbd, 0x19, 0xb0, 0x72, 0x50, 0x3b, 0x1e,
+ 0x81, 0xce, 0x55, 0x09, 0x54, 0x89, 0xdf, 0xa6, 0xa5, 0x85, 0xc1, 0x8a,
+ 0x1a, 0x2d, 0x80, 0x61, 0x3c, 0xf8, 0x89, 0xbf, 0xbe, 0xc4, 0xcb, 0xb2,
+ 0x41, 0xc9, 0x00, 0x8d, 0x14, 0x4b, 0x23, 0x8a, 0xa3, 0xda, 0xac, 0x94,
+ 0x3d, 0xeb, 0xa0, 0x5d, 0xb2, 0x02, 0x5b, 0xa3, 0x73, 0xc2, 0x55, 0xeb,
+ 0x37, 0xb5, 0x65, 0xe3, 0xf5, 0x46, 0x63, 0x1a, 0x9c, 0x08, 0x71, 0x32,
+ 0xcd, 0xc5, 0xf6, 0x06, 0x73, 0xeb, 0x17, 0x4a, 0x59, 0x67, 0x91, 0xa0,
+ 0xce, 0xe2, 0xcf, 0x77, 0xbc, 0xc2, 0x8f, 0x38, 0x6d, 0xee, 0xdc, 0x2a,
+ 0xd1, 0xf5, 0xe0, 0x95, 0x79, 0x68, 0xba, 0x9c, 0x2f, 0xb4, 0xda, 0xb7,
+ 0x68, 0xd4, 0xf0, 0xe5, 0xe9, 0x12, 0xb2, 0xd2, 0x06, 0xe5, 0x03, 0x8e,
+ 0x9f, 0xd7, 0x32, 0x07, 0x3c, 0x0e, 0xec, 0xef, 0x46, 0x43, 0x81, 0x28,
+ 0x36, 0x6b, 0xa3, 0x77, 0xdd, 0xf2, 0x9d, 0x6d, 0xcd, 0x05, 0x13, 0x32,
+ 0xb2, 0xcf, 0x76, 0xeb, 0x7d, 0xa6, 0x0e, 0x6b, 0x84, 0xf9, 0xdf, 0x52,
+ 0xfa, 0x2f, 0xda, 0xb2, 0xd2, 0xa0, 0x5c, 0x15, 0x61, 0xf0, 0xb1, 0x35,
+ 0x28, 0xff, 0xc5, 0x36, 0xa4, 0xc7, 0x97, 0xf4, 0xfa, 0x69, 0xc7, 0x76,
+ 0xd5, 0xed, 0x81, 0x48, 0x71, 0x23, 0x4f, 0xee, 0xb5, 0xd0, 0x05, 0x71,
+ 0x2a, 0x02, 0x6e, 0x44, 0xce, 0x52, 0xf0, 0x11, 0x88, 0xa4, 0x44, 0x40,
+ 0x4c, 0xb7, 0xef, 0x12, 0xe5, 0x1b, 0xca, 0x0f, 0x64, 0xcb, 0x6b, 0xc9,
+ 0x56, 0x2f, 0x95, 0x8e, 0x51, 0x64, 0xc2, 0x74, 0x07, 0xa1, 0x57, 0x6c,
+ 0x68, 0xd6, 0xaf, 0xbe, 0xa4, 0x58, 0x44, 0x48, 0x7f, 0x2e, 0x35, 0x0f,
+ 0x21, 0x4f, 0x46, 0x75, 0x96, 0xd6, 0x30, 0xa8, 0x90, 0x50, 0xc3, 0x77,
+ 0x86, 0x75, 0xc3, 0x3a, 0xd2, 0x36, 0xaf, 0x90, 0x1d, 0x44, 0xf4, 0x34,
+ 0x79, 0x41, 0xcf, 0x12, 0x29, 0x8e, 0xc7, 0x0a, 0x93, 0x79, 0xad, 0x68,
+ 0x80, 0xc3, 0x34, 0xc3, 0x95, 0xe8, 0x19, 0x16, 0x7a, 0x4e, 0x0f, 0xa4,
+ 0xaa, 0xe1, 0xf7, 0x5c, 0xd1, 0xa1, 0xde, 0xe2, 0xc6, 0x7c, 0xa3, 0x97,
+ 0x5c, 0x93, 0x8d, 0x34, 0x36, 0x5d, 0x0f, 0x04, 0xe8, 0x94, 0x1f, 0x7f,
+ 0x79, 0x91, 0x5e, 0xa5, 0xd9, 0xec, 0x4f, 0xfb, 0xbb, 0xa3, 0xf4, 0x7a,
+ 0x39, 0x4b, 0xff, 0x0d, 0x2f, 0xbe, 0x7c, 0xf2, 0x64, 0x7f, 0xf7, 0x93,
+ 0x4f, 0x77, 0x7b, 0x5d, 0xf4, 0x81, 0xe3, 0x64, 0x01, 0xc2, 0x06, 0x9c,
+ 0x2c, 0x24, 0x77, 0xf1, 0x9d, 0xe1, 0xe4, 0x3a, 0x87, 0x51, 0x47, 0x8a,
+ 0x92, 0xcc, 0x41, 0xca, 0xd6, 0x24, 0xc4, 0x24, 0xe7, 0x0f, 0x9b, 0x1d,
+ 0x5c, 0x9b, 0x7d, 0xfd, 0xc7, 0xbd, 0x03, 0x16, 0x65, 0xd7, 0x70, 0xbe,
+ 0xa7, 0xbc, 0x63, 0x93, 0x17, 0x79, 0x61, 0x6e, 0xa0, 0x2f, 0x92, 0x26,
+ 0xbd, 0xb6, 0x7b, 0x55, 0x58, 0x12, 0x38, 0x1d, 0xc2, 0xc6, 0x37, 0xaf,
+ 0x68, 0x93, 0xe7, 0x66, 0xaa, 0xb6, 0xc0, 0x85, 0xb1, 0x59, 0x43, 0xc9,
+ 0x5a, 0x64, 0x15, 0x32, 0x57, 0xaf, 0xab, 0x74, 0xae, 0x49, 0x27, 0xf4,
+ 0x3e, 0xc1, 0xd6, 0x86, 0x8b, 0x99, 0x16, 0x5f, 0x67, 0xbf, 0x45, 0xee,
+ 0x36, 0xdc, 0x6c, 0x51, 0xbb, 0xea, 0x98, 0x7c, 0xdd, 0x9c, 0x48, 0x51,
+ 0xb1, 0x4d, 0x72, 0xa9, 0xf4, 0xd8, 0xa7, 0xd2, 0xc3, 0xa8, 0xfa, 0xb6,
+ 0x92, 0xf4, 0x60, 0xaa, 0x23, 0x1d, 0xe2, 0xef, 0x60, 0xf5, 0x48, 0x99,
+ 0x11, 0xb0, 0xb7, 0xe0, 0x3c, 0x7a, 0x5b, 0x5f, 0x8a, 0x9d, 0x6f, 0x79,
+ 0x6b, 0x5c, 0xa9, 0x03, 0x5f, 0x26, 0x2f, 0xd4, 0x4b, 0xb4, 0xf7, 0xc5,
+ 0x4b, 0x6c, 0x88, 0xbd, 0x2f, 0xfe, 0xcd, 0xfe, 0x6c, 0x5f, 0x7e, 0xb6,
+ 0xff, 0xc5, 0xbf, 0x0d, 0x87, 0xe8, 0x1f, 0xed, 0x90, 0x4d, 0xfd, 0xf5,
+ 0xa6, 0xb0, 0x26, 0xa5, 0x72, 0x84, 0xf9, 0x5f, 0x64, 0xb6, 0x73, 0x51,
+ 0x2a, 0xac, 0x75, 0x4f, 0xbf, 0xec, 0xcf, 0x72, 0x5f, 0x22, 0xaa, 0x56,
+ 0x6e, 0xe5, 0xb5, 0x4f, 0x3d, 0x57, 0xc7, 0x26, 0xdd, 0xc6, 0x41, 0xd0,
+ 0x8e, 0xc0, 0x28, 0xf1, 0xf2, 0x9f, 0x69, 0xa7, 0xfe, 0x79, 0x23, 0x91,
+ 0xe8, 0x26, 0x2d, 0xc7, 0x3d, 0x02, 0x1e, 0xba, 0x6d, 0x99, 0xee, 0x88,
+ 0x79, 0x91, 0xa9, 0x65, 0x4a, 0xe3, 0xa0, 0x3b, 0xd0, 0x2b, 0xb1, 0xf4,
+ 0x17, 0xa9, 0x4a, 0x6b, 0xf3, 0x5f, 0xf4, 0x19, 0x4e, 0x79, 0x31, 0x3a,
+ 0x46, 0x43, 0xd2, 0x01, 0xcf, 0xfe, 0xe9, 0x87, 0x1f, 0x44, 0xa1, 0x32,
+ 0x7f, 0x91, 0x9e, 0xdf, 0x18, 0x59, 0x34, 0x35, 0xe2, 0x6d, 0x8e, 0x9a,
+ 0x2d, 0x52, 0x15, 0x4b, 0xae, 0xfc, 0x2b, 0x19, 0x29, 0x37, 0x62, 0x96,
+ 0xf6, 0x70, 0x74, 0x74, 0x72, 0x02, 0xc4, 0x28, 0x26, 0xf5, 0x98, 0xc5,
+ 0x18, 0xf6, 0xe6, 0x16, 0x20, 0x1e, 0x0e, 0x96, 0xe8, 0x6f, 0x7d, 0x5a,
+ 0x3b, 0x2c, 0x3b, 0x76, 0xbf, 0x69, 0x4c, 0x0d, 0x70, 0x59, 0x4a, 0xec,
+ 0x59, 0xd6, 0x72, 0x5e, 0xf6, 0xf8, 0xc1, 0xeb, 0xbc, 0x27, 0x41, 0x2c,
+ 0xfe, 0x49, 0xcf, 0x91, 0x60, 0xf1, 0x7a, 0x60, 0xd1, 0x5e, 0xb2, 0xea,
+ 0x94, 0xff, 0x23, 0x7b, 0xb9, 0xb7, 0x1b, 0x7f, 0x02, 0x51, 0x5b, 0xa2,
+ 0xfd, 0x7b, 0xe9, 0x02, 0x82, 0xeb, 0x9e, 0xcf, 0xa7, 0xfc, 0xb4, 0x54,
+ 0x95, 0x46, 0x81, 0xaf, 0x97, 0xbd, 0x31, 0xdd, 0xb0, 0xf4, 0x7f, 0x2b,
+ 0xfa, 0x81, 0x88, 0x95, 0x3c, 0x5b, 0x2f, 0xc7, 0xf3, 0xbc, 0xd5, 0xe1,
+ 0x1d, 0x1a, 0xe0, 0x17, 0x34, 0xe0, 0xef, 0x33, 0xbb, 0x3b, 0x32, 0x52,
+ 0xed, 0x58, 0xf7, 0xdb, 0xbc, 0x2a, 0xcb, 0x71, 0x5a, 0x6d, 0x4a, 0x38,
+ 0x47, 0xfb, 0xb9, 0xb9, 0xb7, 0xff, 0xe4, 0xe9, 0xb3, 0xcd, 0xa1, 0xe8,
+ 0x69, 0x10, 0x11, 0x8d, 0x4f, 0x3c, 0xc2, 0x4d, 0x58, 0xca, 0x0c, 0x46,
+ 0x4d, 0x23, 0x55, 0x3f, 0x16, 0x5c, 0x25, 0x29, 0x46, 0x9f, 0x7b, 0xc9,
+ 0x5f, 0xfb, 0x37, 0xfa, 0xce, 0x4b, 0x7c, 0xe2, 0xdf, 0xf2, 0xe9, 0x4b,
+ 0x3b, 0xc2, 0x7f, 0xa3, 0xb1, 0xbc, 0x94, 0x41, 0x98, 0x75, 0xd5, 0x74,
+ 0xc2, 0x7a, 0x7b, 0x23, 0x2a, 0xd7, 0xa2, 0x8b, 0xab, 0x8b, 0xb8, 0x81,
+ 0x41, 0x03, 0xc1, 0x30, 0x98, 0x72, 0xf4, 0x03, 0xda, 0xaa, 0x4b, 0xa6,
+ 0xdb, 0xf9, 0x38, 0x30, 0xad, 0x0c, 0xa8, 0x95, 0x81, 0x13, 0xd8, 0x60,
+ 0x6b, 0x1c, 0xd0, 0x42, 0xf4, 0x25, 0x9b, 0x72, 0x06, 0x2f, 0x8b, 0xa8,
+ 0x02, 0x65, 0x09, 0x10, 0xc0, 0xd1, 0xd7, 0x27, 0x9b, 0x02, 0xbc, 0x61,
+ 0x33, 0xb1, 0x1f, 0xf3, 0x4f, 0x5b, 0x88, 0xe1, 0x24, 0x5d, 0xd0, 0xe9,
+ 0xdf, 0x50, 0x42, 0xda, 0x94, 0x70, 0x24, 0xf4, 0x5d, 0x4e, 0x7c, 0x36,
+ 0x1f, 0x93, 0x5b, 0x67, 0x46, 0x1e, 0xef, 0x8a, 0x79, 0x24, 0xbd, 0x66,
+ 0xcc, 0xbc, 0xd4, 0x02, 0x28, 0x41, 0xcc, 0x67, 0x61, 0x33, 0x27, 0x07,
+ 0xaf, 0x6d, 0xd0, 0xd3, 0x66, 0xea, 0xc9, 0xa3, 0xe6, 0x57, 0x2c, 0x4f,
+ 0x54, 0x44, 0xf4, 0x86, 0x5a, 0xb3, 0x9b, 0x77, 0x82, 0x2f, 0x3d, 0x90,
+ 0xbd, 0x3f, 0xce, 0x24, 0xdf, 0x92, 0xdd, 0x26, 0xac, 0x18, 0x92, 0xfc,
+ 0x7c, 0x61, 0x8b, 0xe5, 0x7d, 0x91, 0x80, 0x57, 0x9a, 0xdf, 0x92, 0xb8,
+ 0x63, 0xab, 0x74, 0x3d, 0x5e, 0xda, 0x70, 0x05, 0xfa, 0x78, 0x46, 0x1c,
+ 0x1a, 0x47, 0x14, 0x03, 0x9f, 0x30, 0x73, 0x7c, 0x2f, 0xce, 0x06, 0x6a,
+ 0x61, 0xf3, 0x73, 0x1c, 0x82, 0x17, 0xb4, 0x0c, 0xf8, 0xf5, 0x17, 0x9b,
+ 0x1b, 0xb6, 0x56, 0x94, 0xd5, 0xdc, 0x3b, 0x01, 0x64, 0xde, 0xa0, 0xfe,
+ 0x78, 0x3c, 0x82, 0x04, 0xd6, 0xc6, 0x88, 0x8e, 0x05, 0x05, 0x21, 0x8c,
+ 0x36, 0x35, 0x9b, 0x4a, 0xa5, 0x5d, 0xeb, 0xa0, 0xe6, 0xc6, 0x33, 0x4a,
+ 0x53, 0x20, 0xed, 0x71, 0x93, 0xd0, 0xaa, 0x78, 0x6f, 0xd3, 0x92, 0xa3,
+ 0xc2, 0x67, 0x0a, 0x81, 0x57, 0x65, 0x5a, 0x00, 0x76, 0x43, 0x8a, 0x71,
+ 0x39, 0x6d, 0xde, 0x1f, 0x58, 0xed, 0x29, 0x0f, 0x2e, 0x5f, 0x91, 0x39,
+ 0x8a, 0x82, 0x23, 0xf2, 0x9a, 0x12, 0x81, 0xe5, 0xa3, 0x2f, 0x69, 0xba,
+ 0xf7, 0x86, 0xd7, 0xf9, 0x15, 0x4f, 0x86, 0x11, 0x91, 0xd7, 0xd9, 0x8e,
+ 0xf9, 0x67, 0xdf, 0xfc, 0x7c, 0x9f, 0xb4, 0x32, 0xfa, 0xcb, 0x13, 0xe0,
+ 0xb1, 0xfc, 0xbb, 0xdf, 0x3b, 0x1b, 0xf6, 0x5c, 0xd0, 0x5f, 0x72, 0x7b,
+ 0xe7, 0x4b, 0x54, 0x47, 0x7a, 0x39, 0x50, 0xbe, 0x52, 0x64, 0xc9, 0xa9,
+ 0xaa, 0xe9, 0x83, 0x4a, 0xc8, 0xd0, 0x22, 0x93, 0x74, 0x49, 0xe9, 0x29,
+ 0x16, 0x3c, 0x22, 0x40, 0x0a, 0x51, 0xd4, 0x49, 0xef, 0xce, 0xc5, 0x3d,
+ 0x43, 0xe9, 0x3c, 0xb8, 0x59, 0xb3, 0xbb, 0xed, 0xbe, 0x8f, 0xb4, 0x35,
+ 0xe2, 0xfd, 0x96, 0x92, 0xe3, 0x89, 0x41, 0xc4, 0xea, 0xb4, 0xf8, 0xfc,
+ 0x96, 0xd4, 0x55, 0xf4, 0x72, 0x86, 0xb1, 0xcc, 0x79, 0x77, 0x05, 0xdb,
+ 0xa5, 0x09, 0x19, 0xc8, 0x97, 0xd7, 0xcd, 0x36, 0x7d, 0x26, 0x9b, 0xd5,
+ 0xb0, 0xd5, 0xa5, 0x28, 0xa9, 0x7e, 0x55, 0x80, 0x07, 0xfc, 0xa1, 0x4d,
+ 0xff, 0xec, 0x97, 0x93, 0x26, 0x33, 0xb6, 0x2e, 0xb1, 0xa5, 0xcd, 0x59,
+ 0xce, 0x1d, 0xcf, 0x99, 0x92, 0x18, 0x5b, 0x78, 0x36, 0xe0, 0xdb, 0x53,
+ 0x54, 0xa2, 0xc1, 0xeb, 0x61, 0x72, 0x0a, 0xc4, 0x78, 0x9d, 0x32, 0x1f,
+ 0x8f, 0xde, 0xb0, 0xba, 0x1b, 0xcc, 0xd6, 0x61, 0x1d, 0x7c, 0x83, 0x33,
+ 0x58, 0x88, 0xd9, 0x42, 0xb7, 0x14, 0x88, 0x27, 0x9d, 0xd1, 0xc9, 0xfa,
+ 0x85, 0xe8, 0x23, 0x7d, 0xf8, 0xc2, 0xed, 0x73, 0xf0, 0xf9, 0xb3, 0xdf,
+ 0x0f, 0x79, 0x5c, 0x76, 0xc3, 0x7a, 0x8d, 0x30, 0x68, 0x4b, 0x14, 0x50,
+ 0x4f, 0xac, 0xdb, 0x43, 0xc0, 0x90, 0xca, 0x8c, 0x9d, 0x2e, 0x44, 0xb0,
+ 0x40, 0xa4, 0x40, 0x88, 0x09, 0x9b, 0xd6, 0xb0, 0xcb, 0xa8, 0x66, 0x24,
+ 0x6d, 0xa3, 0x1e, 0xec, 0xc6, 0x59, 0x66, 0x8d, 0x6b, 0x5e, 0xab, 0xd2,
+ 0xc2, 0xcd, 0xe1, 0x8b, 0x11, 0xba, 0x5d, 0x1b, 0xae, 0xa3, 0x4e, 0x52,
+ 0xbf, 0xd2, 0x5b, 0xf3, 0x17, 0x52, 0xce, 0xc6, 0x95, 0x59, 0xf5, 0xac,
+ 0xe2, 0xab, 0x81, 0x31, 0x42, 0x5e, 0x01, 0xcd, 0x6f, 0x2e, 0xdf, 0x9c,
+ 0x26, 0xca, 0x6b, 0x74, 0xe5, 0x54, 0x45, 0x45, 0x66, 0x62, 0x88, 0xe2,
+ 0x19, 0x61, 0x7d, 0x48, 0x9e, 0xe2, 0x5b, 0x8e, 0xe7, 0x96, 0x12, 0xde,
+ 0x13, 0x9a, 0x9c, 0xd6, 0x91, 0xf5, 0x9e, 0xe0, 0x57, 0x69, 0x1f, 0x99,
+ 0x6d, 0xb2, 0x49, 0x53, 0xb0, 0xd9, 0x4f, 0x36, 0xa9, 0xab, 0xf4, 0x8b,
+ 0x4d, 0xcc, 0x27, 0x7e, 0xec, 0x4d, 0xdf, 0xe6, 0x30, 0x72, 0x0a, 0xe9,
+ 0x99, 0x97, 0x5f, 0xb6, 0x66, 0x09, 0x3f, 0xd7, 0xa6, 0x5e, 0x72, 0xbe,
+ 0x48, 0xa0, 0x73, 0xeb, 0xbb, 0x5e, 0xfb, 0x2f, 0x8f, 0x4a, 0x62, 0x1a,
+ 0xa5, 0x02, 0x9d, 0x0e, 0xe6, 0x3a, 0xb1, 0x3f, 0xcb, 0x91, 0xfb, 0x1a,
+ 0x34, 0xf4, 0xf0, 0x29, 0xbe, 0x54, 0x51, 0x64, 0x21, 0xa0, 0x2c, 0xdd,
+ 0x78, 0x0b, 0xa8, 0xe4, 0x35, 0xab, 0x99, 0xb3, 0xdd, 0x77, 0x57, 0xc2,
+ 0xcb, 0x00, 0x99, 0xb3, 0x37, 0x44, 0x32, 0xa4, 0x63, 0x46, 0xb7, 0x0d,
+ 0x58, 0xe3, 0xbd, 0x87, 0x09, 0xed, 0x59, 0x54, 0xae, 0x9a, 0xf4, 0x3a,
+ 0xcb, 0x31, 0xd9, 0xb5, 0xc8, 0x27, 0xa8, 0x75, 0xff, 0xf2, 0xcb, 0x69,
+ 0x79, 0x4d, 0x92, 0xab, 0x6f, 0x0e, 0x1a, 0xfd, 0x09, 0x40, 0xf2, 0xbe,
+ 0x7c, 0x94, 0x3b, 0x8c, 0xb3, 0xc2, 0x5a, 0xbc, 0xfe, 0x7b, 0x05, 0x44,
+ 0xf5, 0x35, 0xb9, 0x42, 0x27, 0xd2, 0xb6, 0x6d, 0x9a, 0xd7, 0xc3, 0xb4,
+ 0x6f, 0x7f, 0xe1, 0x7f, 0x4b, 0x27, 0x27, 0x95, 0x96, 0xb9, 0x50, 0xaa,
+ 0xd4, 0x91, 0x9d, 0xdd, 0xdb, 0x22, 0x51, 0x70, 0x70, 0x11, 0xc3, 0x39,
+ 0xdf, 0x5b, 0x33, 0xc9, 0xd0, 0xdb, 0xfc, 0x72, 0x93, 0x73, 0x04, 0x36,
+ 0x5f, 0x6c, 0x42, 0x82, 0x91, 0x5c, 0x9a, 0x8f, 0x33, 0xe4, 0x91, 0xc9,
+ 0xe5, 0xb4, 0xc9, 0xb7, 0xe2, 0x80, 0x75, 0x07, 0x61, 0x72, 0x74, 0x07,
+ 0x04, 0xd7, 0xb2, 0x33, 0x23, 0x7d, 0xf0, 0x24, 0xdc, 0x04, 0xae, 0x7c,
+ 0x2b, 0x51, 0x11, 0x8f, 0x1b, 0x06, 0xca, 0xc8, 0xa5, 0x0b, 0xb5, 0x0c,
+ 0xa4, 0x27, 0xc4, 0x03, 0x24, 0x6e, 0xce, 0x65, 0xb1, 0xa0, 0x34, 0xf7,
+ 0x49, 0x03, 0x6f, 0x0b, 0x9f, 0xa5, 0x61, 0xf2, 0xae, 0x98, 0x72, 0x71,
+ 0x75, 0x32, 0x96, 0xf3, 0x6a, 0xb2, 0x9c, 0x93, 0xab, 0x62, 0x42, 0x0e,
+ 0x32, 0x5c, 0x3c, 0xac, 0x1e, 0xb4, 0xc2, 0xf3, 0x7e, 0x87, 0xd9, 0x39,
+ 0xc2, 0x0e, 0x73, 0xf9, 0x2e, 0xa0, 0x28, 0x04, 0xc0, 0x12, 0x87, 0x38,
+ 0xb4, 0x02, 0x4b, 0x7e, 0x22, 0x02, 0x88, 0x22, 0x83, 0xc7, 0xaf, 0x8f,
+ 0x2f, 0x2e, 0x8e, 0x2f, 0x68, 0xbe, 0x0f, 0x3b, 0xd5, 0xb8, 0x94, 0x06,
+ 0xd9, 0x85, 0x1a, 0x15, 0xf6, 0xeb, 0x7b, 0x6a, 0x34, 0x2b, 0x89, 0x44,
+ 0xa1, 0x14, 0xa3, 0x82, 0x05, 0xc1, 0x74, 0x3f, 0x5c, 0xee, 0xc0, 0x77,
+ 0x2f, 0x02, 0xf6, 0x6d, 0xc3, 0x06, 0x80, 0x41, 0xc1, 0x01, 0xd9, 0xd2,
+ 0x2d, 0x5c, 0x0b, 0x95, 0x10, 0xe0, 0x2f, 0x35, 0xbb, 0xfe, 0x26, 0x6b,
+ 0xa9, 0xa9, 0x43, 0x41, 0xea, 0x66, 0x12, 0x4c, 0x9f, 0x59, 0xff, 0x04,
+ 0x86, 0x7c, 0x45, 0x67, 0x94, 0x6c, 0x27, 0x4c, 0x46, 0xdd, 0x2c, 0x17,
+ 0xf9, 0xd4, 0x7a, 0x7b, 0xcd, 0xcf, 0x8d, 0xfa, 0x97, 0xf0, 0x29, 0xaf,
+ 0x15, 0xeb, 0x82, 0xa8, 0xa6, 0x3a, 0x23, 0x7c, 0x6f, 0x5b, 0xa7, 0x56,
+ 0x75, 0x82, 0xc4, 0x37, 0x06, 0x8d, 0x29, 0xb1, 0x79, 0x3b, 0x4d, 0x5c,
+ 0xf6, 0x7e, 0x06, 0x2f, 0x23, 0x49, 0x0b, 0x85, 0xdf, 0xf8, 0x92, 0x81,
+ 0x7c, 0x59, 0x73, 0x87, 0x77, 0x77, 0xb5, 0x6d, 0x2f, 0x90, 0x1d, 0x5a,
+ 0x1d, 0x24, 0x3f, 0xd6, 0xf9, 0xe4, 0x67, 0x77, 0x79, 0x20, 0xfd, 0xa7,
+ 0xcd, 0x47, 0x85, 0xa9, 0x93, 0x89, 0x12, 0x63, 0x98, 0xb3, 0xb2, 0xdf,
+ 0x8d, 0x8e, 0x2f, 0x92, 0xc3, 0xaf, 0x89, 0xd1, 0xfb, 0x9f, 0x5c, 0x60,
+ 0x7a, 0x4e, 0x6e, 0x87, 0x0d, 0xe1, 0x57, 0x14, 0x8a, 0x92, 0x6c, 0xea,
+ 0x57, 0xa2, 0x1d, 0xb6, 0x56, 0x36, 0xd7, 0xfa, 0x05, 0xee, 0xba, 0x6f,
+ 0xaf, 0x21, 0xb9, 0x0b, 0x1f, 0x58, 0xc5, 0xc7, 0xac, 0x21, 0x1d, 0x32,
+ 0x7f, 0x15, 0x99, 0xdc, 0x88, 0x43, 0x12, 0xba, 0x36, 0xd2, 0xfb, 0x3a,
+ 0x30, 0x3b, 0x79, 0x95, 0x0e, 0x93, 0xcd, 0x37, 0xe5, 0x3f, 0x8c, 0x32,
+ 0x90, 0xee, 0x3c, 0x19, 0xee, 0x26, 0x5b, 0xdf, 0xe7, 0xc5, 0x67, 0xcf,
+ 0x3e, 0x4f, 0x4e, 0xb6, 0x37, 0x5b, 0x60, 0x7e, 0x2e, 0x29, 0x32, 0x4e,
+ 0x8b, 0x0f, 0x76, 0xc9, 0xce, 0x70, 0xb2, 0x19, 0x54, 0x27, 0xce, 0x87,
+ 0x9a, 0xe9, 0xfc, 0x57, 0xb6, 0x88, 0x1c, 0x4e, 0xc9, 0x0b, 0x48, 0xbe,
+ 0xb3, 0xe5, 0xdd, 0xc9, 0xca, 0x37, 0x4f, 0x4d, 0x69, 0xea, 0x3e, 0x7b,
+ 0x16, 0x34, 0xf1, 0xd4, 0xb6, 0xf1, 0x8e, 0xdb, 0xf8, 0x85, 0x4d, 0xec,
+ 0x0f, 0x77, 0xf7, 0x93, 0xad, 0xb3, 0xd1, 0xce, 0xbe, 0x6d, 0x21, 0x6c,
+ 0x62, 0x1f, 0x4d, 0xd0, 0x43, 0xed, 0x97, 0x9f, 0xd2, 0xf7, 0x7f, 0xcc,
+ 0x8a, 0x9f, 0x93, 0xad, 0x1f, 0xf6, 0xf6, 0x4c, 0x03, 0x9f, 0x27, 0x87,
+ 0x27, 0x3f, 0x24, 0x4f, 0x87, 0xa6, 0xb1, 0xb7, 0xe9, 0xad, 0x34, 0x27,
+ 0xac, 0xc4, 0x23, 0x34, 0x62, 0x7e, 0x1f, 0xb4, 0xf1, 0xac, 0xd3, 0xc6,
+ 0xa9, 0xb1, 0x0b, 0x3f, 0x9a, 0x6b, 0x65, 0x77, 0xf8, 0x64, 0x3f, 0xc9,
+ 0x9f, 0x7d, 0xfa, 0x5c, 0x1b, 0x92, 0x36, 0xf0, 0xfb, 0xb6, 0xb7, 0x92,
+ 0x99, 0x4f, 0x8c, 0xaa, 0x73, 0xfc, 0xd1, 0x08, 0x34, 0x88, 0x88, 0x8a,
+ 0x3c, 0x85, 0x37, 0x69, 0x35, 0x95, 0xed, 0x46, 0xc5, 0x46, 0xcc, 0x4a,
+ 0x09, 0x25, 0x7c, 0x06, 0xb7, 0xa5, 0xb9, 0x38, 0x0f, 0x82, 0xee, 0x90,
+ 0x6d, 0xaa, 0x8f, 0x7e, 0x9e, 0xbc, 0x19, 0x9d, 0x1c, 0x9b, 0x11, 0xed,
+ 0x9a, 0xae, 0xb9, 0x39, 0xe4, 0x0e, 0xe1, 0x57, 0x98, 0xdc, 0xcf, 0xc0,
+ 0x36, 0x2b, 0x6d, 0xa8, 0xce, 0xcd, 0x40, 0x56, 0xb3, 0xe9, 0xcc, 0xc5,
+ 0x5d, 0xe3, 0xbb, 0x04, 0x49, 0x19, 0x1c, 0x5e, 0x93, 0x09, 0xc1, 0x57,
+ 0x2d, 0x3e, 0xfd, 0x6d, 0x59, 0x98, 0x63, 0x52, 0x95, 0x15, 0x21, 0xa7,
+ 0x36, 0x5b, 0xda, 0xc2, 0xb7, 0xaf, 0x8e, 0x39, 0x3b, 0xfe, 0x4d, 0x5a,
+ 0x18, 0x19, 0x49, 0x24, 0x57, 0xf5, 0x07, 0x8a, 0xff, 0x73, 0x38, 0x87,
+ 0xdf, 0x3f, 0xbd, 0x2f, 0x3e, 0x9a, 0x75, 0xfc, 0x64, 0xb8, 0x47, 0x90,
+ 0x6d, 0xb2, 0x7a, 0x5f, 0xbf, 0x31, 0xff, 0xde, 0x7b, 0xba, 0x99, 0xd0,
+ 0xaf, 0xda, 0x16, 0xbc, 0x9e, 0xd7, 0x8d, 0xa3, 0xb3, 0xb3, 0x6f, 0x4f,
+ 0x18, 0x00, 0x72, 0x24, 0x6e, 0x55, 0x52, 0xae, 0xac, 0x55, 0xcc, 0xd2,
+ 0xd5, 0x58, 0x6f, 0x2e, 0x5b, 0x09, 0xc1, 0xb8, 0x0f, 0x59, 0xb6, 0x20,
+ 0x34, 0x42, 0xd3, 0x91, 0x08, 0x8d, 0xc8, 0x68, 0x8b, 0x6d, 0x22, 0xf5,
+ 0xa7, 0xc3, 0xc5, 0xd9, 0xd4, 0xd6, 0x85, 0x3b, 0xbe, 0xb7, 0x0c, 0x1c,
+ 0xa9, 0xab, 0x3c, 0x8b, 0x2e, 0xda, 0x6c, 0x05, 0x75, 0x41, 0x63, 0x85,
+ 0xa9, 0xaa, 0x8d, 0xd8, 0xbe, 0x9b, 0x23, 0xa3, 0xdd, 0x73, 0xa7, 0x0f,
+ 0xc4, 0x6b, 0xbb, 0xe9, 0x71, 0xc4, 0x43, 0xa3, 0x45, 0xba, 0x0e, 0x43,
+ 0xd4, 0xc8, 0x40, 0x10, 0xe0, 0xbc, 0xc8, 0x66, 0x14, 0x06, 0xcf, 0x00,
+ 0xcf, 0x7b, 0x7b, 0xf8, 0xe6, 0xf8, 0xe5, 0x77, 0x87, 0xa7, 0xef, 0x8e,
+ 0xcd, 0x2b, 0xb9, 0xf9, 0xd8, 0x96, 0x83, 0xf0, 0xa1, 0x8f, 0xf3, 0x7c,
+ 0x52, 0xce, 0x28, 0xca, 0xb4, 0xf9, 0xf9, 0xe6, 0x06, 0xc3, 0xcb, 0x93,
+ 0x1e, 0xbd, 0xb5, 0xc7, 0xaf, 0x99, 0x7d, 0x41, 0xff, 0xda, 0xe7, 0x7f,
+ 0xed, 0x7f, 0xde, 0xdb, 0x6e, 0x0d, 0x3a, 0xb0, 0x92, 0xaf, 0x50, 0x7c,
+ 0x12, 0x35, 0x03, 0x51, 0x66, 0x19, 0xb9, 0x1b, 0x3c, 0x2b, 0x3d, 0x8d,
+ 0xd1, 0xe8, 0xdd, 0x46, 0xcf, 0x6e, 0x8d, 0xef, 0x7d, 0x1b, 0xbc, 0x47,
+ 0x2f, 0xbd, 0x84, 0x82, 0xd1, 0xdb, 0xee, 0x5b, 0x95, 0x03, 0xa1, 0x72,
+ 0x6a, 0x43, 0x9b, 0x60, 0x56, 0xc8, 0x64, 0xab, 0xc7, 0x7f, 0x79, 0xf9,
+ 0xea, 0xf0, 0xf2, 0x98, 0x5e, 0xd0, 0xcf, 0x0b, 0x1a, 0xd1, 0xa6, 0x51,
+ 0x50, 0x7f, 0xb6, 0x24, 0x34, 0xfd, 0x92, 0x06, 0xd4, 0xdb, 0xe6, 0x58,
+ 0x06, 0x82, 0xea, 0x9d, 0x7e, 0x95, 0x85, 0x02, 0xb7, 0x5d, 0xc6, 0x79,
+ 0xad, 0x88, 0x95, 0xad, 0x1e, 0xff, 0xae, 0x67, 0x3d, 0xb8, 0x52, 0xed,
+ 0x44, 0xc2, 0x95, 0x53, 0x24, 0x59, 0x04, 0x99, 0xb5, 0x0c, 0x49, 0x73,
+ 0xeb, 0x23, 0xc1, 0x0a, 0xf6, 0x38, 0x79, 0xac, 0xf9, 0x76, 0xe1, 0x25,
+ 0xa5, 0x9d, 0x7c, 0x4c, 0x65, 0xb9, 0xb7, 0xff, 0xe4, 0x73, 0xcc, 0xe7,
+ 0xcb, 0xde, 0x8e, 0xb9, 0x1b, 0x7a, 0x9f, 0xd3, 0xa7, 0xf3, 0xc6, 0xab,
+ 0xfd, 0x26, 0x9f, 0x21, 0x7b, 0x4a, 0x76, 0x14, 0xc3, 0x65, 0x68, 0xd5,
+ 0x3d, 0xa6, 0x1e, 0x4c, 0xe8, 0x1d, 0x67, 0x89, 0x29, 0xaf, 0x8d, 0x82,
+ 0x07, 0xb0, 0x5e, 0x28, 0x5a, 0x85, 0x72, 0x1c, 0xec, 0xd4, 0xc5, 0xe7,
+ 0xfc, 0xfb, 0xa3, 0xcf, 0xef, 0xf2, 0x18, 0x85, 0x0b, 0x88, 0xbe, 0x39,
+ 0xbf, 0xd7, 0x44, 0x32, 0x7c, 0x0b, 0x3a, 0x39, 0xaf, 0x59, 0xa0, 0x19,
+ 0x8f, 0xc5, 0xb7, 0xa3, 0xc6, 0x08, 0x74, 0x02, 0x23, 0x5a, 0xee, 0xa1,
+ 0x28, 0x01, 0x6d, 0xe0, 0x83, 0x2c, 0xf4, 0xce, 0x4e, 0xc7, 0xb9, 0xd1,
+ 0x84, 0x6d, 0x6a, 0x8c, 0x67, 0x95, 0xdb, 0xa9, 0xd7, 0xe3, 0x97, 0x7b,
+ 0x24, 0x4b, 0x1b, 0x96, 0x9b, 0xb4, 0xb6, 0x3e, 0x24, 0x44, 0x1b, 0xe5,
+ 0xd9, 0xf6, 0x3a, 0x75, 0xf2, 0xd1, 0x30, 0x0c, 0x36, 0xe9, 0xd9, 0x3e,
+ 0x36, 0xa2, 0xa6, 0xc8, 0xaa, 0xb5, 0x00, 0x8b, 0x48, 0x30, 0x0a, 0x43,
+ 0xf4, 0x39, 0xe8, 0xcd, 0x3b, 0xc3, 0xe1, 0xd0, 0x9a, 0x3b, 0x08, 0xa4,
+ 0x49, 0x0c, 0x8a, 0xe8, 0xeb, 0x7c, 0x5e, 0x60, 0xcc, 0xf1, 0x16, 0x94,
+ 0x79, 0x28, 0xd4, 0xdb, 0x02, 0xbc, 0x11, 0x3f, 0x81, 0x3d, 0x1a, 0x9e,
+ 0x8f, 0x63, 0x53, 0x3e, 0xbb, 0xa9, 0xfc, 0x0b, 0x1f, 0x62, 0x8b, 0xb0,
+ 0xa6, 0x6f, 0xec, 0x7b, 0x94, 0x22, 0x38, 0x56, 0x4e, 0xd9, 0xc2, 0xf2,
+ 0xb0, 0xe7, 0x09, 0x40, 0xce, 0xc5, 0xda, 0xee, 0x6d, 0xf1, 0x1b, 0xed,
+ 0x4a, 0x9f, 0xb1, 0x07, 0x24, 0xe4, 0xca, 0x3b, 0xf0, 0x19, 0x80, 0x35,
+ 0x81, 0xb0, 0x27, 0x05, 0xbb, 0x07, 0xf4, 0x06, 0x59, 0x58, 0xb5, 0x59,
+ 0xda, 0x11, 0x8e, 0x68, 0xb2, 0x99, 0xa1, 0xfb, 0x4b, 0x96, 0xa3, 0x30,
+ 0xcb, 0xd4, 0x9a, 0xc4, 0x63, 0xd4, 0xb6, 0x12, 0x74, 0xa4, 0x3a, 0x78,
+ 0xe7, 0xae, 0x22, 0xb4, 0xd9, 0x80, 0xb9, 0x59, 0x34, 0x11, 0x51, 0xa5,
+ 0x87, 0xf0, 0x73, 0xac, 0x8b, 0x97, 0x4f, 0xb4, 0x45, 0x1b, 0x2c, 0xef,
+ 0xcc, 0x8d, 0xbb, 0x95, 0xdb, 0xa2, 0xcb, 0xcc, 0x28, 0x7b, 0x97, 0x6d,
+ 0xbd, 0x06, 0x91, 0x7b, 0x49, 0x7a, 0x67, 0xae, 0x9e, 0x22, 0x23, 0x7c,
+ 0x26, 0x90, 0x0e, 0xf0, 0xca, 0x9c, 0x7a, 0x7e, 0x46, 0x3b, 0x42, 0xad,
+ 0x91, 0x94, 0xba, 0x22, 0x49, 0xc9, 0x16, 0x1b, 0x1a, 0x4c, 0x8f, 0xac,
+ 0x0e, 0x3d, 0x52, 0xc0, 0xcb, 0x39, 0xb1, 0x94, 0x8a, 0xa6, 0xae, 0xe6,
+ 0x39, 0xf5, 0xdc, 0x88, 0xe8, 0x91, 0xec, 0x9b, 0x1c, 0xb8, 0x44, 0xf2,
+ 0x73, 0x30, 0xae, 0x42, 0x67, 0x2b, 0x2d, 0xa6, 0xde, 0x47, 0x6c, 0x7c,
+ 0x5a, 0xdc, 0x4f, 0x04, 0xef, 0x2d, 0x06, 0xe0, 0xac, 0xd0, 0x90, 0xb0,
+ 0x98, 0x57, 0xd7, 0xd7, 0x6c, 0xb5, 0x25, 0xdd, 0xa1, 0xc5, 0x37, 0xd9,
+ 0x29, 0xcd, 0x0a, 0xa1, 0xa0, 0xef, 0x57, 0xcd, 0xe6, 0xa5, 0xad, 0xa4,
+ 0x27, 0x5e, 0x97, 0xd6, 0x66, 0xd6, 0x98, 0x24, 0xaf, 0x5b, 0x63, 0x93,
+ 0xae, 0x90, 0xa0, 0xd1, 0x8e, 0x21, 0x9f, 0x5d, 0x6c, 0xa0, 0x00, 0x4a,
+ 0xe1, 0x08, 0x19, 0x74, 0xd1, 0x41, 0xb4, 0xe7, 0x10, 0x28, 0x0e, 0x89,
+ 0x7a, 0x67, 0xa1, 0x56, 0xd8, 0xae, 0xc9, 0x38, 0x75, 0x26, 0xd7, 0x46,
+ 0xd2, 0xf2, 0xf6, 0x52, 0x55, 0xa6, 0x93, 0x42, 0xe4, 0x50, 0x79, 0x9b,
+ 0x39, 0x9e, 0x47, 0xe7, 0x70, 0x74, 0xe4, 0xbf, 0x72, 0xfa, 0xad, 0x30,
+ 0xe9, 0x04, 0x78, 0xad, 0xbc, 0xc2, 0x20, 0x3b, 0xb3, 0x32, 0x4c, 0xbc,
+ 0x26, 0xd9, 0x55, 0x52, 0xb6, 0x38, 0x94, 0xd1, 0x37, 0x89, 0x5b, 0x6b,
+ 0x8b, 0xbc, 0x47, 0x98, 0xad, 0xc5, 0x33, 0x4d, 0xb8, 0x78, 0x90, 0x56,
+ 0x40, 0xb0, 0x18, 0x3d, 0x17, 0xff, 0xd5, 0x51, 0xf6, 0xec, 0x22, 0xf5,
+ 0xb4, 0xd6, 0x04, 0x36, 0x01, 0xf6, 0x00, 0x29, 0x74, 0x36, 0x84, 0x7f,
+ 0x29, 0xeb, 0x84, 0x9d, 0x0c, 0x0f, 0x5a, 0x47, 0x90, 0x06, 0x67, 0xce,
+ 0x42, 0x34, 0x90, 0x87, 0x62, 0x24, 0x2f, 0x70, 0x05, 0x83, 0xf1, 0x06,
+ 0xe7, 0x1b, 0x0d, 0x26, 0x2a, 0xd1, 0xd7, 0x13, 0x16, 0x8c, 0x5b, 0x07,
+ 0xf3, 0xa1, 0x73, 0x7a, 0x7e, 0x71, 0xf6, 0xf5, 0xc5, 0xf1, 0x68, 0x94,
+ 0xbc, 0x39, 0xbe, 0x64, 0x5b, 0xff, 0x92, 0xa1, 0x77, 0xd7, 0xa8, 0x1d,
+ 0x8d, 0x58, 0x83, 0x92, 0x31, 0x29, 0xe4, 0x44, 0x1d, 0x09, 0xc8, 0x79,
+ 0xa2, 0x92, 0xc8, 0xb8, 0x1d, 0xd9, 0x88, 0x9f, 0x09, 0x62, 0xef, 0x06,
+ 0xde, 0x7e, 0x60, 0x9a, 0x10, 0x90, 0xb4, 0xce, 0x73, 0xe7, 0x46, 0x85,
+ 0x62, 0xcc, 0x28, 0x27, 0x9b, 0x73, 0xe8, 0x5c, 0xe8, 0x74, 0x65, 0x9b,
+ 0x3f, 0x31, 0xbc, 0x3f, 0x99, 0xd9, 0x94, 0x32, 0x70, 0x7f, 0x32, 0xc6,
+ 0xaf, 0x6c, 0x8a, 0x3f, 0x25, 0x3f, 0x98, 0x36, 0xa7, 0xc6, 0x78, 0x95,
+ 0x92, 0xb7, 0x23, 0x94, 0xba, 0x75, 0x5c, 0xcb, 0xb9, 0x57, 0xcc, 0x39,
+ 0xe1, 0x14, 0xc3, 0xea, 0x81, 0x3a, 0x93, 0xe0, 0x8a, 0xe1, 0x72, 0xba,
+ 0x82, 0xa9, 0xb3, 0x5f, 0x96, 0x5a, 0x63, 0x49, 0x72, 0x9a, 0x5d, 0xa1,
+ 0x0e, 0x0b, 0x3e, 0x67, 0x9a, 0xdb, 0x25, 0x52, 0xea, 0xbd, 0x37, 0xf4,
+ 0xa3, 0xdd, 0xe4, 0xc9, 0xa7, 0xcf, 0x77, 0x3f, 0xe5, 0xbf, 0xea, 0x7f,
+ 0x3f, 0x7b, 0xba, 0x2b, 0xec, 0xf8, 0xe6, 0x5f, 0x4f, 0x0f, 0x9e, 0xee,
+ 0x1d, 0x10, 0x4f, 0xe3, 0xee, 0xc1, 0xae, 0xf9, 0xbf, 0xa7, 0xf2, 0x13,
+ 0x22, 0xa3, 0xfc, 0x6c, 0xff, 0xd3, 0x4f, 0x80, 0x86, 0xa1, 0xfd, 0x31,
+ 0x33, 0x1f, 0x19, 0x34, 0xe5, 0x00, 0x74, 0x51, 0xd0, 0x7c, 0xfe, 0xd4,
+ 0xf6, 0x44, 0x52, 0x78, 0x9d, 0xca, 0x60, 0xd3, 0xc0, 0x6d, 0x0d, 0x50,
+ 0xf5, 0xaa, 0x32, 0x85, 0x8d, 0x5f, 0xb9, 0xd0, 0x0e, 0x43, 0xde, 0xe6,
+ 0x4a, 0x7a, 0xe0, 0x5f, 0x6b, 0xbd, 0xc3, 0x40, 0x73, 0x8f, 0xea, 0xed,
+ 0x97, 0x7e, 0x5a, 0x13, 0xc9, 0x37, 0x40, 0xe0, 0x26, 0x4b, 0x25, 0xef,
+ 0x4d, 0xb4, 0x5c, 0x9b, 0x5f, 0x58, 0xba, 0x53, 0x8d, 0xf9, 0x97, 0x7e,
+ 0x8f, 0x3d, 0x57, 0xf4, 0x96, 0xec, 0x86, 0x24, 0xfc, 0x9a, 0xcd, 0x45,
+ 0x88, 0x7c, 0xab, 0xb5, 0x79, 0x36, 0xdc, 0xf2, 0xbb, 0x99, 0xf2, 0x6a,
+ 0x3d, 0xdb, 0x1c, 0x2e, 0xae, 0xaa, 0x1c, 0x19, 0x72, 0xd0, 0xdc, 0xbb,
+ 0x85, 0xdf, 0xde, 0x63, 0x9a, 0x73, 0x23, 0xc2, 0x0e, 0xb6, 0x2b, 0x37,
+ 0xf0, 0x16, 0x27, 0x67, 0x60, 0x9b, 0xad, 0x9c, 0xa9, 0x04, 0xa1, 0xb6,
+ 0xa6, 0x31, 0x5e, 0xb5, 0x5b, 0x76, 0xc0, 0x6f, 0x88, 0xce, 0x69, 0xf3,
+ 0xe2, 0x50, 0xaf, 0x14, 0x57, 0x3c, 0x3f, 0xaf, 0x3b, 0x3b, 0xf8, 0x14,
+ 0xed, 0x46, 0xef, 0x7b, 0xf2, 0x0d, 0x9c, 0x27, 0x7b, 0xe8, 0xd6, 0x0e,
+ 0xcd, 0x61, 0xeb, 0xb5, 0x68, 0x23, 0xe3, 0xb8, 0xa0, 0x7c, 0xc7, 0x8e,
+ 0xa4, 0x7b, 0x0e, 0xf0, 0x75, 0xdb, 0x9c, 0x7f, 0xfb, 0xcc, 0xc0, 0x03,
+ 0xce, 0xe5, 0x4e, 0x88, 0x75, 0x94, 0x6a, 0x39, 0x6c, 0xab, 0x08, 0x1b,
+ 0xfc, 0xd1, 0xc2, 0xb6, 0x70, 0x99, 0x31, 0xac, 0x8d, 0x9a, 0xa2, 0xf9,
+ 0x9c, 0xf9, 0xb9, 0xb4, 0x56, 0xda, 0x8d, 0xd3, 0xaa, 0x55, 0x33, 0x61,
+ 0x83, 0x6b, 0x84, 0x98, 0xeb, 0xd5, 0x5c, 0x17, 0x48, 0x77, 0x64, 0x3d,
+ 0xe2, 0x0f, 0x1b, 0x1b, 0xa3, 0xf3, 0xe3, 0xe3, 0x57, 0xc9, 0xe9, 0xc9,
+ 0x9b, 0x93, 0x4b, 0x4f, 0x0b, 0xb7, 0xb7, 0x87, 0x7a, 0x5a, 0xb5, 0x7a,
+ 0x5c, 0x67, 0x3a, 0x1c, 0xf5, 0x32, 0x7f, 0x4f, 0xef, 0xef, 0x79, 0x26,
+ 0x59, 0x14, 0xb3, 0xee, 0x7b, 0xb0, 0xb7, 0xc1, 0xec, 0x44, 0x35, 0xb8,
+ 0x3d, 0x2d, 0xae, 0x36, 0x1a, 0x8d, 0xe9, 0xdd, 0x80, 0xd9, 0x05, 0x06,
+ 0x7f, 0x15, 0x9c, 0x46, 0x5b, 0x5d, 0x12, 0x16, 0x59, 0x9b, 0xd2, 0x23,
+ 0xd8, 0xd6, 0x4e, 0xaf, 0x68, 0x6e, 0x33, 0x86, 0x56, 0x7b, 0x6e, 0x39,
+ 0xc0, 0xf6, 0xee, 0x32, 0xb0, 0x1d, 0xcc, 0x73, 0xce, 0xb5, 0xf4, 0x31,
+ 0xc5, 0x28, 0x65, 0x22, 0x37, 0x1e, 0xe4, 0xb8, 0xff, 0x45, 0xef, 0x74,
+ 0x58, 0x40, 0xad, 0x7e, 0xab, 0xe6, 0x7a, 0x7c, 0x66, 0x02, 0x8a, 0xe4,
+ 0xc9, 0xae, 0x4d, 0x57, 0x58, 0x40, 0xe6, 0x88, 0x7e, 0x4f, 0x1f, 0xdb,
+ 0x4b, 0x8c, 0x12, 0xb2, 0x24, 0x55, 0xbe, 0x5a, 0x16, 0xc1, 0x75, 0xf7,
+ 0x57, 0x7e, 0xd7, 0x8c, 0xff, 0xf9, 0x2e, 0xae, 0xb7, 0xab, 0xb4, 0x1a,
+ 0x18, 0x75, 0xeb, 0x7e, 0xa0, 0x2e, 0x55, 0xde, 0x11, 0x82, 0x37, 0x66,
+ 0x7f, 0x4f, 0xe6, 0xea, 0x5c, 0x76, 0x54, 0x44, 0x97, 0x73, 0x52, 0x22,
+ 0x2e, 0x39, 0x93, 0x03, 0x40, 0x43, 0xa7, 0x4c, 0x5f, 0xf5, 0x70, 0x3a,
+ 0x05, 0xc7, 0x31, 0x0c, 0xeb, 0x2a, 0x3a, 0x19, 0x45, 0x19, 0x08, 0x10,
+ 0xab, 0xd4, 0x6a, 0x4e, 0xc3, 0x94, 0xb1, 0x84, 0xfa, 0xf4, 0x3c, 0xd9,
+ 0xfb, 0x94, 0xc6, 0xf1, 0xb8, 0xf1, 0xbc, 0x2e, 0xab, 0x89, 0xcd, 0x29,
+ 0x86, 0x8d, 0xe0, 0x25, 0x98, 0x72, 0x5a, 0x04, 0x6a, 0xae, 0xf1, 0xec,
+ 0x2a, 0x28, 0x16, 0xa0, 0x3d, 0x32, 0x4a, 0x24, 0x9e, 0x0e, 0x77, 0x14,
+ 0x02, 0xdc, 0xac, 0x16, 0xd1, 0x5d, 0x23, 0xf3, 0xe2, 0x55, 0x28, 0xad,
+ 0x6c, 0x02, 0x2a, 0x4f, 0x03, 0xb9, 0x44, 0xcc, 0x5e, 0xbb, 0xcb, 0xa7,
+ 0x50, 0xa5, 0x1d, 0xd7, 0x9c, 0x59, 0x2f, 0xde, 0x7c, 0x8c, 0x95, 0x46,
+ 0xcc, 0x12, 0xc1, 0x4e, 0xdb, 0x33, 0x51, 0x60, 0x68, 0x5a, 0x4b, 0x78,
+ 0x14, 0xb6, 0xa0, 0x3f, 0x50, 0x7e, 0xb3, 0x8b, 0x0b, 0x90, 0xfd, 0x44,
+ 0xa2, 0xb9, 0xe7, 0xbe, 0x42, 0xb9, 0x02, 0x4d, 0x33, 0x53, 0x67, 0xc2,
+ 0x1b, 0xbb, 0xb1, 0xdb, 0x63, 0x26, 0xa6, 0x16, 0x6f, 0xd8, 0x7b, 0xbb,
+ 0x46, 0x69, 0x9d, 0x95, 0xe3, 0x4e, 0xc9, 0xfa, 0xd0, 0x12, 0xc5, 0xb0,
+ 0x06, 0x98, 0x9d, 0xbd, 0xdd, 0x6f, 0x57, 0xcf, 0x3a, 0x38, 0xf4, 0xd7,
+ 0xbe, 0xbc, 0xff, 0x74, 0xcd, 0xa2, 0x9d, 0x55, 0x30, 0xc6, 0x33, 0xc5,
+ 0x40, 0x42, 0x11, 0x74, 0x91, 0x97, 0x60, 0xd9, 0xcc, 0xc6, 0xcf, 0xae,
+ 0x53, 0x54, 0xfe, 0x5d, 0xd3, 0x7b, 0xcd, 0x09, 0xe9, 0x74, 0xe5, 0x8d,
+ 0xa0, 0xb2, 0xf9, 0x97, 0x35, 0xb9, 0xc5, 0x16, 0x60, 0xda, 0x73, 0xb6,
+ 0xab, 0x4d, 0x27, 0x67, 0x6e, 0x06, 0xef, 0x6d, 0x96, 0x9c, 0xfd, 0xb6,
+ 0x90, 0xd0, 0xdd, 0x53, 0x65, 0xd7, 0x4b, 0x66, 0xc2, 0x28, 0xd9, 0xd6,
+ 0x27, 0x62, 0x6a, 0x39, 0xaf, 0x46, 0x36, 0x13, 0x7c, 0x88, 0xf7, 0x13,
+ 0x04, 0xef, 0x24, 0x55, 0x95, 0x55, 0x8a, 0xf7, 0x76, 0x2e, 0x06, 0x72,
+ 0xca, 0x4e, 0xca, 0xb9, 0x54, 0xff, 0xe4, 0xe3, 0x55, 0x78, 0x89, 0xfd,
+ 0xcc, 0xbc, 0x38, 0x44, 0xa6, 0x2f, 0x6f, 0x14, 0x2b, 0xec, 0x29, 0xad,
+ 0x8c, 0xa2, 0x61, 0x0d, 0x87, 0x05, 0xd0, 0x40, 0x5f, 0x76, 0x2d, 0x5a,
+ 0xb2, 0x9f, 0x22, 0x89, 0x5f, 0x2b, 0x03, 0x26, 0x33, 0xe5, 0x93, 0xb3,
+ 0xff, 0xe8, 0xec, 0xed, 0xeb, 0x93, 0xaf, 0x2d, 0x95, 0x11, 0x0b, 0xf1,
+ 0x16, 0xc5, 0x06, 0xbb, 0x8f, 0xfd, 0x48, 0xb7, 0x14, 0x55, 0x15, 0xf4,
+ 0xad, 0x11, 0x4f, 0xef, 0xfd, 0x1f, 0x40, 0x80, 0x14, 0x4f, 0xc8, 0x41,
+ 0xce, 0xfc, 0x1f, 0xf5, 0xb6, 0x73, 0x37, 0x74, 0xa8, 0xea, 0x38, 0x4b,
+ 0x23, 0xad, 0x9a, 0xe5, 0xc2, 0x82, 0x08, 0xbd, 0xa2, 0xac, 0xc2, 0xa3,
+ 0xad, 0xa9, 0xe8, 0xcb, 0x05, 0x8b, 0x26, 0x49, 0x28, 0x6d, 0x79, 0x73,
+ 0xf9, 0x0e, 0x20, 0x77, 0x82, 0x70, 0xa9, 0xc8, 0x05, 0x10, 0xe0, 0x72,
+ 0x66, 0xc4, 0xbe, 0xe9, 0xe3, 0xe5, 0x35, 0x7e, 0x33, 0x4d, 0xeb, 0x1b,
+ 0x1e, 0x28, 0x2e, 0x8d, 0x9c, 0x61, 0xda, 0x88, 0xb5, 0xa5, 0x53, 0x32,
+ 0xd4, 0x1d, 0x18, 0xc7, 0xa2, 0x7f, 0x5d, 0x7c, 0xa8, 0x4e, 0x34, 0xeb,
+ 0xc1, 0xe2, 0x93, 0x34, 0x8d, 0x35, 0x45, 0xa8, 0x12, 0xb1, 0x4e, 0xfc,
+ 0xe4, 0x25, 0x85, 0x65, 0x0e, 0x88, 0x4f, 0x7e, 0xce, 0x84, 0x72, 0x7e,
+ 0xfa, 0xa9, 0x48, 0x49, 0xc7, 0xfa, 0x7e, 0x72, 0xe5, 0x65, 0xb4, 0x31,
+ 0x4e, 0x50, 0x37, 0x1d, 0xfb, 0x88, 0xc9, 0xc1, 0xb2, 0xf9, 0xc7, 0xcd,
+ 0x41, 0x7d, 0x3f, 0x1f, 0x97, 0x33, 0x4d, 0xbc, 0xb0, 0x04, 0x12, 0xfa,
+ 0x90, 0x5f, 0x30, 0x2f, 0xe1, 0x48, 0x6d, 0xe3, 0xb9, 0x25, 0x1d, 0x56,
+ 0xca, 0xf5, 0x9f, 0x8b, 0x19, 0x21, 0x3c, 0xa4, 0xa3, 0x00, 0xb7, 0x0f,
+ 0xc9, 0xf8, 0xac, 0x98, 0xcc, 0x4a, 0xd9, 0xd5, 0x94, 0x60, 0x8e, 0x99,
+ 0x6a, 0x0f, 0x9d, 0x22, 0x7e, 0xe5, 0x92, 0x3c, 0x1c, 0xa8, 0x1f, 0x62,
+ 0xd4, 0x9d, 0x9e, 0x30, 0x6a, 0x60, 0x80, 0xf4, 0x36, 0xff, 0x42, 0x50,
+ 0xf9, 0x1e, 0xbf, 0x0d, 0x17, 0x1c, 0x31, 0x5d, 0xfd, 0x89, 0x1d, 0x8a,
+ 0x1c, 0xf7, 0xfb, 0xab, 0x7e, 0x5c, 0x1f, 0xed, 0x4c, 0xbd, 0xd9, 0x4f,
+ 0x69, 0x75, 0x2d, 0x2c, 0x7d, 0x12, 0x49, 0x83, 0x91, 0x68, 0xcb, 0xda,
+ 0x58, 0xc7, 0x24, 0x29, 0x25, 0x16, 0x35, 0x03, 0xf5, 0x69, 0xc9, 0x39,
+ 0x85, 0x92, 0x71, 0xc5, 0x2e, 0x49, 0xbb, 0x11, 0x3d, 0x89, 0xf3, 0x47,
+ 0x8b, 0x45, 0x49, 0xdd, 0x5d, 0xa6, 0xd5, 0x29, 0x9c, 0x7f, 0x56, 0x2e,
+ 0x33, 0xef, 0x35, 0x72, 0xe2, 0xc1, 0x12, 0xce, 0xc4, 0x71, 0xc2, 0x9f,
+ 0xd2, 0x4a, 0xf7, 0x5a, 0x3f, 0xd2, 0x35, 0xc1, 0xbf, 0x7f, 0x29, 0x75,
+ 0xca, 0xcc, 0x79, 0x16, 0xa6, 0x14, 0xa1, 0x0f, 0xfc, 0x74, 0x57, 0xdc,
+ 0x6f, 0x8d, 0xc0, 0x55, 0xeb, 0xe4, 0xf0, 0xe2, 0xd8, 0x68, 0xb6, 0xd7,
+ 0x05, 0x38, 0x2a, 0x8a, 0x46, 0x93, 0xea, 0xb2, 0x42, 0x0a, 0xa3, 0x15,
+ 0x7a, 0x3e, 0xe8, 0x83, 0x77, 0xde, 0x9b, 0xb4, 0x99, 0x04, 0x18, 0xc0,
+ 0xf9, 0xdb, 0x6e, 0xcb, 0x4d, 0x94, 0x17, 0x18, 0x52, 0x87, 0x68, 0x12,
+ 0x78, 0x4b, 0x51, 0x88, 0xc4, 0x7c, 0xaa, 0x54, 0x4e, 0xe0, 0xf3, 0x40,
+ 0xac, 0xfb, 0x64, 0xc0, 0x3a, 0xd7, 0x38, 0xd5, 0x2e, 0x15, 0xe1, 0xef,
+ 0x4a, 0xcc, 0x29, 0xdf, 0x6a, 0x85, 0x3d, 0xdd, 0x76, 0xea, 0xc7, 0x5d,
+ 0x46, 0x7f, 0xc7, 0x3d, 0x43, 0xba, 0x48, 0x57, 0x2f, 0xc8, 0x2c, 0xc2,
+ 0x9e, 0xbd, 0xd7, 0x53, 0x4f, 0xf9, 0xe5, 0x14, 0x40, 0xc2, 0x58, 0xb3,
+ 0x63, 0x5a, 0x98, 0x80, 0xc4, 0xaf, 0xc3, 0xe6, 0xc0, 0x54, 0xce, 0x2a,
+ 0xed, 0x0a, 0x82, 0x0b, 0x8f, 0x89, 0x2d, 0xe9, 0x03, 0x2b, 0x00, 0xbe,
+ 0x7c, 0x8a, 0xfa, 0x76, 0xff, 0x68, 0x47, 0xeb, 0xfa, 0xb0, 0xe1, 0xd5,
+ 0x55, 0x37, 0x4b, 0xaa, 0xec, 0x76, 0xd4, 0x8b, 0x21, 0x7d, 0x08, 0x22,
+ 0x15, 0x31, 0x53, 0xfa, 0x0b, 0x7e, 0x0c, 0xd4, 0x9b, 0xd2, 0x9d, 0x42,
+ 0xea, 0x58, 0x0a, 0xad, 0x52, 0x62, 0xaa, 0xae, 0x23, 0x1c, 0xd8, 0x83,
+ 0x84, 0x1e, 0xfb, 0xaa, 0xf1, 0xe0, 0xdb, 0x1d, 0xad, 0x67, 0x4d, 0xfe,
+ 0x1b, 0x4a, 0x20, 0xd6, 0x03, 0x5f, 0x67, 0xad, 0x02, 0xd8, 0x36, 0x53,
+ 0xa8, 0x37, 0xe8, 0x99, 0xb9, 0xd8, 0x9c, 0xcd, 0x9c, 0xc0, 0xd7, 0xc7,
+ 0x68, 0x55, 0x91, 0x54, 0xe7, 0x14, 0x26, 0x91, 0x5d, 0x54, 0x54, 0xe3,
+ 0xbe, 0x95, 0xe2, 0x40, 0x65, 0xea, 0x28, 0x03, 0xc8, 0x12, 0x7b, 0x21,
+ 0x4d, 0x04, 0x20, 0x81, 0xdb, 0xbc, 0xd6, 0xe0, 0xa3, 0xd9, 0xdb, 0x13,
+ 0xc6, 0x44, 0x34, 0x4c, 0x48, 0x90, 0x35, 0x13, 0x6f, 0x2a, 0xb3, 0xc9,
+ 0x4d, 0xc9, 0x98, 0x5a, 0x33, 0x69, 0x5e, 0xa6, 0x67, 0x2f, 0xf9, 0x5f,
+ 0xb2, 0x07, 0xbe, 0x75, 0x49, 0x7b, 0xb4, 0x11, 0x86, 0xcc, 0x43, 0x39,
+ 0x74, 0x1b, 0xe2, 0xf8, 0x87, 0xcb, 0x8b, 0xc3, 0xe4, 0x9b, 0xe3, 0xc3,
+ 0x57, 0xc7, 0x17, 0xa3, 0xce, 0xa5, 0x2f, 0xf0, 0x0f, 0xd6, 0xd0, 0xc8,
+ 0x09, 0x0c, 0xd5, 0x58, 0x89, 0x07, 0x04, 0xb7, 0xaf, 0x52, 0xcf, 0x6c,
+ 0x1e, 0x3a, 0x48, 0xe6, 0x7c, 0x90, 0x41, 0xc4, 0xd1, 0x02, 0x10, 0x18,
+ 0xd7, 0x10, 0x36, 0xb6, 0x8d, 0x89, 0x91, 0x50, 0x04, 0x62, 0x50, 0x97,
+ 0xb9, 0x9f, 0x31, 0xe3, 0xb8, 0xfa, 0xdc, 0x65, 0x32, 0x2d, 0x35, 0x19,
+ 0xb0, 0xbd, 0x72, 0xdf, 0xb8, 0x7c, 0x6f, 0x4f, 0x6c, 0xc9, 0x25, 0x23,
+ 0x5e, 0xc3, 0xde, 0x0f, 0x03, 0xf3, 0xdd, 0x81, 0x99, 0xfc, 0x01, 0x91,
+ 0x39, 0xde, 0x67, 0x75, 0xaf, 0xe3, 0x02, 0x6c, 0x7f, 0x7e, 0x83, 0x2b,
+ 0x31, 0x05, 0x27, 0xe9, 0x9b, 0x68, 0x4b, 0x74, 0xba, 0x66, 0x54, 0x1f,
+ 0xa9, 0x6b, 0x41, 0xe0, 0x52, 0xf5, 0x94, 0x64, 0x39, 0x41, 0x41, 0x7a,
+ 0x8b, 0x00, 0x94, 0x9c, 0x99, 0x29, 0x78, 0x30, 0x74, 0x44, 0x86, 0x00,
+ 0x5d, 0xc7, 0x9c, 0x3d, 0xbe, 0xd4, 0x67, 0xcc, 0xb5, 0xcc, 0x1e, 0x33,
+ 0xd3, 0x2d, 0x79, 0xc8, 0xbf, 0x1f, 0x10, 0x00, 0x11, 0x0c, 0x7e, 0xdd,
+ 0x8a, 0x8f, 0x8a, 0x33, 0x54, 0x68, 0xb8, 0xa5, 0x39, 0xea, 0x83, 0xdd,
+ 0xf3, 0x0a, 0xdd, 0xa7, 0x4f, 0x6a, 0x85, 0x10, 0x79, 0x97, 0x51, 0x60,
+ 0x64, 0xd4, 0xc3, 0xbf, 0xc9, 0x75, 0x67, 0xb9, 0xf8, 0x24, 0x0b, 0x36,
+ 0x2f, 0x17, 0xc8, 0xdf, 0xcc, 0x28, 0xcd, 0x06, 0xf4, 0xb8, 0x7d, 0x2e,
+ 0x4b, 0xbe, 0x29, 0x6b, 0xdc, 0x05, 0xe1, 0xe3, 0x74, 0xc9, 0xc7, 0xa6,
+ 0x1f, 0x6f, 0x48, 0x7c, 0xcb, 0x92, 0xc4, 0x6e, 0x6c, 0x68, 0x4a, 0xd5,
+ 0xf9, 0xe1, 0xe5, 0x37, 0x88, 0xae, 0x62, 0x0b, 0xbf, 0x02, 0x63, 0x8a,
+ 0xc6, 0xd4, 0xc2, 0x94, 0x2c, 0x6b, 0xc0, 0xb1, 0xfe, 0xab, 0xc4, 0x8c,
+ 0xaa, 0x4f, 0x22, 0x7a, 0x97, 0x33, 0x10, 0x69, 0xc6, 0xb5, 0x7e, 0x21,
+ 0xa3, 0x5b, 0x95, 0x18, 0x01, 0x7d, 0xb7, 0xf9, 0x76, 0x16, 0x6f, 0xb9,
+ 0xc9, 0x89, 0xf0, 0x9b, 0x3c, 0x26, 0x6c, 0x7a, 0x52, 0xe6, 0x36, 0x92,
+ 0x36, 0xf3, 0x30, 0x7e, 0x41, 0x99, 0xce, 0x1c, 0x80, 0x9a, 0x96, 0x71,
+ 0xde, 0x43, 0xef, 0x48, 0x7f, 0x39, 0xbf, 0x1f, 0x86, 0x04, 0x3c, 0xc9,
+ 0x57, 0xcb, 0xa6, 0x2d, 0x56, 0x3a, 0xfc, 0xc7, 0x56, 0xb3, 0xac, 0xca,
+ 0xb2, 0xf1, 0xfa, 0x00, 0xed, 0x27, 0x6d, 0xe4, 0x44, 0x33, 0xc1, 0x25,
+ 0xf7, 0x85, 0x9a, 0x2a, 0x44, 0xef, 0xf6, 0x15, 0xc3, 0x74, 0x5c, 0x97,
+ 0xb3, 0x65, 0xe3, 0xa1, 0xaf, 0x7f, 0x59, 0x9f, 0xbd, 0x4e, 0x6f, 0x9d,
+ 0x0c, 0x95, 0xec, 0xb3, 0x60, 0x8a, 0x3a, 0x63, 0xe9, 0x1b, 0xf5, 0x12,
+ 0xc1, 0xc6, 0xaa, 0x2c, 0xda, 0x35, 0xe0, 0x00, 0xf4, 0xde, 0xde, 0xd8,
+ 0x18, 0xe9, 0x62, 0x13, 0xdd, 0x6b, 0xb8, 0xe8, 0xdf, 0x43, 0x9b, 0xa4,
+ 0x3e, 0x70, 0xb0, 0x60, 0x62, 0xfe, 0xa2, 0x24, 0x70, 0x19, 0xaf, 0x29,
+ 0x44, 0x38, 0xaf, 0x71, 0x5e, 0xb7, 0x07, 0x85, 0x5f, 0xd9, 0x70, 0x85,
+ 0xe6, 0x97, 0x5d, 0x96, 0xca, 0xc9, 0x2f, 0xe1, 0x3a, 0xb7, 0x21, 0x5a,
+ 0xd9, 0xf0, 0x51, 0x86, 0x69, 0xba, 0x04, 0xb4, 0x82, 0xb4, 0x85, 0xe3,
+ 0x52, 0x27, 0x77, 0xfe, 0xf7, 0x4e, 0xd2, 0xe7, 0xea, 0x04, 0x11, 0xd2,
+ 0x9e, 0x65, 0xf2, 0xff, 0x01, 0xf0, 0x4a, 0xe8, 0x7d, 0xa9, 0xcd, 0x61,
+ 0x9b, 0x40, 0x76, 0x68, 0x4c, 0xa8, 0x9b, 0x6a, 0xe2, 0x76, 0xbf, 0xd1,
+ 0x0e, 0xb2, 0x3b, 0xb2, 0x5f, 0xd4, 0x46, 0x10, 0xba, 0x10, 0x2e, 0xe2,
+ 0x6c, 0x09, 0x98, 0x40, 0xb7, 0x71, 0x65, 0xbd, 0x7a, 0x54, 0x4f, 0x95,
+ 0xab, 0x8e, 0xb2, 0x5a, 0x8f, 0x72, 0x4a, 0x1a, 0x36, 0xdd, 0x48, 0x5a,
+ 0x76, 0x3b, 0x95, 0x23, 0xe4, 0x3f, 0x35, 0xe9, 0x48, 0x80, 0x5d, 0xb2,
+ 0xfd, 0xbd, 0x12, 0x7d, 0x5e, 0xb1, 0x63, 0x45, 0x9c, 0x32, 0x9a, 0x4e,
+ 0xc3, 0x91, 0xda, 0x49, 0xd5, 0x02, 0x28, 0x5a, 0x09, 0x5a, 0x4b, 0x61,
+ 0x1e, 0x21, 0x24, 0x19, 0x71, 0x18, 0x73, 0xd2, 0x36, 0x15, 0x93, 0x54,
+ 0x4b, 0x46, 0xaf, 0x54, 0x4d, 0xe3, 0xb0, 0x2b, 0xe5, 0xba, 0x2f, 0x77,
+ 0x3f, 0x92, 0xf0, 0x11, 0x99, 0xa3, 0xf2, 0x99, 0xbe, 0x4a, 0xa0, 0x43,
+ 0x92, 0x7a, 0xbe, 0x0c, 0xde, 0xf0, 0x01, 0x29, 0x0e, 0xb1, 0x79, 0x4d,
+ 0x59, 0x1e, 0xe2, 0x92, 0x12, 0x2e, 0x13, 0xf8, 0xbf, 0x6e, 0x72, 0xc1,
+ 0x95, 0xf2, 0xac, 0xb7, 0x6b, 0xa8, 0xc2, 0xc3, 0x47, 0x90, 0x02, 0x17,
+ 0x55, 0xb5, 0xc0, 0x87, 0x61, 0x78, 0x60, 0x86, 0x96, 0x55, 0x55, 0x2e,
+ 0x91, 0x13, 0x3f, 0xa7, 0x9c, 0x51, 0x18, 0x16, 0xeb, 0xfc, 0xc8, 0xaf,
+ 0xfb, 0x9f, 0x24, 0x10, 0x6b, 0x91, 0x70, 0x02, 0x89, 0x50, 0xc5, 0xd1,
+ 0x85, 0xb2, 0xbf, 0x07, 0xc3, 0x94, 0x31, 0x1b, 0xe0, 0x29, 0xd5, 0x16,
+ 0x94, 0x2f, 0xad, 0x3b, 0xf9, 0xdb, 0x7d, 0x99, 0x25, 0x9b, 0x71, 0x2f,
+ 0x21, 0x66, 0xd6, 0x0b, 0xbd, 0xb8, 0x53, 0xab, 0x08, 0x1c, 0x67, 0x71,
+ 0xd7, 0x4d, 0xb5, 0x9c, 0x34, 0x41, 0xf9, 0xd2, 0x56, 0x68, 0xde, 0xce,
+ 0x71, 0xe9, 0xdb, 0xf6, 0x27, 0xe7, 0x62, 0xde, 0xb3, 0xf5, 0x41, 0x3d,
+ 0xdb, 0x4a, 0x5b, 0x49, 0x2e, 0xfc, 0xf2, 0x46, 0xd2, 0xfa, 0xee, 0xb6,
+ 0xdd, 0x65, 0x83, 0x73, 0x9b, 0x51, 0xdf, 0xa6, 0x3f, 0x42, 0x76, 0x82,
+ 0x77, 0xf7, 0x8a, 0x22, 0x06, 0xc5, 0xa3, 0x4a, 0x84, 0x7c, 0x11, 0x6a,
+ 0x0d, 0xb9, 0x2c, 0x37, 0x2c, 0x41, 0xa2, 0xe9, 0xd2, 0x40, 0xa0, 0xaa,
+ 0x1c, 0xfd, 0xdd, 0x31, 0x13, 0xa9, 0x95, 0x7e, 0x6c, 0x89, 0xab, 0xda,
+ 0x91, 0x2c, 0x76, 0x70, 0xaa, 0xa0, 0x68, 0xb2, 0xfa, 0xa1, 0x90, 0xc5,
+ 0xc9, 0xfc, 0x0d, 0x93, 0x57, 0x72, 0x28, 0xe4, 0x0b, 0x5d, 0x75, 0x22,
+ 0xbc, 0x1b, 0xcf, 0x99, 0x0a, 0x25, 0xd8, 0x47, 0xaf, 0xd4, 0xa7, 0x0a,
+ 0x91, 0x83, 0xb9, 0x21, 0xcb, 0x46, 0x17, 0xc9, 0xcc, 0xab, 0x7e, 0xc2,
+ 0x74, 0x81, 0x46, 0xbc, 0x39, 0xcb, 0x76, 0x37, 0xbd, 0x1a, 0x5d, 0x5b,
+ 0x0c, 0xfa, 0x2f, 0x61, 0xfd, 0x58, 0xb2, 0x42, 0xf6, 0x5e, 0x10, 0xb8,
+ 0x6d, 0x3b, 0xd2, 0x15, 0xd3, 0xc4, 0x2f, 0xed, 0xcc, 0xde, 0x67, 0xfb,
+ 0xc3, 0xbd, 0xe7, 0x9f, 0x0e, 0x77, 0x87, 0x7b, 0xbb, 0x24, 0x5f, 0xa8,
+ 0x2b, 0x5e, 0xe7, 0x78, 0x5e, 0x22, 0x9f, 0x6a, 0xbd, 0x17, 0x7e, 0xf3,
+ 0xed, 0xf1, 0xe5, 0xf7, 0x67, 0x17, 0xdf, 0x26, 0x27, 0x6f, 0x2f, 0x8f,
+ 0x2f, 0x5e, 0x1f, 0x1e, 0x3d, 0x96, 0xb0, 0xdf, 0x77, 0x5b, 0x7b, 0x35,
+ 0xcb, 0x33, 0x37, 0x31, 0xa1, 0x6f, 0xd0, 0xcd, 0x59, 0xd6, 0xdc, 0xec,
+ 0x1e, 0xec, 0xad, 0xa5, 0xa4, 0x8e, 0xb8, 0x07, 0xdd, 0xfb, 0x3a, 0xa8,
+ 0x3d, 0x1a, 0xd4, 0xea, 0x56, 0x2c, 0x35, 0xe3, 0x88, 0xb1, 0x55, 0x16,
+ 0x97, 0x0b, 0x31, 0x8f, 0x2a, 0x48, 0x60, 0x64, 0x15, 0xc1, 0x3e, 0x66,
+ 0xf2, 0x5b, 0x4e, 0xaf, 0x15, 0x92, 0x19, 0xc1, 0xa0, 0x8b, 0xcc, 0xdd,
+ 0xe0, 0xfa, 0xe0, 0x8d, 0xb8, 0x53, 0x98, 0xce, 0x76, 0x0a, 0x15, 0x4f,
+ 0xa5, 0xb2, 0xe4, 0xae, 0xd1, 0x6e, 0x91, 0x0a, 0xa5, 0x4c, 0x38, 0x38,
+ 0xb5, 0x79, 0x22, 0x96, 0x85, 0x00, 0xd0, 0x07, 0xd5, 0xd3, 0xd1, 0xd7,
+ 0x76, 0x89, 0x77, 0x1f, 0x3e, 0xdb, 0xe1, 0x5e, 0xad, 0x15, 0xd7, 0x8c,
+ 0x81, 0xb5, 0x5c, 0xa3, 0x47, 0xd2, 0x11, 0x9c, 0x06, 0xaf, 0x37, 0xfc,
+ 0x29, 0x28, 0x54, 0x44, 0x92, 0x06, 0x7a, 0xc8, 0x16, 0x43, 0x32, 0xdf,
+ 0x51, 0xc8, 0x9d, 0x60, 0xfd, 0x4f, 0xcb, 0x5a, 0x50, 0xeb, 0x75, 0x8b,
+ 0xa4, 0x30, 0xe1, 0xca, 0x54, 0xfe, 0xeb, 0xac, 0x6a, 0x03, 0x9d, 0x39,
+ 0xad, 0xd2, 0x3b, 0x94, 0x57, 0xc9, 0x1d, 0xe5, 0xe8, 0x46, 0xd2, 0x2a,
+ 0xaf, 0x45, 0x8a, 0x93, 0x9b, 0xf3, 0xe4, 0xfc, 0xf8, 0xcd, 0x40, 0x0b,
+ 0x1c, 0x9b, 0xbf, 0xb3, 0x33, 0x4a, 0xf9, 0x25, 0x39, 0xb7, 0x67, 0x91,
+ 0x15, 0x8a, 0xa5, 0x81, 0x4c, 0x14, 0xf0, 0x8f, 0x3f, 0x00, 0x3a, 0x34,
+ 0x96, 0x81, 0x52, 0x20, 0xa3, 0x8a, 0xb9, 0xe4, 0xdc, 0xc2, 0x2e, 0x2d,
+ 0x27, 0xad, 0xa7, 0x00, 0x96, 0x93, 0x2d, 0x0b, 0xd2, 0xa5, 0xef, 0x01,
+ 0x89, 0x0a, 0xd4, 0x80, 0x85, 0x09, 0x94, 0x9a, 0x79, 0x7d, 0xfe, 0xed,
+ 0xd1, 0xe8, 0x8f, 0x7b, 0xfb, 0xd2, 0x9d, 0x6d, 0xb5, 0x0a, 0x48, 0x56,
+ 0x75, 0x93, 0xf2, 0x21, 0xae, 0xfd, 0x3e, 0x6a, 0x8a, 0x35, 0x0e, 0x38,
+ 0x16, 0x63, 0xcb, 0x26, 0x06, 0x6d, 0xb7, 0x32, 0x83, 0x80, 0xfc, 0xba,
+ 0xb7, 0x2a, 0xa6, 0x2d, 0xda, 0x4b, 0x21, 0x11, 0x94, 0x77, 0x92, 0x02,
+ 0x4b, 0x8d, 0x85, 0xfa, 0xa5, 0x85, 0xfe, 0x88, 0x5b, 0x96, 0xd6, 0x90,
+ 0x43, 0xee, 0xe0, 0x2c, 0xdd, 0x35, 0xa7, 0xf9, 0x76, 0xbf, 0x25, 0x9e,
+ 0x58, 0xb9, 0xd9, 0x95, 0x10, 0xc8, 0x7d, 0x06, 0x07, 0x40, 0xd0, 0xeb,
+ 0x53, 0x2d, 0xe1, 0x56, 0xb8, 0x3a, 0x28, 0xf4, 0xf4, 0x99, 0x59, 0x28,
+ 0x73, 0xb2, 0x98, 0xb7, 0x81, 0x84, 0x42, 0x39, 0x23, 0xd3, 0xc5, 0x3e,
+ 0xf2, 0xaa, 0xa2, 0xd2, 0x31, 0x0b, 0xc6, 0x91, 0xbe, 0x1d, 0x26, 0xdf,
+ 0x64, 0x05, 0x25, 0xce, 0x13, 0xe2, 0x4e, 0x73, 0xaf, 0x80, 0x0b, 0xa4,
+ 0x1a, 0x92, 0xa8, 0xa9, 0x77, 0x9a, 0xa5, 0xc2, 0xc9, 0x69, 0x64, 0x5d,
+ 0xcd, 0x16, 0xae, 0xd6, 0x93, 0x4a, 0x09, 0x9d, 0x27, 0x04, 0xa2, 0x96,
+ 0xec, 0x82, 0x49, 0xa2, 0xa9, 0x81, 0xad, 0x36, 0xb1, 0x26, 0x4a, 0x22,
+ 0xa0, 0x39, 0x39, 0xe6, 0x88, 0x35, 0x89, 0x57, 0xf9, 0x06, 0x74, 0xda,
+ 0xe4, 0x2d, 0x64, 0x8b, 0xcb, 0x09, 0x95, 0x69, 0x75, 0x43, 0xae, 0x8f,
+ 0xda, 0x5c, 0x37, 0x69, 0x31, 0xb9, 0x1f, 0x4e, 0x8d, 0x2e, 0x4b, 0xce,
+ 0xb3, 0xe1, 0xf2, 0xc3, 0x8e, 0x77, 0x4c, 0x49, 0xe4, 0xdf, 0x30, 0x47,
+ 0x40, 0xdb, 0xf1, 0xad, 0x85, 0x8a, 0x43, 0xea, 0xb0, 0xb4, 0x75, 0x26,
+ 0x68, 0x4b, 0x68, 0xb6, 0x3f, 0x1f, 0xcf, 0x95, 0x24, 0x5b, 0xc7, 0x89,
+ 0x65, 0x38, 0xa6, 0x16, 0x86, 0x8b, 0x6c, 0x7e, 0x60, 0xb3, 0x91, 0x55,
+ 0x3e, 0x48, 0x55, 0x0d, 0x6b, 0x58, 0x78, 0x4e, 0xda, 0x22, 0xbb, 0x9e,
+ 0x89, 0x42, 0xe1, 0x9b, 0x2e, 0xb6, 0x89, 0x48, 0x0a, 0x08, 0x1b, 0x3c,
+ 0x52, 0xed, 0x08, 0x1a, 0xbb, 0xd9, 0x87, 0x8d, 0x40, 0x6a, 0xf9, 0xe1,
+ 0x8a, 0x14, 0x7a, 0xd7, 0x88, 0x30, 0x87, 0x80, 0x6c, 0x99, 0x94, 0x61,
+ 0x71, 0xf1, 0x28, 0x12, 0x49, 0xc2, 0x4f, 0x44, 0x04, 0x8b, 0x1d, 0x02,
+ 0x1a, 0x77, 0x41, 0x45, 0x23, 0xf8, 0xa9, 0xf5, 0x80, 0xf9, 0xac, 0x98,
+ 0x5f, 0xdf, 0x3e, 0x21, 0x8f, 0xf7, 0xe5, 0xe9, 0x48, 0xa3, 0x22, 0x45,
+ 0x76, 0xe7, 0x6d, 0x2d, 0x2e, 0x3d, 0x20, 0xfb, 0x8f, 0x1c, 0x40, 0x4c,
+ 0xa9, 0x0c, 0xb6, 0x03, 0xf4, 0x84, 0xa5, 0x82, 0x0b, 0x93, 0xb9, 0xe4,
+ 0x07, 0x9d, 0x04, 0x81, 0x11, 0x53, 0x57, 0xb4, 0x74, 0x19, 0x2b, 0x43,
+ 0x96, 0xe9, 0x85, 0xb8, 0xfb, 0x8c, 0xb2, 0xf4, 0xa4, 0x9f, 0x0c, 0xf6,
+ 0xc1, 0x9f, 0xb3, 0xd7, 0x9e, 0xc4, 0xb4, 0x61, 0x9a, 0x40, 0x6a, 0xc3,
+ 0xb4, 0xa4, 0xad, 0x88, 0x38, 0xd8, 0x92, 0x2d, 0x7d, 0x6b, 0xde, 0xa7,
+ 0x3f, 0xf6, 0x65, 0x40, 0xb7, 0x7b, 0x40, 0x6c, 0x33, 0x6f, 0xe5, 0xec,
+ 0x3e, 0x54, 0x19, 0xf6, 0xd7, 0xae, 0x2a, 0x72, 0x23, 0xee, 0x72, 0x4b,
+ 0x20, 0xcd, 0x45, 0x13, 0xe0, 0x0a, 0x15, 0x4a, 0x50, 0xed, 0x80, 0x99,
+ 0x42, 0x71, 0x72, 0x17, 0xc9, 0xed, 0xbe, 0xc6, 0x9a, 0xe9, 0x37, 0x3a,
+ 0x6f, 0xec, 0xac, 0x77, 0x42, 0x24, 0x48, 0x5b, 0x24, 0x94, 0x9b, 0xb7,
+ 0x6b, 0x29, 0xeb, 0xc9, 0xec, 0x59, 0x23, 0x45, 0x5a, 0x52, 0xa6, 0x2c,
+ 0xc4, 0xad, 0xc0, 0x29, 0xef, 0xcc, 0x47, 0x4f, 0x06, 0xbc, 0x07, 0x73,
+ 0x02, 0xf2, 0xdb, 0x43, 0x44, 0x9e, 0x14, 0x36, 0x51, 0x42, 0x5c, 0xf9,
+ 0xa0, 0xe8, 0xc3, 0xf2, 0xdf, 0xe4, 0xec, 0x98, 0x00, 0xd6, 0x14, 0xd7,
+ 0xb9, 0x39, 0xf9, 0x9b, 0x89, 0x39, 0x4c, 0x4b, 0x92, 0xf8, 0x8d, 0xad,
+ 0xa3, 0x36, 0x62, 0x6a, 0xcf, 0x4d, 0x5f, 0xcc, 0x0d, 0xbe, 0xa0, 0xa1,
+ 0xd4, 0x9b, 0x6e, 0xec, 0x42, 0x71, 0xde, 0x1e, 0x88, 0xc4, 0x39, 0xb4,
+ 0x72, 0xd8, 0x79, 0xa5, 0xc5, 0xd1, 0x37, 0x8f, 0x3f, 0x92, 0x8e, 0xb3,
+ 0x29, 0x5f, 0xe2, 0x5f, 0x73, 0x4e, 0x3f, 0xe6, 0xe8, 0xfc, 0xe4, 0x2d,
+ 0x97, 0xfb, 0xb6, 0x67, 0x21, 0x23, 0xea, 0xc5, 0x0d, 0xae, 0x2b, 0x8f,
+ 0xfe, 0xa4, 0xca, 0x01, 0xcf, 0x8e, 0x23, 0xda, 0x33, 0xb4, 0xc7, 0x73,
+ 0xf9, 0xd6, 0xc5, 0x92, 0xbf, 0xbe, 0x49, 0xf7, 0x5c, 0x5d, 0xcf, 0x36,
+ 0x3b, 0x65, 0x6c, 0xed, 0x9a, 0x74, 0x2e, 0x14, 0xeb, 0x91, 0x9a, 0x4c,
+ 0x9d, 0x82, 0x8f, 0x32, 0xdd, 0xd4, 0x4a, 0x4b, 0xce, 0xf5, 0x3b, 0x99,
+ 0x8e, 0xbe, 0x2b, 0xfc, 0x8f, 0xc9, 0x70, 0xc7, 0x7c, 0xb0, 0xde, 0xd1,
+ 0x17, 0x17, 0x1f, 0x26, 0xb5, 0xb9, 0xe1, 0x28, 0xad, 0xf7, 0x47, 0x18,
+ 0xe4, 0x58, 0x0e, 0xd3, 0xe3, 0xe9, 0xcf, 0xc9, 0x60, 0x32, 0xc3, 0xf8,
+ 0x12, 0x14, 0xcb, 0xfe, 0xd1, 0xac, 0x3c, 0x3d, 0xf1, 0xb3, 0x5d, 0xc3,
+ 0xd7, 0x39, 0x9d, 0xb7, 0x8f, 0x7d, 0x1d, 0xfa, 0x19, 0x1b, 0x0c, 0xcc,
+ 0x6f, 0x9b, 0x1c, 0x4e, 0x6f, 0x29, 0xe9, 0x6e, 0x2a, 0xff, 0xa4, 0xf1,
+ 0x1c, 0x17, 0x28, 0x35, 0x8a, 0x91, 0xa6, 0x63, 0xae, 0x2c, 0xfe, 0x5d,
+ 0x6e, 0x8c, 0x8e, 0xa3, 0x8e, 0x7e, 0x41, 0xf9, 0x7f, 0xd4, 0x41, 0xbc,
+ 0xe5, 0xfd, 0x52, 0x93, 0x39, 0xfa, 0x92, 0xb3, 0xe0, 0xa0, 0xa5, 0x24,
+ 0x9d, 0x69, 0xe9, 0x86, 0xc9, 0x57, 0x14, 0xe3, 0xac, 0x32, 0x8f, 0xfd,
+ 0x55, 0x2e, 0x3e, 0x2e, 0xc9, 0x47, 0x8b, 0x91, 0x32, 0xff, 0xc4, 0xd0,
+ 0x8e, 0x24, 0xc8, 0x81, 0xb1, 0x63, 0xb2, 0xbf, 0x69, 0x0f, 0x0e, 0xfd,
+ 0xd2, 0x94, 0x76, 0x33, 0x14, 0xcd, 0x97, 0x48, 0x82, 0xa1, 0x78, 0xbc,
+ 0x94, 0xdc, 0x43, 0xbe, 0x30, 0xa7, 0x99, 0x26, 0xf6, 0x97, 0x3e, 0x9b,
+ 0x8a, 0x7a, 0x8e, 0xd1, 0x94, 0x6a, 0x04, 0x76, 0x4b, 0xe0, 0x0e, 0x77,
+ 0xbd, 0x3e, 0xba, 0x31, 0xa2, 0x39, 0xb3, 0x5d, 0x1d, 0xb1, 0x4b, 0x4f,
+ 0xbb, 0x38, 0xa2, 0x3b, 0x4a, 0x17, 0xc1, 0xfe, 0x52, 0xb3, 0x23, 0xa1,
+ 0x85, 0xee, 0xb0, 0xec, 0xb2, 0x7b, 0x97, 0x67, 0xb7, 0x3d, 0x04, 0x4a,
+ 0x6a, 0x1c, 0xbd, 0x7b, 0x43, 0xa5, 0x4d, 0x50, 0x81, 0xfa, 0xf2, 0xe2,
+ 0xf0, 0xed, 0xe8, 0x35, 0xbb, 0xc6, 0x2f, 0x4b, 0xaf, 0xb4, 0xb5, 0xc4,
+ 0x15, 0x34, 0x7e, 0x6c, 0x69, 0xe2, 0xee, 0xb8, 0xde, 0x86, 0xe2, 0xe9,
+ 0xa5, 0xee, 0x75, 0xbf, 0xcb, 0xb7, 0xcf, 0x45, 0xb3, 0x69, 0x36, 0xa8,
+ 0x6b, 0x5b, 0xa3, 0x6d, 0xab, 0x08, 0xd5, 0x7e, 0x51, 0x36, 0x57, 0x75,
+ 0x5e, 0x99, 0xa1, 0xe5, 0x21, 0x9a, 0x96, 0x23, 0xed, 0x8c, 0xfe, 0x94,
+ 0xef, 0xde, 0x95, 0x64, 0xa4, 0x47, 0xc6, 0x54, 0x1c, 0x48, 0xa5, 0x1a,
+ 0xc7, 0xc7, 0xe6, 0xdc, 0xa9, 0x7c, 0xf7, 0x0a, 0x95, 0x9f, 0x6d, 0xdc,
+ 0xcf, 0xfb, 0xd4, 0xa6, 0xb7, 0xfe, 0xbc, 0xb7, 0x1d, 0x6f, 0xfe, 0xf2,
+ 0x97, 0x36, 0x1f, 0xef, 0xbb, 0xda, 0x66, 0x2e, 0xa5, 0x68, 0xeb, 0xcf,
+ 0xfb, 0xdb, 0x6b, 0x47, 0xe4, 0x67, 0x45, 0xba, 0x6f, 0x9a, 0x37, 0xa8,
+ 0xb3, 0xc9, 0x4b, 0x3e, 0x66, 0x56, 0x67, 0xb2, 0x08, 0x1d, 0x8f, 0x6f,
+ 0xb8, 0x45, 0xd8, 0x41, 0xb0, 0x6d, 0xab, 0xa9, 0xbb, 0xc0, 0x9b, 0x64,
+ 0x97, 0x9c, 0xfc, 0xcf, 0x63, 0x9f, 0x46, 0xb2, 0xd8, 0x6c, 0xfc, 0x2b,
+ 0x8a, 0xd8, 0x01, 0xea, 0x72, 0x88, 0x6f, 0xef, 0xaf, 0xf9, 0xb6, 0x1b,
+ 0x9d, 0xe7, 0x96, 0xa0, 0x28, 0x36, 0xc1, 0xe0, 0x94, 0x0d, 0x5b, 0xbe,
+ 0x63, 0xbf, 0xbd, 0xee, 0x7b, 0x97, 0x27, 0x6f, 0x8e, 0x89, 0x35, 0xfb,
+ 0xd5, 0x09, 0x91, 0xcf, 0x8d, 0x84, 0xfe, 0x51, 0x3d, 0x10, 0x96, 0x91,
+ 0xd7, 0xaf, 0x96, 0xc2, 0xe1, 0x5d, 0x8b, 0x36, 0xb3, 0x92, 0xc3, 0xae,
+ 0x04, 0x7d, 0x5a, 0x30, 0xd0, 0xb5, 0x66, 0x5a, 0x9e, 0x5c, 0x0d, 0xde,
+ 0x94, 0x53, 0x58, 0xc9, 0x83, 0x11, 0xa0, 0x82, 0xe6, 0x2d, 0xf3, 0xc3,
+ 0x77, 0xc5, 0xbc, 0xf5, 0xe3, 0x61, 0x24, 0x53, 0x77, 0x63, 0x55, 0x51,
+ 0x9e, 0x7f, 0xec, 0x0c, 0x06, 0xd4, 0x99, 0x01, 0xc3, 0xba, 0x24, 0xb8,
+ 0xd3, 0xe2, 0xe7, 0x50, 0xd1, 0x62, 0x26, 0x28, 0x9f, 0xdd, 0x33, 0x10,
+ 0x21, 0x75, 0xf0, 0x31, 0x97, 0xbd, 0x79, 0x4d, 0x19, 0x64, 0xce, 0xc5,
+ 0xc7, 0x4e, 0xbc, 0x0d, 0x9f, 0xbc, 0x14, 0x86, 0x54, 0x76, 0xe7, 0xf0,
+ 0x4f, 0x52, 0x7e, 0xb9, 0x5c, 0xdc, 0x63, 0x94, 0x77, 0x2d, 0x68, 0x45,
+ 0x34, 0xbe, 0xfa, 0x0f, 0x7e, 0xa7, 0x55, 0x86, 0x4a, 0x38, 0xa6, 0xbd,
+ 0x1d, 0x28, 0x3f, 0x91, 0xaa, 0x4d, 0x67, 0x95, 0x77, 0x5d, 0x49, 0xb7,
+ 0xb5, 0xba, 0x9d, 0x47, 0x6c, 0xea, 0xf1, 0xb0, 0xb6, 0xfb, 0xe9, 0x93,
+ 0xc0, 0x96, 0x94, 0xfa, 0xfa, 0xaa, 0xb4, 0xc1, 0x31, 0x23, 0x76, 0x16,
+ 0xed, 0x02, 0xc7, 0x59, 0xa2, 0x49, 0xde, 0x9c, 0xc3, 0xbf, 0x39, 0xd8,
+ 0x44, 0x5d, 0x86, 0xbc, 0x88, 0x0c, 0x66, 0xf0, 0xcb, 0x47, 0x13, 0x84,
+ 0x5e, 0x93, 0xde, 0x15, 0x11, 0x61, 0x50, 0x1c, 0xab, 0xc7, 0x1d, 0x60,
+ 0x9e, 0x18, 0xde, 0x5c, 0xe6, 0x82, 0x20, 0xb9, 0xa6, 0x86, 0x24, 0x1b,
+ 0xd5, 0x16, 0x19, 0x6b, 0x9d, 0xe4, 0xec, 0x95, 0x24, 0x41, 0xba, 0x5c,
+ 0x4c, 0x01, 0xca, 0x60, 0x38, 0xea, 0x7f, 0x10, 0x29, 0x76, 0x75, 0x9f,
+ 0xec, 0xed, 0xf7, 0x93, 0xfd, 0xdd, 0xbd, 0xfd, 0xc8, 0x18, 0x7a, 0xff,
+ 0x41, 0xa0, 0xa8, 0x7d, 0xfc, 0xba, 0xf7, 0xd8, 0x51, 0xb8, 0x7c, 0x06,
+ 0xdc, 0x24, 0x92, 0xf9, 0x6b, 0x84, 0x0f, 0xc5, 0x67, 0x41, 0xc4, 0x8c,
+ 0xaa, 0xc7, 0xa0, 0xb3, 0xc3, 0xb5, 0xc5, 0x4e, 0x42, 0xad, 0xb1, 0x69,
+ 0x4b, 0x87, 0x4d, 0x51, 0x49, 0x87, 0x0b, 0xcf, 0x02, 0xf9, 0x62, 0x3d,
+ 0xa5, 0x69, 0x85, 0x52, 0xa0, 0xed, 0x35, 0xca, 0x1b, 0x5d, 0x16, 0x82,
+ 0xd6, 0xd0, 0xda, 0x98, 0xfd, 0xfe, 0xea, 0xe4, 0xe8, 0x52, 0xf9, 0x0e,
+ 0xaf, 0x48, 0x79, 0xaa, 0xee, 0x1f, 0x57, 0x8c, 0x71, 0xed, 0x33, 0xd3,
+ 0x83, 0x9b, 0xcc, 0xa8, 0xd1, 0xc5, 0x78, 0x79, 0x7d, 0xf0, 0xb7, 0xb4,
+ 0xba, 0x2e, 0x8b, 0x87, 0x9e, 0x9f, 0x22, 0xa1, 0xec, 0xc0, 0x48, 0xa8,
+ 0xbd, 0xcf, 0xf6, 0x9e, 0x20, 0xff, 0x7b, 0x96, 0xa3, 0x20, 0x10, 0x09,
+ 0x88, 0xcd, 0xf9, 0x26, 0x13, 0x6c, 0x20, 0x4d, 0xc2, 0xb2, 0x6a, 0x14,
+ 0xd3, 0x4d, 0xbe, 0xee, 0x53, 0xff, 0xd9, 0xa9, 0x3c, 0xcb, 0xa9, 0xe7,
+ 0x9b, 0x92, 0xab, 0xb0, 0x49, 0x69, 0x9a, 0xcb, 0xc5, 0x66, 0x9b, 0x22,
+ 0xfe, 0x81, 0xb1, 0xd2, 0x27, 0x6c, 0xed, 0xc9, 0x23, 0x4b, 0x7c, 0x8f,
+ 0x0c, 0xa2, 0x2a, 0x4b, 0x3f, 0xb8, 0x32, 0xc8, 0x8e, 0x7d, 0x43, 0x43,
+ 0x1e, 0x17, 0xaf, 0x8f, 0x98, 0xc1, 0x54, 0xf3, 0xa5, 0x30, 0xd5, 0x89,
+ 0x75, 0x4d, 0x6d, 0x53, 0x2f, 0x1f, 0xf8, 0x3e, 0xe5, 0x36, 0x1c, 0x4c,
+ 0xc7, 0x8f, 0x78, 0xc8, 0x9c, 0x3b, 0x26, 0x8b, 0x3b, 0x6c, 0x97, 0xde,
+ 0x21, 0x43, 0x0d, 0xf5, 0x43, 0xb4, 0xe6, 0xf1, 0x16, 0xd7, 0x94, 0xe5,
+ 0x88, 0x03, 0x75, 0x4d, 0x2b, 0x49, 0xab, 0x77, 0xc7, 0xf4, 0x9b, 0xaa,
+ 0xbc, 0xbe, 0x3a, 0x3c, 0xf7, 0x0c, 0x5d, 0x18, 0x92, 0xce, 0xa9, 0x47,
+ 0xcf, 0x91, 0xa1, 0x83, 0x92, 0xea, 0x52, 0x8d, 0xa9, 0xef, 0x4c, 0x94,
+ 0x06, 0x72, 0x92, 0x74, 0x23, 0x00, 0xe4, 0x4b, 0xb9, 0x4f, 0xe0, 0x7f,
+ 0x42, 0x35, 0x83, 0xd9, 0x34, 0x45, 0x20, 0x54, 0x6e, 0x21, 0xca, 0x80,
+ 0x38, 0x2b, 0x34, 0x8b, 0xb9, 0xdf, 0x29, 0xdd, 0x60, 0x7e, 0x8c, 0xef,
+ 0xe0, 0x8a, 0x3e, 0x37, 0x4a, 0x38, 0x68, 0x5c, 0x46, 0xaf, 0xbe, 0xa5,
+ 0x1e, 0x4b, 0x50, 0x07, 0x5a, 0x9b, 0xfa, 0xb2, 0x6d, 0x24, 0x4a, 0xad,
+ 0x46, 0x75, 0x5e, 0xa9, 0x6f, 0x91, 0x9a, 0xbb, 0x7d, 0x32, 0xe4, 0x3f,
+ 0xf7, 0x6d, 0xe9, 0x61, 0x3c, 0x06, 0x9c, 0xe7, 0x95, 0x16, 0x36, 0x9e,
+ 0x67, 0x54, 0xcd, 0x37, 0xaf, 0xe7, 0x0e, 0x96, 0x72, 0x25, 0xaf, 0xbb,
+ 0x92, 0x7a, 0xa2, 0x44, 0x52, 0x68, 0x01, 0xfd, 0x40, 0x6f, 0x73, 0xc1,
+ 0x75, 0x99, 0x5d, 0xf6, 0x31, 0x91, 0x74, 0x14, 0xc9, 0xbb, 0x91, 0xca,
+ 0x29, 0x78, 0x8c, 0xf2, 0xab, 0xef, 0x75, 0x29, 0xf8, 0xa6, 0x31, 0xcb,
+ 0x90, 0xd6, 0x1f, 0xcc, 0xa5, 0xc0, 0x50, 0x04, 0x33, 0x8f, 0xb9, 0x04,
+ 0xf3, 0xc9, 0x7d, 0x95, 0x33, 0x24, 0x88, 0x1c, 0x69, 0x60, 0x74, 0x6a,
+ 0x6d, 0x3d, 0xbe, 0x4c, 0xc9, 0x76, 0x9e, 0xd5, 0x19, 0xf3, 0x2f, 0x82,
+ 0x10, 0x88, 0x62, 0x7f, 0xb4, 0xf5, 0x60, 0x33, 0x29, 0xa6, 0x16, 0xe2,
+ 0x8c, 0x76, 0xe9, 0xfe, 0xfe, 0xb3, 0x67, 0xfd, 0xa4, 0x47, 0x7e, 0x47,
+ 0xf4, 0x89, 0x36, 0xf4, 0x6b, 0x08, 0x9e, 0x5e, 0xb4, 0xc2, 0xee, 0x4e,
+ 0x75, 0x35, 0xa1, 0xff, 0xa7, 0xf7, 0xb4, 0xb0, 0xe4, 0xa5, 0x24, 0xe2,
+ 0x50, 0x37, 0x11, 0x64, 0xb5, 0x74, 0x39, 0xbc, 0xd3, 0xe8, 0x77, 0x27,
+ 0xd6, 0xb5, 0x44, 0x71, 0xa4, 0x45, 0x56, 0x2e, 0x34, 0x60, 0x3c, 0x97,
+ 0x92, 0x21, 0xf8, 0xbe, 0x17, 0x65, 0x43, 0x88, 0x9f, 0x11, 0x72, 0xc2,
+ 0x8b, 0x50, 0x2f, 0xc7, 0x03, 0x49, 0x10, 0x66, 0x43, 0x33, 0x37, 0x87,
+ 0x79, 0x4e, 0x8b, 0x20, 0x1e, 0xfc, 0x40, 0x48, 0x7f, 0x95, 0xf4, 0x64,
+ 0xbb, 0xd1, 0x1f, 0x43, 0xc4, 0x7b, 0xb3, 0x09, 0x0d, 0xa3, 0x7c, 0x29,
+ 0xff, 0xf8, 0xf7, 0x7f, 0x37, 0xcd, 0xfe, 0x3b, 0xb5, 0xf2, 0xf2, 0xcf,
+ 0x75, 0x73, 0xe3, 0x3d, 0xd3, 0x93, 0x33, 0x70, 0xe2, 0xa2, 0xdd, 0x40,
+ 0xb0, 0x81, 0x79, 0x16, 0x79, 0x6c, 0x6f, 0x4e, 0x45, 0x48, 0xf7, 0xbd,
+ 0xf1, 0xe5, 0xc8, 0x30, 0x64, 0xbf, 0xa9, 0x05, 0x90, 0x7c, 0x45, 0x91,
+ 0xe8, 0x8c, 0x32, 0xd3, 0xcd, 0x22, 0x80, 0x58, 0x70, 0xdb, 0x41, 0x4a,
+ 0x58, 0xbe, 0xc3, 0x37, 0xca, 0x25, 0xe7, 0x3a, 0x25, 0xb4, 0xee, 0xf4,
+ 0xa6, 0xe0, 0x53, 0x8c, 0x75, 0x32, 0xbf, 0x4a, 0x67, 0xe5, 0xb5, 0x1d,
+ 0x71, 0xac, 0x68, 0xcd, 0x2f, 0x1a, 0x7b, 0xcf, 0x6f, 0x48, 0xdf, 0xf4,
+ 0xe3, 0xeb, 0x8f, 0x6c, 0x85, 0x70, 0x02, 0xf6, 0x68, 0x02, 0xfe, 0x1a,
+ 0x16, 0x29, 0x13, 0x46, 0x62, 0x63, 0xa9, 0xa8, 0x20, 0xd9, 0xd1, 0x83,
+ 0x6e, 0x4f, 0x3e, 0x41, 0x77, 0x27, 0x74, 0x04, 0x3a, 0x55, 0x73, 0x9c,
+ 0xac, 0xb0, 0xca, 0x8d, 0x14, 0x44, 0x11, 0xdd, 0x24, 0x33, 0xf2, 0x2a,
+ 0x37, 0x67, 0x01, 0x17, 0x20, 0x7d, 0x87, 0xe6, 0x0c, 0xa1, 0xc9, 0x8c,
+ 0x09, 0x69, 0xc6, 0x5c, 0x73, 0x6c, 0x30, 0x28, 0x9a, 0xd9, 0x9c, 0xf9,
+ 0x9b, 0xa7, 0xa8, 0x3f, 0xa6, 0x19, 0x1a, 0x79, 0x11, 0x92, 0x0c, 0xb6,
+ 0xe7, 0x99, 0x5f, 0xfd, 0xe7, 0x66, 0xc9, 0x17, 0x7a, 0x5c, 0xd6, 0x93,
+ 0xda, 0xd9, 0x71, 0xc4, 0x8d, 0x8e, 0x1c, 0x8d, 0x7c, 0xa1, 0x83, 0x42,
+ 0x4a, 0xa2, 0x01, 0xda, 0x6f, 0x45, 0x93, 0xb0, 0x8f, 0xf9, 0x90, 0x55,
+ 0xcd, 0x34, 0x22, 0x9e, 0x69, 0x72, 0xbe, 0x19, 0xf9, 0x9e, 0x01, 0x94,
+ 0x5c, 0x27, 0x5b, 0xa3, 0xd1, 0xf9, 0xc9, 0x8e, 0x56, 0x54, 0xdb, 0xd8,
+ 0x38, 0x7e, 0xfb, 0xdd, 0xc9, 0xc5, 0xd9, 0xdb, 0x37, 0xc7, 0x6f, 0x2f,
+ 0x93, 0xef, 0x0e, 0x2f, 0x4e, 0x0e, 0xbf, 0x3a, 0x15, 0xf2, 0x05, 0x1a,
+ 0x26, 0x61, 0xce, 0xd8, 0x14, 0xec, 0x90, 0x12, 0x7b, 0x79, 0x71, 0xd1,
+ 0x52, 0x36, 0x9d, 0x2a, 0xdd, 0xef, 0x85, 0x51, 0x1f, 0x86, 0xf1, 0x7b,
+ 0x54, 0xe5, 0xea, 0x93, 0x2d, 0xf4, 0x5e, 0x0b, 0x74, 0x91, 0x2d, 0x7f,
+ 0xef, 0xa5, 0xf3, 0x13, 0x1c, 0x8e, 0xc4, 0x99, 0x0a, 0x73, 0x57, 0x9a,
+ 0xd2, 0xd6, 0x7a, 0xf9, 0x9a, 0x19, 0x21, 0xb4, 0xf0, 0x8d, 0xbe, 0x0a,
+ 0xf9, 0xc1, 0xba, 0x8e, 0xeb, 0xc3, 0xe1, 0xe9, 0xa9, 0xfb, 0xd4, 0xfa,
+ 0x9a, 0x48, 0xc2, 0x06, 0xc6, 0xb9, 0x84, 0x68, 0x94, 0xe2, 0xd4, 0xd7,
+ 0xa5, 0x2b, 0x0f, 0x50, 0xdc, 0xfb, 0x95, 0x00, 0xe8, 0x63, 0x66, 0xbb,
+ 0x6c, 0x31, 0x8d, 0x0b, 0x81, 0x16, 0x9a, 0xac, 0xca, 0xeb, 0x0f, 0xfd,
+ 0x64, 0xf3, 0xcf, 0x9b, 0x52, 0xa1, 0x1e, 0xdc, 0xd5, 0x5c, 0x71, 0x69,
+ 0xdb, 0x75, 0xea, 0xed, 0x99, 0xeb, 0x93, 0xc4, 0xe1, 0x6d, 0x07, 0xec,
+ 0x8b, 0x0e, 0x45, 0x51, 0xab, 0x7a, 0x0d, 0xf8, 0xb2, 0x7b, 0x5c, 0xca,
+ 0x92, 0x58, 0x76, 0x0a, 0x91, 0x8f, 0x14, 0x67, 0x8d, 0xbe, 0x0b, 0x27,
+ 0x42, 0x3a, 0xf1, 0x28, 0xca, 0x31, 0xd6, 0x82, 0x3c, 0x6f, 0xb6, 0x54,
+ 0x9c, 0x3a, 0xa7, 0xcd, 0x54, 0x4f, 0x85, 0x70, 0x31, 0xd5, 0x96, 0x25,
+ 0x95, 0x19, 0xa9, 0xe2, 0x36, 0x02, 0xe5, 0x39, 0x19, 0x53, 0x01, 0xb4,
+ 0x0f, 0xcd, 0x4c, 0xe3, 0xe4, 0xb3, 0x13, 0xa9, 0xe5, 0xdd, 0x45, 0x4c,
+ 0xa8, 0x93, 0xfb, 0x29, 0xb1, 0x8e, 0xb2, 0xf5, 0x33, 0x59, 0x57, 0x09,
+ 0x42, 0x31, 0x69, 0x37, 0xcf, 0x3e, 0x58, 0x30, 0xd8, 0x9d, 0xa9, 0x33,
+ 0x09, 0xc0, 0xa4, 0xff, 0x7a, 0x0f, 0xb9, 0x49, 0x1c, 0x6b, 0xb1, 0xa4,
+ 0x88, 0x44, 0x39, 0x84, 0x39, 0x76, 0xb8, 0xf4, 0xec, 0x23, 0x73, 0x09,
+ 0xd9, 0x5d, 0xe6, 0x76, 0x02, 0x57, 0xd3, 0x13, 0x18, 0x7a, 0xb7, 0xc7,
+ 0x5a, 0x29, 0x2b, 0xd5, 0xca, 0x4c, 0x88, 0x9b, 0xb1, 0xca, 0x05, 0xa5,
+ 0xa9, 0x3b, 0x1c, 0x38, 0x0d, 0x19, 0xf0, 0xdc, 0xea, 0x74, 0xa7, 0xe1,
+ 0x9e, 0xe2, 0x09, 0x96, 0xb5, 0xa8, 0x50, 0xb8, 0x43, 0x3e, 0xee, 0x68,
+ 0xad, 0x2b, 0x80, 0x0c, 0x28, 0x21, 0xa8, 0x32, 0x52, 0xb4, 0x5e, 0x5d,
+ 0x52, 0x6a, 0x88, 0xd8, 0xf4, 0xc5, 0x11, 0x6a, 0x32, 0x14, 0x54, 0x95,
+ 0xd5, 0xd5, 0xd2, 0x41, 0xf2, 0x40, 0x91, 0x35, 0x15, 0x65, 0xe4, 0x16,
+ 0x62, 0x85, 0x00, 0x90, 0x0f, 0x23, 0x3d, 0xbd, 0x2e, 0xd5, 0x00, 0x4f,
+ 0x2d, 0x6a, 0xc6, 0x56, 0x1c, 0xf4, 0x8c, 0x7a, 0xcb, 0x1c, 0x68, 0x05,
+ 0x17, 0xf0, 0x35, 0x1a, 0x21, 0x24, 0x7c, 0x29, 0x1d, 0x32, 0xad, 0x20,
+ 0x5f, 0x7b, 0xdc, 0x0c, 0x2e, 0x7d, 0x89, 0x24, 0x39, 0x67, 0xe9, 0x28,
+ 0x95, 0x1f, 0xe8, 0x13, 0x95, 0xcb, 0x01, 0x48, 0x67, 0x74, 0x8b, 0x1e,
+ 0x44, 0x93, 0x02, 0x5a, 0x47, 0x93, 0x1a, 0xbc, 0x32, 0xf2, 0x6a, 0x46,
+ 0x19, 0xa4, 0xaa, 0x77, 0xa4, 0xc9, 0x38, 0xbf, 0x66, 0x4e, 0x10, 0x22,
+ 0xa0, 0xa0, 0x73, 0x09, 0x8a, 0xc7, 0x72, 0x9e, 0xd1, 0xe1, 0x00, 0x81,
+ 0x23, 0x8c, 0xf7, 0x9b, 0x72, 0xe6, 0xb3, 0x0c, 0xea, 0x48, 0x64, 0xf5,
+ 0x6d, 0xec, 0x03, 0xb1, 0xcf, 0x25, 0xcd, 0xa3, 0xc2, 0x51, 0xa5, 0x3c,
+ 0x81, 0x80, 0x73, 0x29, 0xa8, 0x06, 0xae, 0xd4, 0x02, 0xa9, 0x80, 0xca,
+ 0xa5, 0x80, 0x79, 0xd0, 0xc4, 0x05, 0xda, 0xb8, 0x70, 0xa4, 0x53, 0x9d,
+ 0xd7, 0x2d, 0x5b, 0x5f, 0x80, 0x5a, 0x99, 0x30, 0x43, 0x33, 0x89, 0x19,
+ 0x86, 0x94, 0xb4, 0x0b, 0x82, 0xc9, 0x62, 0x09, 0x77, 0x9e, 0xd9, 0x13,
+ 0xd4, 0x69, 0x33, 0x53, 0x5b, 0x9e, 0x9a, 0x51, 0x98, 0x2d, 0xc2, 0x8f,
+ 0xb1, 0x07, 0x49, 0xfe, 0x35, 0xb0, 0xb5, 0x0c, 0x05, 0x78, 0xb2, 0xed,
+ 0x80, 0x47, 0x6c, 0x06, 0x90, 0x7c, 0x98, 0x48, 0x35, 0x59, 0x40, 0x74,
+ 0xa8, 0x14, 0x2e, 0x08, 0xe1, 0x5a, 0xc1, 0x87, 0x44, 0x13, 0xee, 0x66,
+ 0x33, 0xaf, 0xc0, 0x00, 0xfb, 0x23, 0xd3, 0xc0, 0xf8, 0x20, 0x39, 0x31,
+ 0x64, 0x99, 0xcb, 0xd0, 0x3f, 0x26, 0x23, 0xf7, 0x06, 0x22, 0x49, 0x25,
+ 0x64, 0x9e, 0x75, 0x62, 0x1a, 0xde, 0x15, 0xa2, 0xf0, 0x18, 0x5f, 0x0d,
+ 0x95, 0x7a, 0x3a, 0x79, 0x3a, 0x67, 0xe3, 0xd1, 0xed, 0xbe, 0xf9, 0x3d,
+ 0xc3, 0x8e, 0x37, 0x36, 0x8e, 0xde, 0x8d, 0x2e, 0xcf, 0xde, 0x24, 0x67,
+ 0xef, 0x2e, 0xcf, 0xdf, 0x5d, 0x8a, 0x9e, 0x3a, 0xe6, 0xa4, 0x0d, 0x86,
+ 0x2e, 0xb1, 0xee, 0xac, 0x8b, 0x39, 0x17, 0x80, 0x0f, 0x30, 0x66, 0x25,
+ 0x68, 0x45, 0x3d, 0x46, 0x31, 0x9b, 0x94, 0x09, 0xae, 0x3d, 0xe6, 0x2b,
+ 0xc7, 0x94, 0xdf, 0x99, 0x29, 0x47, 0x42, 0x3d, 0x3c, 0xf9, 0x9a, 0xe3,
+ 0x09, 0xbf, 0x87, 0x9e, 0xb5, 0x76, 0xad, 0xaa, 0xfb, 0xb6, 0x1f, 0x03,
+ 0xe8, 0x9c, 0x36, 0x83, 0x9b, 0x5f, 0x32, 0x97, 0x9d, 0xbb, 0xce, 0xf7,
+ 0xeb, 0x63, 0xba, 0xa5, 0xe0, 0xae, 0x46, 0xa0, 0x14, 0x56, 0x0f, 0xac,
+ 0x61, 0x3b, 0xb3, 0xd8, 0x4f, 0x70, 0x6e, 0x4a, 0x33, 0xc2, 0x1b, 0x9b,
+ 0x12, 0x43, 0x30, 0x42, 0x40, 0x81, 0x19, 0x41, 0x45, 0x98, 0x5b, 0x76,
+ 0x19, 0x14, 0xd9, 0x1d, 0x29, 0x3e, 0x81, 0x4e, 0x7d, 0x97, 0x6c, 0x7e,
+ 0x9f, 0xf9, 0x0d, 0xfe, 0xe9, 0x3f, 0x29, 0x6f, 0xfb, 0xbd, 0xfe, 0xe4,
+ 0xbf, 0xf8, 0x93, 0x3f, 0x15, 0x9b, 0x10, 0x98, 0x6d, 0xa8, 0xcc, 0xb7,
+ 0xc7, 0x17, 0x5f, 0x1d, 0x5f, 0x9c, 0x8d, 0x20, 0x0f, 0xd4, 0xdf, 0x1d,
+ 0xee, 0xf5, 0x0f, 0x59, 0x35, 0xce, 0xaa, 0x52, 0xea, 0xe8, 0xe9, 0xbf,
+ 0x9e, 0xed, 0x7c, 0x3d, 0x1a, 0x1d, 0x9e, 0x9f, 0xd8, 0x4a, 0x55, 0x36,
+ 0x83, 0x94, 0x7d, 0x24, 0x05, 0xe7, 0x38, 0xd3, 0xf8, 0xf5, 0x15, 0xb3,
+ 0x2f, 0x26, 0x1f, 0x38, 0xb3, 0x20, 0x00, 0xa5, 0x68, 0x60, 0x8d, 0xd0,
+ 0x28, 0x92, 0x58, 0x4c, 0x0d, 0x2b, 0x13, 0x9c, 0x5f, 0x6d, 0x82, 0xcb,
+ 0x42, 0x50, 0x30, 0xb0, 0x6f, 0x21, 0xb8, 0x1f, 0xaa, 0xf1, 0xc0, 0xec,
+ 0xf6, 0x0f, 0x5a, 0xb8, 0x9d, 0x13, 0xa1, 0x8c, 0xa8, 0xe4, 0x0c, 0x09,
+ 0xe7, 0x6c, 0xfc, 0x90, 0x17, 0x79, 0xb3, 0xf3, 0x81, 0xce, 0x07, 0x55,
+ 0x51, 0x9a, 0x0d, 0x59, 0xba, 0xf3, 0x81, 0x52, 0xd8, 0x3b, 0x89, 0xd8,
+ 0x75, 0xec, 0x34, 0xe6, 0x6b, 0xb6, 0xf4, 0x29, 0x3b, 0xbc, 0xcd, 0x4f,
+ 0x9e, 0x5a, 0x9a, 0x3e, 0xd1, 0xfc, 0x81, 0x94, 0xbd, 0x32, 0x77, 0xd5,
+ 0xe2, 0x6e, 0x2a, 0x97, 0x08, 0x58, 0xea, 0x59, 0xb9, 0x14, 0x19, 0xde,
+ 0x8d, 0x50, 0x53, 0x79, 0x56, 0x64, 0x6c, 0x49, 0x3e, 0x4a, 0x32, 0x9e,
+ 0xa5, 0xc5, 0x07, 0xe8, 0x0f, 0xd0, 0x08, 0xe8, 0xee, 0x53, 0xf2, 0x39,
+ 0x2a, 0x9b, 0x0b, 0x40, 0x82, 0xf0, 0xc1, 0xc0, 0xe4, 0x9b, 0x91, 0x70,
+ 0xbb, 0xe7, 0x60, 0x9e, 0xe5, 0xd8, 0xf3, 0x42, 0xef, 0x38, 0x4e, 0x6e,
+ 0x12, 0xc8, 0x77, 0x7c, 0x7c, 0x6a, 0x2e, 0x26, 0x9b, 0x65, 0x06, 0x1f,
+ 0x5d, 0x36, 0xa3, 0x58, 0x90, 0x42, 0x02, 0x39, 0xb1, 0x3a, 0x87, 0x20,
+ 0x63, 0xe9, 0xa1, 0x05, 0x14, 0x10, 0x40, 0xc6, 0x76, 0x41, 0xfe, 0x78,
+ 0x6d, 0xcb, 0x0c, 0x89, 0xe4, 0x66, 0x21, 0x06, 0x76, 0x60, 0x57, 0x75,
+ 0xc8, 0xaf, 0x7f, 0x25, 0x78, 0xdb, 0x23, 0x07, 0x08, 0xb4, 0x05, 0x01,
+ 0xb9, 0x13, 0xce, 0x08, 0xb5, 0x10, 0x83, 0x56, 0x7a, 0xdb, 0xca, 0x65,
+ 0xe2, 0xd7, 0x63, 0x5e, 0x40, 0x26, 0x35, 0x9c, 0x4a, 0xc0, 0xd3, 0xf2,
+ 0x81, 0x69, 0xce, 0x42, 0x3b, 0x4f, 0x40, 0x3b, 0xce, 0x70, 0x20, 0x8a,
+ 0xde, 0xcc, 0x1a, 0xeb, 0xa8, 0xa8, 0x99, 0x61, 0x0d, 0x4a, 0xd7, 0x14,
+ 0x22, 0xa7, 0x6a, 0x51, 0x55, 0xfb, 0xf0, 0x7c, 0xa6, 0xac, 0x29, 0xad,
+ 0x91, 0xc9, 0xd6, 0xbf, 0xb5, 0x66, 0x07, 0x6f, 0xe9, 0xba, 0x28, 0x07,
+ 0xe3, 0x25, 0x1c, 0x33, 0x5e, 0xa1, 0x3e, 0x4e, 0xe2, 0x2e, 0xaf, 0x58,
+ 0xf3, 0xe0, 0xdf, 0x53, 0x40, 0x1a, 0xf4, 0x18, 0x1c, 0xa3, 0x46, 0xbe,
+ 0x74, 0x9b, 0x69, 0xcb, 0xf2, 0x2b, 0x71, 0x12, 0x92, 0xab, 0x20, 0x6e,
+ 0x07, 0x28, 0x8b, 0x6c, 0x9d, 0x34, 0x9e, 0x4d, 0xd3, 0xef, 0xa4, 0x5c,
+ 0x34, 0xb6, 0xe0, 0xc5, 0x25, 0xd4, 0x84, 0x4c, 0xca, 0x40, 0x68, 0x2e,
+ 0x85, 0x66, 0x6e, 0xdd, 0x36, 0x54, 0x5a, 0x8e, 0xa9, 0x61, 0xd2, 0x19,
+ 0xd7, 0xe9, 0x59, 0x79, 0x95, 0xf0, 0x61, 0x6a, 0x2e, 0x2f, 0xff, 0x7a,
+ 0x7e, 0xfc, 0x52, 0xdf, 0x5c, 0xb7, 0x66, 0xcc, 0x98, 0x08, 0xd0, 0x5c,
+ 0x26, 0x0c, 0xc5, 0x9a, 0x43, 0xc3, 0xa2, 0x62, 0xd0, 0x28, 0x98, 0x87,
+ 0x3f, 0x33, 0x48, 0x7e, 0x78, 0x75, 0x32, 0x3a, 0x3f, 0x3d, 0x3b, 0x7a,
+ 0xf9, 0xe2, 0x07, 0x15, 0xc9, 0x5f, 0x50, 0x8c, 0x90, 0xf5, 0x34, 0xfb,
+ 0x33, 0xc7, 0xe8, 0x22, 0xef, 0xbd, 0x3d, 0xfe, 0xfe, 0xbd, 0xb1, 0xc7,
+ 0x5e, 0x52, 0x5d, 0x87, 0xfe, 0x6d, 0x3a, 0x93, 0x97, 0x48, 0x3f, 0x8d,
+ 0xe8, 0x76, 0xc3, 0x36, 0x05, 0x67, 0x77, 0x62, 0x6d, 0x7d, 0x62, 0x97,
+ 0xa8, 0x74, 0xaf, 0x38, 0x5a, 0xaf, 0x14, 0x5d, 0xda, 0xca, 0xab, 0x8f,
+ 0x54, 0x13, 0x77, 0xd7, 0xff, 0x66, 0xc3, 0xa0, 0x6a, 0xc2, 0x10, 0xf9,
+ 0xd0, 0x1c, 0x00, 0xd7, 0xe5, 0x37, 0x0e, 0xd0, 0x2f, 0xfc, 0xe9, 0x15,
+ 0xf9, 0xd1, 0x2c, 0x01, 0xad, 0x94, 0xa8, 0x07, 0xe8, 0x45, 0x58, 0x6a,
+ 0x85, 0x7a, 0x8d, 0x30, 0xf4, 0x9a, 0x4e, 0xa3, 0x72, 0x4c, 0x54, 0x18,
+ 0xdb, 0x97, 0x54, 0x8b, 0x65, 0xa3, 0x22, 0xd7, 0xf9, 0xf1, 0xc5, 0xe8,
+ 0x64, 0x74, 0x49, 0x86, 0xab, 0x54, 0x6e, 0x95, 0x20, 0x94, 0x96, 0xd5,
+ 0x05, 0x69, 0x4b, 0x9b, 0x70, 0xd8, 0xaf, 0x16, 0xd4, 0x3a, 0xd1, 0x56,
+ 0xcc, 0xb5, 0xb3, 0xb8, 0xe9, 0x06, 0xe0, 0xd4, 0x70, 0x52, 0x44, 0x99,
+ 0x36, 0x3b, 0xbd, 0xd2, 0x03, 0x5c, 0xca, 0xd6, 0xe8, 0x14, 0xcd, 0x41,
+ 0xc1, 0x2b, 0xac, 0xce, 0x2c, 0x1f, 0x3b, 0x67, 0x66, 0x07, 0x43, 0x42,
+ 0xf0, 0x24, 0xa1, 0xe8, 0xf1, 0x8f, 0x90, 0x06, 0xc4, 0x1c, 0x35, 0x82,
+ 0x14, 0xf3, 0x96, 0x6b, 0x4d, 0xd2, 0x9a, 0xfd, 0x04, 0x76, 0xeb, 0x96,
+ 0x82, 0xd1, 0xa2, 0x7a, 0x9a, 0xfd, 0xa9, 0x87, 0x42, 0x17, 0xd6, 0x37,
+ 0x10, 0x56, 0x8b, 0xc8, 0x26, 0xa1, 0x9c, 0x73, 0x2a, 0x2a, 0xf9, 0x27,
+ 0x8d, 0xd6, 0x02, 0x6a, 0x0d, 0x00, 0x05, 0x65, 0x64, 0x81, 0x0a, 0x22,
+ 0xaa, 0xe3, 0x35, 0xe5, 0xb0, 0x82, 0x5a, 0x6f, 0x4a, 0xfa, 0x16, 0x5c,
+ 0xf0, 0xfe, 0xc7, 0xf4, 0x3a, 0xa5, 0x19, 0x1c, 0x2f, 0xfd, 0x52, 0x90,
+ 0xb6, 0xf7, 0x5c, 0x95, 0x08, 0x13, 0x0f, 0x88, 0x74, 0x5a, 0xc1, 0x93,
+ 0xd1, 0x48, 0xa9, 0x08, 0x35, 0x7c, 0x04, 0xef, 0x3c, 0x6c, 0xb3, 0x78,
+ 0xe9, 0xbe, 0x54, 0x23, 0x6c, 0xdd, 0x8c, 0x7a, 0xb5, 0x63, 0x69, 0xfb,
+ 0x56, 0x99, 0x02, 0x17, 0xd9, 0xa9, 0x58, 0x53, 0xc4, 0xb1, 0x98, 0xd8,
+ 0xcb, 0x98, 0xb2, 0x0e, 0x09, 0x60, 0x50, 0x09, 0x43, 0x9a, 0x11, 0x7f,
+ 0x14, 0x5a, 0x42, 0xc1, 0x59, 0x54, 0x62, 0xa7, 0xb0, 0xbb, 0xb2, 0x67,
+ 0xba, 0x3c, 0x0e, 0x9e, 0x6e, 0x6f, 0x5b, 0x71, 0x7c, 0xed, 0x5e, 0x3e,
+ 0x68, 0x19, 0x32, 0x74, 0xb1, 0xfa, 0x9c, 0x70, 0x99, 0x22, 0xbf, 0x4f,
+ 0x03, 0x3b, 0x5e, 0x9e, 0x78, 0x2d, 0xd9, 0xf7, 0x16, 0x9f, 0x02, 0x81,
+ 0xd7, 0xaa, 0xba, 0x4d, 0xa3, 0x6b, 0x61, 0x03, 0x8c, 0x7e, 0xb9, 0x40,
+ 0x09, 0xb5, 0x89, 0xd4, 0x90, 0x00, 0x6a, 0xdf, 0x36, 0xa8, 0x97, 0x88,
+ 0x9b, 0x2c, 0x33, 0xab, 0x6f, 0xde, 0x9d, 0x5e, 0x9e, 0x9c, 0xfb, 0xf8,
+ 0x83, 0xe4, 0xfb, 0x93, 0xcb, 0x6f, 0x8c, 0xd6, 0x3e, 0x3a, 0x79, 0xfb,
+ 0xf5, 0x29, 0x05, 0x79, 0xdf, 0xbc, 0x39, 0x7c, 0x4b, 0xf4, 0x22, 0x6f,
+ 0x01, 0x6d, 0x3e, 0x84, 0xe1, 0x40, 0xe2, 0xc8, 0x4c, 0x31, 0xed, 0x1d,
+ 0x22, 0x9e, 0xe8, 0x87, 0xb1, 0xc6, 0xce, 0xf1, 0xe3, 0xaa, 0xea, 0x45,
+ 0x7b, 0x92, 0x68, 0xc5, 0xc5, 0x32, 0xb8, 0x27, 0x37, 0x2e, 0x8e, 0x2d,
+ 0x19, 0x5b, 0x34, 0xd1, 0xdd, 0xe2, 0x11, 0x48, 0x72, 0x66, 0x0d, 0x1d,
+ 0x38, 0x1a, 0xbe, 0xbb, 0x5d, 0xfc, 0x12, 0x2b, 0x6a, 0xa9, 0xa7, 0x61,
+ 0xc7, 0x18, 0x9d, 0xa9, 0x10, 0xbb, 0x86, 0xef, 0xcb, 0x76, 0xd2, 0x91,
+ 0xf9, 0x22, 0xba, 0x04, 0x20, 0x51, 0xe9, 0x1c, 0xe9, 0x64, 0x71, 0x92,
+ 0xd1, 0x7c, 0x71, 0xea, 0x5f, 0xa8, 0xc3, 0x56, 0xcd, 0x41, 0xc5, 0x07,
+ 0x5f, 0x97, 0x99, 0x3b, 0xb9, 0x83, 0x33, 0x6d, 0x46, 0xe3, 0x3f, 0x30,
+ 0xc3, 0xf8, 0x72, 0x19, 0x90, 0x5c, 0x1b, 0x98, 0x25, 0xd9, 0xb6, 0x75,
+ 0xc6, 0xc4, 0xec, 0x3f, 0x60, 0xb5, 0xd2, 0x92, 0xab, 0x6b, 0x79, 0x4e,
+ 0xd3, 0x9c, 0xb6, 0x2c, 0x58, 0x34, 0x24, 0x64, 0x48, 0x5e, 0xa3, 0x8c,
+ 0x19, 0xd2, 0x52, 0x1f, 0x6b, 0xd1, 0x32, 0xf0, 0x7d, 0x77, 0xa6, 0xc1,
+ 0x49, 0xcd, 0x6b, 0xb5, 0x85, 0x1f, 0x1d, 0x74, 0x02, 0xa5, 0x15, 0xe1,
+ 0xae, 0xc8, 0x08, 0xe5, 0x40, 0x7f, 0xfd, 0xdb, 0xe2, 0xda, 0x4f, 0x79,
+ 0xe5, 0xc2, 0xf2, 0x8b, 0xd8, 0xca, 0x0a, 0x93, 0x3b, 0xab, 0x45, 0x52,
+ 0xcc, 0xb2, 0xd5, 0x03, 0xa9, 0x50, 0xb9, 0xb7, 0xea, 0x83, 0xf2, 0xfb,
+ 0xfd, 0xf0, 0xf7, 0xfb, 0x1c, 0x64, 0x38, 0x39, 0xbf, 0x7d, 0x6e, 0x19,
+ 0x90, 0x99, 0xc8, 0xc1, 0x57, 0xdf, 0x54, 0x29, 0xa0, 0x1d, 0x46, 0x8f,
+ 0x8a, 0xcb, 0x9c, 0x65, 0x22, 0x07, 0xff, 0x08, 0x42, 0xba, 0xac, 0x90,
+ 0xa0, 0x8e, 0x47, 0x10, 0x5d, 0x61, 0xdc, 0x3f, 0x3c, 0x4f, 0x90, 0x53,
+ 0x74, 0x5d, 0x99, 0x06, 0xcd, 0xef, 0x9f, 0xda, 0x64, 0x1c, 0x27, 0xd3,
+ 0x50, 0xa4, 0x51, 0xd2, 0x21, 0x07, 0xf9, 0xe2, 0x56, 0xab, 0x7c, 0x9b,
+ 0xbf, 0x3e, 0xb7, 0x05, 0xba, 0xea, 0x56, 0x90, 0xba, 0xc5, 0x36, 0xae,
+ 0xc2, 0x1f, 0x9d, 0x83, 0x0f, 0x8c, 0x24, 0x83, 0x33, 0x32, 0x3a, 0xfd,
+ 0xca, 0xda, 0x19, 0x19, 0x5e, 0x99, 0x62, 0x64, 0x7d, 0xcd, 0x90, 0x1a,
+ 0x0f, 0x79, 0xe4, 0x09, 0x17, 0xbf, 0xd2, 0x87, 0xac, 0xfa, 0x8f, 0xfb,
+ 0xbb, 0xbb, 0x7b, 0x07, 0x7b, 0x9f, 0x7e, 0xb6, 0x7b, 0xb0, 0xb7, 0xb7,
+ 0xb7, 0x7f, 0xb0, 0x77, 0x70, 0xb0, 0xbf, 0xfb, 0xf3, 0x0e, 0xf9, 0x8f,
+ 0x6e, 0xf3, 0xec, 0x4e, 0x23, 0xd3, 0xec, 0xe7, 0xc3, 0xb6, 0xae, 0x9b,
+ 0x7b, 0x06, 0x03, 0xb0, 0xa7, 0x0f, 0xfb, 0x5a, 0x35, 0x1f, 0x4b, 0x2b,
+ 0xc3, 0x39, 0x33, 0x4c, 0x21, 0xb9, 0x70, 0xa9, 0xe6, 0x38, 0x83, 0x1e,
+ 0xcd, 0x3d, 0x7a, 0xf5, 0xf7, 0x25, 0x8d, 0x74, 0x4c, 0xea, 0x00, 0x74,
+ 0x9a, 0xda, 0x26, 0xf6, 0x5e, 0xcf, 0xca, 0xf1, 0x18, 0xa9, 0x4b, 0x36,
+ 0xb7, 0x7d, 0x98, 0x10, 0x97, 0xf2, 0x07, 0xde, 0x12, 0x12, 0x3a, 0x04,
+ 0xaa, 0x98, 0x0f, 0xba, 0x9b, 0x1d, 0xe7, 0xd9, 0x33, 0x3b, 0x60, 0x52,
+ 0x52, 0x5d, 0x11, 0x78, 0xba, 0xcd, 0x24, 0x55, 0x36, 0xe7, 0x2d, 0xb9,
+ 0xca, 0x3e, 0xdd, 0x3d, 0x38, 0xa0, 0xd2, 0x3f, 0x7f, 0xda, 0xeb, 0x0b,
+ 0x20, 0xdc, 0xcf, 0x72, 0xe9, 0xdb, 0xeb, 0x89, 0xdb, 0x20, 0xf3, 0xc3,
+ 0x1f, 0x67, 0xb1, 0x9c, 0x67, 0x95, 0x31, 0x44, 0xa8, 0x78, 0x34, 0x10,
+ 0xd1, 0xf0, 0x18, 0x32, 0xc7, 0x22, 0x18, 0x99, 0x3a, 0xd9, 0x38, 0x74,
+ 0x23, 0x30, 0x57, 0xb4, 0x65, 0xa1, 0x60, 0xbe, 0x30, 0x37, 0x44, 0xdb,
+ 0x36, 0xca, 0x5f, 0x01, 0xac, 0xc9, 0xb9, 0x6c, 0x9c, 0xc5, 0xc7, 0xf7,
+ 0xad, 0x48, 0x06, 0x1c, 0xae, 0x82, 0x4b, 0x1a, 0xd3, 0xe3, 0xac, 0xc3,
+ 0xc3, 0x63, 0xe2, 0x29, 0xb7, 0x92, 0xc0, 0xf7, 0xa3, 0x37, 0xd8, 0xfd,
+ 0x67, 0x7b, 0x3f, 0x33, 0x5e, 0x99, 0x0e, 0x84, 0x9b, 0x35, 0x0d, 0xbe,
+ 0xf8, 0x29, 0x5a, 0xba, 0x91, 0xb6, 0xb2, 0xe1, 0xf5, 0x50, 0xb5, 0x0a,
+ 0xf1, 0x36, 0xf6, 0xfd, 0xac, 0x11, 0xae, 0x53, 0xc0, 0x85, 0xca, 0x61,
+ 0xa7, 0xa9, 0x43, 0xc9, 0x77, 0xd5, 0xea, 0xc0, 0x6c, 0x39, 0xba, 0x37,
+ 0xc7, 0x97, 0x87, 0xe6, 0xf2, 0xf8, 0x36, 0x34, 0xf4, 0xdf, 0x64, 0xc6,
+ 0x2a, 0xa7, 0xc5, 0xde, 0xc2, 0x79, 0xb8, 0xb5, 0xec, 0xe0, 0x34, 0x77,
+ 0x4f, 0x93, 0x2d, 0x0a, 0x51, 0x3e, 0xfb, 0xf4, 0xd9, 0xd3, 0x6d, 0x2e,
+ 0xc5, 0xc2, 0xaf, 0x65, 0x94, 0x20, 0x06, 0xaf, 0xa4, 0xb0, 0x53, 0x91,
+ 0x03, 0xdf, 0x8a, 0xa4, 0x77, 0x17, 0x27, 0x7c, 0xa4, 0x6f, 0x98, 0x44,
+ 0x84, 0x8d, 0xde, 0x2e, 0x9b, 0x24, 0xee, 0x5b, 0x4f, 0xc9, 0x98, 0xe7,
+ 0xc4, 0x74, 0x0a, 0xf2, 0x05, 0xba, 0x18, 0x2d, 0xf9, 0x07, 0x6e, 0x58,
+ 0x73, 0x40, 0x4b, 0x14, 0x28, 0x95, 0xba, 0x6f, 0xe8, 0x0c, 0xa8, 0x51,
+ 0x89, 0x99, 0x59, 0xf6, 0x99, 0xb5, 0xc0, 0xc8, 0x0e, 0x62, 0x79, 0xc4,
+ 0xd2, 0xbf, 0xc3, 0xc6, 0xbf, 0xcd, 0x90, 0x1f, 0x28, 0x85, 0xb4, 0x0d,
+ 0xcd, 0x83, 0x8a, 0x1d, 0xa7, 0x1e, 0xb7, 0xd2, 0x51, 0x9d, 0xb6, 0xe9,
+ 0x91, 0xba, 0x29, 0x9f, 0x93, 0x88, 0x22, 0x3b, 0x85, 0x8c, 0x67, 0x69,
+ 0xe0, 0x59, 0xcc, 0x5b, 0x2e, 0x1f, 0x21, 0xd3, 0x00, 0xa9, 0x05, 0x72,
+ 0x0e, 0xe6, 0xe6, 0x3a, 0xaa, 0xee, 0x45, 0xc3, 0x86, 0x99, 0x60, 0xeb,
+ 0x29, 0x76, 0x10, 0x41, 0x4c, 0x1b, 0xe3, 0xa7, 0xd2, 0x58, 0xd6, 0x24,
+ 0x35, 0x9a, 0x5b, 0x1d, 0x68, 0x89, 0xfd, 0xc1, 0x5c, 0x7f, 0xe5, 0x01,
+ 0xe6, 0xfc, 0xfc, 0x52, 0xfd, 0xbb, 0x3e, 0xe7, 0x61, 0xa9, 0xd3, 0xee,
+ 0xc0, 0x56, 0x74, 0x8d, 0x19, 0x75, 0x81, 0x9f, 0xb4, 0xd6, 0xcf, 0x16,
+ 0x7a, 0xb2, 0xb3, 0xb3, 0xbd, 0xa2, 0x37, 0xf2, 0xeb, 0xd8, 0xd7, 0xcf,
+ 0x41, 0x4a, 0xe4, 0xa5, 0x74, 0x9b, 0x35, 0x6f, 0x37, 0x4e, 0x53, 0x9b,
+ 0xd7, 0xb4, 0x92, 0x53, 0x01, 0xc6, 0xb3, 0x1b, 0x55, 0xcd, 0x2b, 0xee,
+ 0xbc, 0x0a, 0xaf, 0xf6, 0x20, 0x04, 0x8b, 0xa7, 0x24, 0x71, 0x5c, 0x55,
+ 0x9e, 0x51, 0x01, 0xc3, 0xe4, 0x90, 0x76, 0x43, 0xeb, 0xc3, 0x5e, 0x97,
+ 0xd5, 0x9f, 0xab, 0x75, 0x0f, 0x54, 0x89, 0xb5, 0xee, 0xbc, 0xbe, 0xf7,
+ 0x4b, 0x55, 0xf3, 0x94, 0x13, 0xc4, 0x3a, 0x7b, 0xc7, 0x19, 0xf3, 0x1f,
+ 0x59, 0xc9, 0xe9, 0xf1, 0x99, 0xe7, 0x45, 0xab, 0x50, 0xb0, 0x34, 0x02,
+ 0xa4, 0x8b, 0x1d, 0x04, 0xa8, 0x52, 0x2b, 0xa5, 0xe0, 0xf6, 0x8b, 0x87,
+ 0x82, 0x82, 0x44, 0xb2, 0x5a, 0x58, 0xb1, 0xb6, 0x9b, 0x98, 0x41, 0x0a,
+ 0x63, 0xde, 0x5e, 0xad, 0xf9, 0xe8, 0xf3, 0x8e, 0x67, 0x14, 0x93, 0x85,
+ 0x54, 0x90, 0xc0, 0x38, 0x3c, 0x39, 0x25, 0x58, 0xec, 0xa9, 0x31, 0xf1,
+ 0x46, 0xaa, 0x2a, 0x01, 0x26, 0x0e, 0xc0, 0x6e, 0x91, 0x93, 0xba, 0xde,
+ 0xb7, 0x05, 0x87, 0x34, 0x5b, 0x12, 0x76, 0x0b, 0x85, 0x58, 0xd9, 0xf4,
+ 0x17, 0x92, 0x50, 0xb3, 0x5a, 0x46, 0x5f, 0xaa, 0xd9, 0x69, 0x0b, 0x02,
+ 0x6e, 0x2a, 0x4d, 0x71, 0x9b, 0xcd, 0xca, 0x05, 0x4c, 0x6a, 0x16, 0xd3,
+ 0xa8, 0x77, 0x56, 0x65, 0xb3, 0xec, 0x56, 0xbc, 0xab, 0x4c, 0x67, 0xfc,
+ 0xb5, 0x20, 0x16, 0xb8, 0xe0, 0x71, 0x23, 0x59, 0x2d, 0x01, 0x2a, 0x82,
+ 0x3e, 0xba, 0xc3, 0xac, 0x50, 0x8e, 0xec, 0x87, 0xbe, 0xef, 0x8a, 0x70,
+ 0x98, 0x19, 0xb2, 0x45, 0x1c, 0x06, 0x64, 0xe4, 0x0a, 0xb8, 0xfd, 0x5d,
+ 0x2d, 0x7c, 0x2e, 0xdd, 0x6c, 0x11, 0x76, 0x16, 0x6a, 0xcd, 0x4c, 0xf6,
+ 0xbe, 0xf7, 0x95, 0x26, 0x9d, 0x43, 0x06, 0x74, 0xf3, 0xf4, 0xc9, 0x53,
+ 0x8b, 0x96, 0xae, 0x8c, 0x45, 0x46, 0x05, 0x71, 0xfa, 0x9c, 0x3a, 0x8e,
+ 0xcd, 0x51, 0xce, 0xcc, 0x3f, 0x01, 0xa8, 0x64, 0x88, 0xb5, 0x79, 0x96,
+ 0xe2, 0xcd, 0x1e, 0xa6, 0x9d, 0x30, 0x37, 0x48, 0x87, 0x92, 0x7f, 0xa1,
+ 0xa9, 0x6a, 0x09, 0x36, 0xf1, 0x3e, 0xdf, 0x86, 0x14, 0xe7, 0x6d, 0x26,
+ 0x43, 0xdb, 0x7b, 0x41, 0xfd, 0x70, 0xff, 0x5f, 0xf1, 0x54, 0xd2, 0x20,
+ 0x58, 0x0f, 0x29, 0x2b, 0x9d, 0x5e, 0x5e, 0x86, 0x31, 0x97, 0x38, 0xfd,
+ 0x6a, 0x49, 0xf1, 0x47, 0x5b, 0xc0, 0x8b, 0x7a, 0x31, 0xa7, 0xbb, 0x28,
+ 0xe3, 0x6a, 0xc2, 0xb6, 0x71, 0x32, 0xe9, 0x96, 0x66, 0x79, 0xb9, 0xf5,
+ 0xd3, 0xf2, 0x8e, 0x4a, 0x21, 0x5f, 0x5d, 0xe5, 0x13, 0x8a, 0xfd, 0x3b,
+ 0xd6, 0x70, 0x92, 0xf1, 0xfc, 0xe0, 0x5c, 0xab, 0xaf, 0x99, 0xb1, 0x25,
+ 0x8b, 0xe5, 0x78, 0x66, 0x2e, 0x6b, 0xcd, 0x67, 0x31, 0xa7, 0x0a, 0xb3,
+ 0x64, 0xac, 0x2d, 0x34, 0xc7, 0xf4, 0x86, 0x30, 0x38, 0x3b, 0x39, 0x14,
+ 0x08, 0x97, 0x56, 0x50, 0xc1, 0xe7, 0xa8, 0x09, 0x4d, 0x89, 0x06, 0xf3,
+ 0xb2, 0xd0, 0x74, 0xb8, 0x65, 0xcd, 0x74, 0xb2, 0x88, 0xe6, 0x70, 0x95,
+ 0xac, 0x04, 0x4f, 0x4a, 0xd1, 0x06, 0x31, 0xcd, 0xf1, 0x86, 0x3f, 0x98,
+ 0xe9, 0x60, 0x71, 0xb3, 0xd0, 0x95, 0x56, 0x85, 0x88, 0xb5, 0x25, 0x49,
+ 0xc0, 0xc2, 0xd1, 0x3b, 0xff, 0xe6, 0x7c, 0x98, 0x1c, 0x53, 0x4b, 0xdc,
+ 0x27, 0x51, 0x74, 0xe1, 0xa3, 0x31, 0xbf, 0x33, 0x83, 0xbd, 0xa6, 0x0b,
+ 0xec, 0xac, 0xa2, 0x7f, 0xa1, 0x35, 0xf9, 0x25, 0xbb, 0x65, 0xf1, 0xdb,
+ 0xf6, 0x57, 0x4d, 0x43, 0x9a, 0x66, 0x71, 0x8e, 0xbf, 0x9b, 0xb3, 0x62,
+ 0xd4, 0x2f, 0xbb, 0x4c, 0xee, 0x0b, 0x65, 0xd5, 0x22, 0xdf, 0xe2, 0x37,
+ 0x13, 0xa3, 0x95, 0x41, 0xb7, 0x5a, 0xdc, 0x63, 0xfd, 0x3c, 0xe1, 0xc8,
+ 0xfa, 0x27, 0x37, 0xe0, 0x6d, 0x2d, 0xd9, 0x7e, 0x16, 0xc0, 0xcb, 0x07,
+ 0xab, 0x62, 0xda, 0xa9, 0x2a, 0x13, 0xb8, 0x73, 0x29, 0x81, 0x69, 0xf6,
+ 0x68, 0xd4, 0x59, 0xe7, 0xbc, 0x7a, 0xf6, 0x9b, 0xfe, 0x82, 0xcc, 0x6e,
+ 0xea, 0x8b, 0xd1, 0x5a, 0xcc, 0x12, 0x0c, 0x37, 0xfe, 0xbf, 0xd5, 0x8d,
+ 0xb2, 0x33, 0x56, 0xf8, 0x02, 0x00,
};
#define BUF_SIZE 0x10000
static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
diff --git a/src/tool_main.c b/src/tool_main.c
index 089a317..4e78d33 100644
--- a/src/tool_main.c
+++ b/src/tool_main.c
@@ -62,6 +62,15 @@
int vms_show = 0;
#endif
+#ifdef __MINGW32__
+/*
+ * There seems to be no way to escape "*" in command-line arguments with MinGW
+ * when command-line argument globbing is enabled under the MSYS shell, so turn
+ * it off.
+ */
+int _CRT_glob = 0;
+#endif /* __MINGW32__ */
+
/* if we build a static library for unit tests, there is no main() function */
#ifndef UNITTESTS
diff --git a/src/tool_metalink.c b/src/tool_metalink.c
index 3f66c74..bbbfc2a 100644
--- a/src/tool_metalink.c
+++ b/src/tool_metalink.c
@@ -30,6 +30,8 @@
# include <fcntl.h>
#endif
+#undef HAVE_NSS_CONTEXT
+
#ifdef USE_OPENSSL
# include <openssl/md5.h>
# include <openssl/sha.h>
@@ -50,6 +52,7 @@
# define MD5_CTX void *
# define SHA_CTX void *
# define SHA256_CTX void *
+# define HAVE_NSS_CONTEXT
static NSSInitContext *nss_context;
#elif defined(USE_POLARSSL)
# include <polarssl/md5.h>
@@ -117,7 +120,9 @@ struct win32_crypto_hash {
return PARAM_NO_MEM; \
} WHILE_FALSE
-#ifdef USE_GNUTLS_NETTLE
+#if defined(USE_OPENSSL)
+/* Functions are already defined */
+#elif defined(USE_GNUTLS_NETTLE)
static int MD5_Init(MD5_CTX *ctx)
{
@@ -375,7 +380,7 @@ static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx)
sha256_finish(ctx, digest);
}
-#elif defined(_WIN32) && !defined(USE_OPENSSL)
+#elif defined(_WIN32)
static void win32_crypto_final(struct win32_crypto_hash *ctx,
unsigned char *digest,
@@ -534,6 +539,7 @@ digest_context *Curl_digest_init(const digest_params *dparams)
ctxt->digest_hash = dparams;
if(dparams->digest_init(ctxt->digest_hashctx) != 1) {
+ free(ctxt->digest_hashctx);
free(ctxt);
return NULL;
}
@@ -552,7 +558,8 @@ int Curl_digest_update(digest_context *context,
int Curl_digest_final(digest_context *context, unsigned char *result)
{
- (*context->digest_hash->digest_final)(result, context->digest_hashctx);
+ if(result)
+ (*context->digest_hash->digest_final)(result, context->digest_hashctx);
free(context->digest_hashctx);
free(context);
@@ -617,6 +624,7 @@ static int check_hash(const char *filename,
result = malloc(digest_def->dparams->digest_resultlen);
if(!result) {
close(fd);
+ Curl_digest_final(dctx, NULL);
return -1;
}
while(1) {
@@ -678,13 +686,15 @@ static metalink_checksum *new_metalink_checksum_from_hex_digest
return 0;
for(i = 0; i < len; i += 2) {
- digest[i/2] = hex_to_uint(hex_digest+i);
+ digest[i/2] = hex_to_uint(hex_digest + i);
}
chksum = malloc(sizeof(metalink_checksum));
if(chksum) {
chksum->digest_def = digest_def;
chksum->digest = digest;
}
+ else
+ free(digest);
return chksum;
}
@@ -776,8 +786,24 @@ static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo)
curl_strequal((*p)->type, "ftp") ||
curl_strequal((*p)->type, "ftps")) {
res = new_metalink_resource((*p)->url);
- tail->next = res;
- tail = res;
+ if(res) {
+ tail->next = res;
+ tail = res;
+ }
+ else {
+ tail = root.next;
+
+ /* clean up the linked list */
+ while(tail) {
+ res = tail->next;
+ free(tail->url);
+ free(tail);
+ tail = res;
+ }
+ free(f->filename);
+ free(f);
+ return NULL;
+ }
}
}
f->resource = root.next;
@@ -880,7 +906,7 @@ size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb,
if(!config)
return failure;
- rv = metalink_parse_update(outs->metalink_parser, buffer, sz *nmemb);
+ rv = metalink_parse_update(outs->metalink_parser, buffer, sz * nmemb);
if(rv == 0)
return sz * nmemb;
else {
@@ -901,8 +927,8 @@ static int check_content_type(const char *content_type, const char *media_type)
return 0;
}
return curl_strnequal(ptr, media_type, media_type_len) &&
- (*(ptr+media_type_len) == '\0' || *(ptr+media_type_len) == ' ' ||
- *(ptr+media_type_len) == '\t' || *(ptr+media_type_len) == ';');
+ (*(ptr + media_type_len) == '\0' || *(ptr + media_type_len) == ' ' ||
+ *(ptr + media_type_len) == '\t' || *(ptr + media_type_len) == ';');
}
int check_metalink_content_type(const char *content_type)
@@ -965,7 +991,7 @@ void clean_metalink(struct OperationConfig *config)
void metalink_cleanup(void)
{
-#ifdef USE_NSS
+#ifdef HAVE_NSS_CONTEXT
if(nss_context) {
NSS_ShutdownContext(nss_context);
nss_context = NULL;
diff --git a/src/tool_mfiles.c b/src/tool_mfiles.c
deleted file mode 100644
index d862d41..0000000
--- a/src/tool_mfiles.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "tool_setup.h"
-
-#include "tool_mfiles.h"
-
-#include "memdebug.h" /* keep this as LAST include */
-
-static void AppendNode(struct multi_files **first,
- struct multi_files **last,
- struct multi_files *new)
-{
- DEBUGASSERT(((*first) && (*last)) || ((!*first) && (!*last)));
-
- if(*last)
- (*last)->next = new;
- else
- *first = new;
- *last = new;
-}
-
-/*
- * AddMultiFiles: Add a new list node possibly followed with a type_name.
- *
- * multi_first argument is the address of a pointer to the first element
- * of the multi_files linked list. A NULL pointer indicates empty list.
- *
- * multi_last argument is the address of a pointer to the last element
- * of the multi_files linked list. A NULL pointer indicates empty list.
- *
- * Pointers stored in multi_first and multi_last are modified while
- * function is executed. An out of memory condition free's the whole
- * list and returns with pointers stored in multi_first and multi_last
- * set to NULL and a NULL function result.
- *
- * Function returns same pointer as stored at multi_last.
- */
-
-struct multi_files *AddMultiFiles(const char *file_name,
- const char *type_name,
- const char *show_filename,
- struct multi_files **multi_first,
- struct multi_files **multi_last)
-{
- struct multi_files *multi;
- struct multi_files *multi_type;
- struct multi_files *multi_name;
-
- multi = calloc(1, sizeof(struct multi_files));
- if(multi) {
- multi->form.option = CURLFORM_FILE;
- multi->form.value = file_name;
- AppendNode(multi_first, multi_last, multi);
- }
- else {
- FreeMultiInfo(multi_first, multi_last);
- return NULL;
- }
-
- if(type_name) {
- multi_type = calloc(1, sizeof(struct multi_files));
- if(multi_type) {
- multi_type->form.option = CURLFORM_CONTENTTYPE;
- multi_type->form.value = type_name;
- AppendNode(multi_first, multi_last, multi_type);
- }
- else {
- FreeMultiInfo(multi_first, multi_last);
- return NULL;
- }
- }
-
- if(show_filename) {
- multi_name = calloc(1, sizeof(struct multi_files));
- if(multi_name) {
- multi_name->form.option = CURLFORM_FILENAME;
- multi_name->form.value = show_filename;
- AppendNode(multi_first, multi_last, multi_name);
- }
- else {
- FreeMultiInfo(multi_first, multi_last);
- return NULL;
- }
- }
-
- return *multi_last;
-}
-
-/*
- * FreeMultiInfo: Free the items of the list.
- */
-
-void FreeMultiInfo(struct multi_files **multi_first,
- struct multi_files **multi_last)
-{
- struct multi_files *next;
- struct multi_files *item = *multi_first;
-
- while(item) {
- next = item->next;
- Curl_safefree(item);
- item = next;
- }
- *multi_first = NULL;
- if(multi_last)
- *multi_last = NULL;
-}
-
diff --git a/src/tool_msgs.c b/src/tool_msgs.c
index d06708a..07bf812 100644
--- a/src/tool_msgs.c
+++ b/src/tool_msgs.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -63,7 +63,7 @@ static void voutf(struct GlobalConfig *config,
(void)fwrite(ptr, cut + 1, 1, config->errors);
fputs("\n", config->errors);
- ptr += cut+1; /* skip the space too */
+ ptr += cut + 1; /* skip the space too */
len -= cut;
}
else {
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 1e8d007..5401955 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -92,21 +92,12 @@ CURLcode curl_easy_perform_ev(CURL *easy);
# define O_BINARY 0
#endif
-#define CURL_CA_CERT_ERRORMSG1 \
- "More details here: https://curl.haxx.se/docs/sslcerts.html\n\n" \
- "curl performs SSL certificate verification by default, " \
- "using a \"bundle\"\n" \
- " of Certificate Authority (CA) public keys (CA certs). If the default\n" \
- " bundle file isn't adequate, you can specify an alternate file\n" \
- " using the --cacert option.\n"
-
-#define CURL_CA_CERT_ERRORMSG2 \
- "If this HTTPS server uses a certificate signed by a CA represented in\n" \
- " the bundle, the certificate verification probably failed due to a\n" \
- " problem with the certificate (it might be expired, or the name might\n" \
- " not match the domain name in the URL).\n" \
- "If you'd like to turn off curl's verification of the certificate, use\n" \
- " the -k (or --insecure) option.\n"
+#define CURL_CA_CERT_ERRORMSG \
+ "More details here: https://curl.haxx.se/docs/sslcerts.html\n\n" \
+ "curl failed to verify the legitimacy of the server and therefore " \
+ "could not\nestablish a secure connection to it. To learn more about " \
+ "this situation and\nhow to fix it, please visit the web page mentioned " \
+ "above.\n"
static bool is_fatal_error(CURLcode code)
{
@@ -184,7 +175,7 @@ static curl_off_t VmsSpecialSize(const char *name,
#endif /* __VMS */
#if defined(HAVE_UTIME) || \
- (defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8))
+ (defined(WIN32) && (SIZEOF_CURL_OFF_T >= 8))
static void setfiletime(long filetime, const char *filename,
FILE *error_stream)
{
@@ -192,10 +183,10 @@ static void setfiletime(long filetime, const char *filename,
/* Windows utime() may attempt to adjust our unix gmt 'filetime' by a daylight
saving time offset and since it's GMT that is bad behavior. When we have
access to a 64-bit type we can bypass utime and set the times directly. */
-#if defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8)
+#if defined(WIN32) && (SIZEOF_CURL_OFF_T >= 8)
HANDLE hfile;
-#if (CURL_SIZEOF_LONG >= 8)
+#if (SIZEOF_LONG >= 8)
/* 910670515199 is the maximum unix filetime that can be used as a
Windows FILETIME without overflow: 30827-12-31T23:59:59. */
if(filetime > CURL_OFF_T_C(910670515199)) {
@@ -204,7 +195,7 @@ static void setfiletime(long filetime, const char *filename,
filetime);
return;
}
-#endif /* CURL_SIZEOF_LONG >= 8 */
+#endif /* SIZEOF_LONG >= 8 */
hfile = CreateFileA(filename, FILE_WRITE_ATTRIBUTES,
(FILE_SHARE_READ | FILE_SHARE_WRITE |
@@ -254,7 +245,7 @@ static void setfiletime(long filetime, const char *filename,
}
}
#endif /* defined(HAVE_UTIME) || \
- (defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8)) */
+ (defined(WIN32) && (SIZEOF_CURL_OFF_T >= 8)) */
#define BUFFER_SIZE (100*1024)
@@ -534,7 +525,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
urlnum = 1; /* without globbing, this is a single URL */
/* if multiple files extracted to stdout, insert separators! */
- separator= ((!outfiles || !strcmp(outfiles, "-")) && urlnum > 1);
+ separator = ((!outfiles || !strcmp(outfiles, "-")) && urlnum > 1);
/* Here's looping around each globbed URL */
for(li = 0 ; li < urlnum; li++) {
@@ -809,7 +800,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
if(urlnum > 1 && !global->mute) {
fprintf(global->errors, "\n[%lu/%lu]: %s --> %s\n",
- li+1, urlnum, this_url, outfile ? outfile : "<stdout>");
+ li + 1, urlnum, this_url, outfile ? outfile : "<stdout>");
if(separator)
printf("%s%s\n", CURLseparator, this_url);
}
@@ -831,7 +822,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
if(strchr(pc, '?'))
/* Ouch, there's already a question mark in the URL string, we
then append the data with an ampersand separator instead! */
- sep='&';
+ sep = '&';
}
/*
* Then append ? followed by the get fields to the url.
@@ -995,6 +986,31 @@ static CURLcode operate_do(struct GlobalConfig *global,
my_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer);
my_setopt(curl, CURLOPT_TIMEOUT_MS, (long)(config->timeout * 1000));
+ switch(config->httpreq) {
+ case HTTPREQ_SIMPLEPOST:
+ my_setopt_str(curl, CURLOPT_POSTFIELDS,
+ config->postfields);
+ my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,
+ config->postfieldsize);
+ break;
+ case HTTPREQ_MIMEPOST:
+ my_setopt_mimepost(curl, CURLOPT_MIMEPOST, config->mimepost);
+ break;
+ default:
+ break;
+ }
+
+ /* new in libcurl 7.10.6 (default is Basic) */
+ if(config->authtype)
+ my_setopt_bitmask(curl, CURLOPT_HTTPAUTH, (long)config->authtype);
+
+ my_setopt_slist(curl, CURLOPT_HTTPHEADER, config->headers);
+
+ if(built_in_protos & (CURLPROTO_HTTP | CURLPROTO_RTSP)) {
+ my_setopt_str(curl, CURLOPT_REFERER, config->referer);
+ my_setopt_str(curl, CURLOPT_USERAGENT, config->useragent);
+ }
+
if(built_in_protos & CURLPROTO_HTTP) {
long postRedir = 0;
@@ -1004,24 +1020,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
my_setopt(curl, CURLOPT_UNRESTRICTED_AUTH,
config->unrestricted_auth?1L:0L);
- switch(config->httpreq) {
- case HTTPREQ_SIMPLEPOST:
- my_setopt_str(curl, CURLOPT_POSTFIELDS,
- config->postfields);
- my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,
- config->postfieldsize);
- break;
- case HTTPREQ_FORMPOST:
- my_setopt_httppost(curl, CURLOPT_HTTPPOST, config->httppost);
- break;
- default:
- break;
- }
-
- my_setopt_str(curl, CURLOPT_REFERER, config->referer);
my_setopt(curl, CURLOPT_AUTOREFERER, config->autoreferer?1L:0L);
- my_setopt_str(curl, CURLOPT_USERAGENT, config->useragent);
- my_setopt_slist(curl, CURLOPT_HTTPHEADER, config->headers);
/* new in libcurl 7.36.0 */
if(config->proxyheaders) {
@@ -1038,10 +1037,6 @@ static CURLcode operate_do(struct GlobalConfig *global,
my_setopt_enum(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
}
- /* new in libcurl 7.10.6 (default is Basic) */
- if(config->authtype)
- my_setopt_bitmask(curl, CURLOPT_HTTPAUTH, (long)config->authtype);
-
/* curl 7.19.1 (the 301 version existed in 7.18.2),
303 was added in 7.26.0 */
if(config->post301)
@@ -1091,6 +1086,10 @@ static CURLcode operate_do(struct GlobalConfig *global,
to fail if we are not talking to who we think we should */
my_setopt_str(curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
config->hostpubmd5);
+
+ /* new in libcurl 7.56.0 */
+ if(config->ssh_compression)
+ my_setopt(curl, CURLOPT_SSH_COMPRESSION, 1L);
}
if(config->cacert)
@@ -1673,6 +1672,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
retry_sleep = RETRY_SLEEP_MAX;
}
if(outs.bytes && outs.filename && outs.stream) {
+ int rc;
/* We have written data to a output file, we truncate file
*/
if(!global->mute)
@@ -1693,14 +1693,21 @@ static CURLcode operate_do(struct GlobalConfig *global,
}
/* now seek to the end of the file, the position where we
just truncated the file in a large file-safe way */
- fseek(outs.stream, 0, SEEK_END);
+ rc = fseek(outs.stream, 0, SEEK_END);
#else
/* ftruncate is not available, so just reposition the file
to the location we would have truncated it. This won't
work properly with large files on 32-bit systems, but
most of those will have ftruncate. */
- fseek(outs.stream, (long)outs.init, SEEK_SET);
+ rc = fseek(outs.stream, (long)outs.init, SEEK_SET);
#endif
+ if(rc) {
+ if(!global->mute)
+ fprintf(global->errors,
+ "failed seeking to end of file, exiting\n");
+ result = CURLE_WRITE_ERROR;
+ goto quit_urls;
+ }
outs.bytes = 0; /* clear for next round */
}
continue; /* curl_easy_perform loop */
@@ -1780,12 +1787,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
fprintf(global->errors, "curl: (%d) %s\n", result, (errorbuffer[0]) ?
errorbuffer : curl_easy_strerror(result));
if(result == CURLE_SSL_CACERT)
- fprintf(global->errors, "%s%s%s",
- CURL_CA_CERT_ERRORMSG1, CURL_CA_CERT_ERRORMSG2,
- ((curlinfo->features & CURL_VERSION_HTTPS_PROXY) ?
- "HTTPS-proxy has similar options --proxy-cacert "
- "and --proxy-insecure.\n" :
- ""));
+ fputs(CURL_CA_CERT_ERRORMSG, global->errors);
}
/* Fall through comment to 'quit_urls' label */
@@ -1840,7 +1842,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
#endif
#if defined(HAVE_UTIME) || \
- (defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8))
+ (defined(WIN32) && (SIZEOF_CURL_OFF_T >= 8))
/* File time can only be set _after_ the file has been closed */
if(!result && config->remote_time && outs.s_isreg && outs.filename) {
/* Ask libcurl if we got a remote file time */
@@ -1850,7 +1852,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
setfiletime(filetime, outs.filename, config->global->errors);
}
#endif /* defined(HAVE_UTIME) || \
- (defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8)) */
+ (defined(WIN32) && (SIZEOF_CURL_OFF_T >= 8)) */
#ifdef USE_METALINK
if(!metalink && config->use_metalink && result == CURLE_OK) {
diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c
index 85c5e79..7cddf51 100644
--- a/src/tool_paramhlp.c
+++ b/src/tool_paramhlp.c
@@ -73,13 +73,13 @@ ParameterError file2string(char **bufp, FILE *file)
if(ptr)
*ptr = '\0';
buflen = strlen(buffer);
- ptr = realloc(string, stringlen+buflen+1);
+ ptr = realloc(string, stringlen + buflen + 1);
if(!ptr) {
Curl_safefree(string);
return PARAM_NO_MEM;
}
string = ptr;
- strcpy(string+stringlen, buffer);
+ strcpy(string + stringlen, buffer);
stringlen += buflen;
}
}
@@ -99,27 +99,27 @@ ParameterError file2memory(char **bufp, size_t *size, FILE *file)
do {
if(!buffer || (alloc == nused)) {
/* size_t overflow detection for huge files */
- if(alloc+1 > ((size_t)-1)/2) {
+ if(alloc + 1 > ((size_t)-1)/2) {
Curl_safefree(buffer);
return PARAM_NO_MEM;
}
alloc *= 2;
/* allocate an extra char, reserved space, for null termination */
- newbuf = realloc(buffer, alloc+1);
+ newbuf = realloc(buffer, alloc + 1);
if(!newbuf) {
Curl_safefree(buffer);
return PARAM_NO_MEM;
}
buffer = newbuf;
}
- nread = fread(buffer+nused, 1, alloc-nused, file);
+ nread = fread(buffer + nused, 1, alloc-nused, file);
nused += nread;
} while(nread);
/* null terminate the buffer in case it's used as a string later */
buffer[nused] = '\0';
/* free trailing slack space, if possible */
if(alloc != nused) {
- newbuf = realloc(buffer, nused+1);
+ newbuf = realloc(buffer, nused + 1);
if(!newbuf) {
Curl_safefree(buffer);
return PARAM_NO_MEM;
@@ -242,14 +242,16 @@ static ParameterError str2double(double *val, const char *str, long max)
* data.
*/
-ParameterError str2udouble(double *val, const char *str, long max)
+ParameterError str2udouble(double *valp, const char *str, long max)
{
- ParameterError result = str2double(val, str, max);
+ double value;
+ ParameterError result = str2double(&value, str, max);
if(result != PARAM_OK)
return result;
- if(*val < 0)
+ if(value < 0)
return PARAM_NEGATIVE_NUMERIC;
+ *valp = value;
return PARAM_OK;
}
@@ -334,7 +336,7 @@ long proto2num(struct OperationConfig *config, long *val, const char *str)
}
}
- for(pp=protos; pp->name; pp++) {
+ for(pp = protos; pp->name; pp++) {
if(curl_strequal(token, pp->name)) {
switch(action) {
case deny:
@@ -399,10 +401,14 @@ ParameterError str2offset(curl_off_t *val, const char *str)
/* offsets aren't negative, this indicates weird input */
return PARAM_NEGATIVE_NUMERIC;
-#if(CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG)
- *val = curlx_strtoofft(str, &endptr, 0);
- if((*val == CURL_OFF_T_MAX || *val == CURL_OFF_T_MIN) && (errno == ERANGE))
- return PARAM_NUMBER_TOO_LARGE;
+#if(SIZEOF_CURL_OFF_T > SIZEOF_LONG)
+ {
+ CURLofft offt = curlx_strtoofft(str, &endptr, 0, val);
+ if(CURL_OFFT_FLOW == offt)
+ return PARAM_NUMBER_TOO_LARGE;
+ else if(CURL_OFFT_INVAL == offt)
+ return PARAM_BAD_NUMERIC;
+ }
#else
errno = 0;
*val = strtol(str, &endptr, 0);
@@ -470,7 +476,7 @@ static CURLcode checkpasswd(const char *kind, /* for what purpose */
/* append the password separated with a colon */
passptr[userlen] = ':';
- memcpy(&passptr[userlen+1], passwd, passwdlen+1);
+ memcpy(&passptr[userlen + 1], passwd, passwdlen + 1);
*userpwd = passptr;
}
diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c
index 93814f4..540bdb1 100644
--- a/src/tool_parsecfg.c
+++ b/src/tool_parsecfg.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -131,7 +131,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
while(NULL != (aline = my_get_line(file))) {
lineno++;
line = aline;
- alloced_param=FALSE;
+ alloced_param = FALSE;
/* line with # in the first non-blank column is a comment! */
while(*line && ISSPACE(*line))
diff --git a/src/tool_sdecls.h b/src/tool_sdecls.h
index a56390e..48dd4ae 100644
--- a/src/tool_sdecls.h
+++ b/src/tool_sdecls.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -135,7 +135,7 @@ typedef enum {
HTTPREQ_UNSPEC, /* first in list */
HTTPREQ_GET,
HTTPREQ_HEAD,
- HTTPREQ_FORMPOST,
+ HTTPREQ_MIMEPOST,
HTTPREQ_SIMPLEPOST
} HttpReq;
diff --git a/src/tool_setopt.c b/src/tool_setopt.c
index 694d3ff..fb2cb66 100644
--- a/src/tool_setopt.c
+++ b/src/tool_setopt.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,7 +30,9 @@
#include "tool_cfgable.h"
#include "tool_easysrc.h"
#include "tool_setopt.h"
+#include "tool_convert.h"
+#include "mime.h"
#include "memdebug.h" /* keep this as LAST include */
/* Lookup tables for converting setopt values back to symbols */
@@ -208,37 +210,43 @@ static const NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
/* Escape string to C string syntax. Return NULL if out of memory.
* Is this correct for those wacky EBCDIC guys? */
-static char *c_escape(const char *str)
+static char *c_escape(const char *str, size_t len)
{
- size_t len = 0;
const char *s;
unsigned char c;
char *escaped, *e;
+
+ if(len == CURL_ZERO_TERMINATED)
+ len = strlen(str);
+
+ /* Check for possible overflow. */
+ if(len > (~(size_t) 0) / 4)
+ return NULL;
+
/* Allocate space based on worst-case */
- len = strlen(str);
escaped = malloc(4 * len + 1);
if(!escaped)
return NULL;
e = escaped;
- for(s=str; (c=*s) != '\0'; s++) {
- if(c=='\n') {
+ for(s = str; (c = *s) != '\0'; s++) {
+ if(c == '\n') {
strcpy(e, "\\n");
e += 2;
}
- else if(c=='\r') {
+ else if(c == '\r') {
strcpy(e, "\\r");
e += 2;
}
- else if(c=='\t') {
+ else if(c == '\t') {
strcpy(e, "\\t");
e += 2;
}
- else if(c=='\\') {
+ else if(c == '\\') {
strcpy(e, "\\\\");
e += 2;
}
- else if(c=='"') {
+ else if(c == '"') {
strcpy(e, "\\\"");
e += 2;
}
@@ -268,7 +276,7 @@ CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config,
if(config->libcurl && !skip && !ret) {
/* we only use this for real if --libcurl was used */
const NameValue *nv = NULL;
- for(nv=nvlist; nv->name; nv++) {
+ for(nv = nvlist; nv->name; nv++) {
if(nv->value == lval) break; /* found it */
}
if(! nv->name) {
@@ -305,7 +313,7 @@ CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config,
const NameValue *nv = NULL;
snprintf(preamble, sizeof(preamble),
"curl_easy_setopt(hnd, %s, ", name);
- for(nv=nvlist; nv->name; nv++) {
+ for(nv = nvlist; nv->name; nv++) {
if((nv->value & ~ rest) == 0) {
/* all value flags contained in rest */
rest &= ~ nv->value; /* remove bits handled here */
@@ -348,7 +356,7 @@ CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
const NameValueUnsigned *nv = NULL;
snprintf(preamble, sizeof(preamble),
"curl_easy_setopt(hnd, %s, ", name);
- for(nv=nvlist; nv->name; nv++) {
+ for(nv = nvlist; nv->name; nv++) {
if((nv->value & ~ rest) == 0) {
/* all value flags contained in rest */
rest &= ~ nv->value; /* remove bits handled here */
@@ -371,118 +379,225 @@ CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
return ret;
}
-/* setopt wrapper for CURLOPT_HTTPPOST */
-CURLcode tool_setopt_httppost(CURL *curl, struct GlobalConfig *config,
- const char *name, CURLoption tag,
- struct curl_httppost *post)
+/* Generate code for a struct curl_slist. */
+static CURLcode libcurl_generate_slist(struct curl_slist *slist, int *slistno)
{
CURLcode ret = CURLE_OK;
char *escaped = NULL;
- bool skip = FALSE;
- ret = curl_easy_setopt(curl, tag, post);
- if(!post)
- skip = TRUE;
+ /* May need several slist variables, so invent name */
+ *slistno = ++easysrc_slist_count;
+
+ DECL1("struct curl_slist *slist%d;", *slistno);
+ DATA1("slist%d = NULL;", *slistno);
+ CLEAN1("curl_slist_free_all(slist%d);", *slistno);
+ CLEAN1("slist%d = NULL;", *slistno);
+ for(; slist; slist = slist->next) {
+ Curl_safefree(escaped);
+ escaped = c_escape(slist->data, CURL_ZERO_TERMINATED);
+ if(!escaped)
+ return CURLE_OUT_OF_MEMORY;
+ DATA3("slist%d = curl_slist_append(slist%d, \"%s\");",
+ *slistno, *slistno, escaped);
+ }
- if(config->libcurl && !skip && !ret) {
- struct curl_httppost *pp, *p;
- int i;
- /* May use several httppost lists, if multiple POST actions */
- i = ++ easysrc_form_count;
- DECL1("struct curl_httppost *post%d;", i);
- DATA1("post%d = NULL;", i);
- CLEAN1("curl_formfree(post%d);", i);
- CLEAN1("post%d = NULL;", i);
- if(i == 1)
- DECL0("struct curl_httppost *postend;");
- DATA0("postend = NULL;");
- for(p=post; p; p=p->next) {
- DATA1("curl_formadd(&post%d, &postend,", i);
- DATA1(" CURLFORM_COPYNAME, \"%s\",", p->name);
- for(pp=p; pp; pp=pp->more) {
- /* May be several files uploaded for one name;
- * these are linked through the 'more' pointer */
+ nomem:
+ Curl_safefree(escaped);
+ return ret;
+}
+
+/* Generate source code for a mime structure. */
+static CURLcode libcurl_generate_mime(curl_mime *mime, int *mimeno)
+{
+ CURLcode ret = CURLE_OK;
+ int i;
+ curl_off_t size;
+ curl_mimepart *part;
+ char *filename;
+ char *escaped = NULL;
+ char *cp;
+ char *data;
+
+ /* May need several mime variables, so invent name */
+ *mimeno = ++easysrc_mime_count;
+
+ DECL1("curl_mime *mime%d;", *mimeno);
+ DATA1("mime%d = NULL;", *mimeno);
+ CODE1("mime%d = curl_mime_init(hnd);", *mimeno);
+ CLEAN1("curl_mime_free(mime%d);", *mimeno);
+ CLEAN1("mime%d = NULL;", *mimeno);
+ if(mime->firstpart) {
+ DECL1("curl_mimepart *part%d;", *mimeno);
+ for(part = mime->firstpart; part; part = part->nextpart) {
+ CODE2("part%d = curl_mime_addpart(mime%d);", *mimeno, *mimeno);
+ filename = part->filename;
+ switch(part->kind) {
+ case MIMEKIND_FILE:
Curl_safefree(escaped);
- escaped = c_escape(pp->contents);
- if(!escaped) {
- ret = CURLE_OUT_OF_MEMORY;
- goto nomem;
- }
- if(pp->flags & CURL_HTTPPOST_FILENAME) {
- /* file upload as for -F @filename */
- DATA1(" CURLFORM_FILE, \"%s\",", escaped);
+ escaped = c_escape(part->data, CURL_ZERO_TERMINATED);
+ if(!escaped)
+ return CURLE_OUT_OF_MEMORY;
+ CODE2("curl_mime_filedata(part%d, \"%s\");", *mimeno, escaped);
+ if(!filename)
+ CODE1("curl_mime_filename(part%d, NULL);", *mimeno);
+ else {
+ /* Fast check to see if remote file name is base name. */
+ filename = part->data;
+ for(cp = filename; *cp; cp++)
+ if(*cp == '/' || *cp == '\\')
+ filename = cp + 1;
+ if(!part->filename || !strcmp(filename, part->filename))
+ filename = NULL;
+ else
+ filename = part->filename;
}
- else if(pp->flags & CURL_HTTPPOST_READFILE) {
- /* content from file as for -F <filename */
- DATA1(" CURLFORM_FILECONTENT, \"%s\",", escaped);
- }
- else
- DATA1(" CURLFORM_COPYCONTENTS, \"%s\",", escaped);
- if(pp->showfilename) {
- Curl_safefree(escaped);
- escaped = c_escape(pp->showfilename);
- if(!escaped) {
+ break;
+ case MIMEKIND_CALLBACK:
+ /* Can only be reading stdin in the current context. */
+ CODE1("curl_mime_data_cb(part%d, -1, (curl_read_callback) fread, \\",
+ *mimeno);
+ CODE0(" (curl_seek_callback) fseek, NULL, stdin);");
+ break;
+ case MIMEKIND_DATA:
+#ifdef CURL_DOES_CONVERSIONS
+ /* Data is stored in ASCII and we want in in the host character
+ code. Convert it back for output. */
+ data = malloc(part->datasize + 1);
+ if(!data) {
ret = CURLE_OUT_OF_MEMORY;
goto nomem;
}
- DATA1(" CURLFORM_FILENAME, \"%s\",", escaped);
- }
- if(pp->contenttype) {
- Curl_safefree(escaped);
- escaped = c_escape(pp->contenttype);
- if(!escaped) {
- ret = CURLE_OUT_OF_MEMORY;
+ memcpy(data, part->data, part->datasize + 1);
+ ret = convert_from_network(data, strlen(data));
+ if(ret) {
+ Curl_safefree(data);
goto nomem;
}
- DATA1(" CURLFORM_CONTENTTYPE, \"%s\",", escaped);
- }
+#else
+ data = part->data;
+#endif
+
+ /* Are there any nul byte in data? */
+ for(cp = data; *cp; cp++)
+ ;
+ size = (cp == data + part->datasize)? (curl_off_t) -1: part->datasize;
+ Curl_safefree(escaped);
+ escaped = c_escape(data, (size_t) part->datasize);
+#ifdef CURL_DOES_CONVERSIONS
+ Curl_safefree(data);
+#endif
+ if(!escaped)
+ return CURLE_OUT_OF_MEMORY;
+ if(size >= 0)
+ CODE3("curl_mime_data(part%d, \"%s\", %" CURL_FORMAT_CURL_OFF_T ");",
+ *mimeno, escaped, size);
+ else
+ CODE2("curl_mime_data(part%d, \"%s\", CURL_ZERO_TERMINATED);",
+ *mimeno, escaped);
+ break;
+ case MIMEKIND_MULTIPART:
+ ret = libcurl_generate_mime(part->arg, &i);
+ if(ret)
+ goto nomem;
+ CODE2("curl_mime_subparts(part%d, mime%d);", *mimeno, i);
+ CODE1("mime%d = NULL;", i); /* Avoid freeing in CLEAN sequence. */
+ break;
+ default:
+ /* Other cases not possible in this context. */
+ break;
+ }
+
+ if(part->encoder) {
+ Curl_safefree(escaped);
+ escaped = c_escape(part->encoder->name, CURL_ZERO_TERMINATED);
+ if(!escaped)
+ return CURLE_OUT_OF_MEMORY;
+ CODE2("curl_mime_encoder(part%d, \"%s\");", *mimeno, escaped);
+ }
+
+ if(filename) {
+ Curl_safefree(escaped);
+ escaped = c_escape(filename, CURL_ZERO_TERMINATED);
+ if(!escaped)
+ return CURLE_OUT_OF_MEMORY;
+ CODE2("curl_mime_filename(part%d, \"%s\");", *mimeno, escaped);
+ }
+
+ if(part->name) {
+ Curl_safefree(escaped);
+ escaped = c_escape(part->name, CURL_ZERO_TERMINATED);
+ if(!escaped)
+ return CURLE_OUT_OF_MEMORY;
+ CODE2("curl_mime_name(part%d, \"%s\");", *mimeno, escaped);
+ }
+
+ if(part->mimetype) {
+ Curl_safefree(escaped);
+ escaped = c_escape(part->mimetype, CURL_ZERO_TERMINATED);
+ if(!escaped)
+ return CURLE_OUT_OF_MEMORY;
+ CODE2("curl_mime_type(part%d, \"%s\");", *mimeno, escaped);
+ }
+
+ if(part->userheaders) {
+ int ownership = part->flags & MIME_USERHEADERS_OWNER? 1: 0;
+
+ ret = libcurl_generate_slist(part->userheaders, &i);
+ if(ret)
+ goto nomem;
+ CODE3("curl_mime_headers(part%d, slist%d, %d);",
+ *mimeno, i, ownership);
+ if(ownership)
+ CODE1("slist%d = NULL;", i); /* Prevent freeing in CLEAN sequence. */
}
- DATA0(" CURLFORM_END);");
}
- CODE2("curl_easy_setopt(hnd, %s, post%d);", name, i);
}
- nomem:
+nomem:
Curl_safefree(escaped);
return ret;
}
+/* setopt wrapper for CURLOPT_MIMEPOST */
+CURLcode tool_setopt_mimepost(CURL *curl, struct GlobalConfig *config,
+ const char *name, CURLoption tag,
+ curl_mime *mimepost)
+{
+ CURLcode ret = CURLE_OK;
+
+ ret = curl_easy_setopt(curl, tag, mimepost);
+
+ if(config->libcurl && mimepost && !ret) {
+ int i;
+
+ ret = libcurl_generate_mime(mimepost, &i);
+
+ if(!ret)
+ CODE2("curl_easy_setopt(hnd, %s, mime%d);", name, i);
+ }
+
+nomem:
+ return ret;
+}
+
/* setopt wrapper for curl_slist options */
CURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
struct curl_slist *list)
{
CURLcode ret = CURLE_OK;
- char *escaped = NULL;
- bool skip = FALSE;
ret = curl_easy_setopt(curl, tag, list);
- if(!list)
- skip = TRUE;
- if(config->libcurl && !skip && !ret) {
- struct curl_slist *s;
+ if(config->libcurl && list && !ret) {
int i;
- /* May need several slist variables, so invent name */
- i = ++ easysrc_slist_count;
- DECL1("struct curl_slist *slist%d;", i);
- DATA1("slist%d = NULL;", i);
- CLEAN1("curl_slist_free_all(slist%d);", i);
- CLEAN1("slist%d = NULL;", i);
- for(s=list; s; s=s->next) {
- Curl_safefree(escaped);
- escaped = c_escape(s->data);
- if(!escaped) {
- ret = CURLE_OUT_OF_MEMORY;
- goto nomem;
- }
- DATA3("slist%d = curl_slist_append(slist%d, \"%s\");", i, i, escaped);
- }
- CODE2("curl_easy_setopt(hnd, %s, slist%d);", name, i);
+
+ ret = libcurl_generate_slist(list, &i);
+ if(!ret)
+ CODE2("curl_easy_setopt(hnd, %s, slist%d);", name, i);
}
nomem:
- Curl_safefree(escaped);
return ret;
}
@@ -507,7 +622,7 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
long lval = va_arg(arg, long);
long defval = 0L;
const NameValue *nv = NULL;
- for(nv=setopt_nv_CURLNONZERODEFAULTS; nv->name; nv++) {
+ for(nv = setopt_nv_CURLNONZERODEFAULTS; nv->name; nv++) {
if(!strcmp(name, nv->name)) {
defval = nv->value;
break; /* found it */
@@ -569,7 +684,7 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
REM2("%s set to a %s", name, value);
else {
if(escape) {
- escaped = c_escape(value);
+ escaped = c_escape(value, CURL_ZERO_TERMINATED);
if(!escaped) {
ret = CURLE_OUT_OF_MEMORY;
goto nomem;
diff --git a/src/tool_setopt.h b/src/tool_setopt.h
index da67dee..f8a52cd 100644
--- a/src/tool_setopt.h
+++ b/src/tool_setopt.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -85,9 +85,9 @@ CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config,
CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
const NameValueUnsigned *nv, long lval);
-CURLcode tool_setopt_httppost(CURL *curl, struct GlobalConfig *config,
+CURLcode tool_setopt_mimepost(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
- struct curl_httppost *httppost);
+ curl_mime *mimepost);
CURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
struct curl_slist *list);
@@ -109,8 +109,8 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
#define my_setopt_bitmask(x,y,z) \
SETOPT_CHECK(tool_setopt_bitmask(x, global, #y, y, setopt_nv_ ## y, z))
-#define my_setopt_httppost(x,y,z) \
- SETOPT_CHECK(tool_setopt_httppost(x, global, #y, y, z))
+#define my_setopt_mimepost(x,y,z) \
+ SETOPT_CHECK(tool_setopt_mimepost(x, global, #y, y, z))
#define my_setopt_slist(x,y,z) \
SETOPT_CHECK(tool_setopt_slist(x, global, #y, y, z))
@@ -138,7 +138,7 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
#define my_setopt_bitmask(x,y,z) \
SETOPT_CHECK(curl_easy_setopt(x, y, z))
-#define my_setopt_httppost(x,y,z) \
+#define my_setopt_mimepost(x,y,z) \
SETOPT_CHECK(curl_easy_setopt(x, y, z))
#define my_setopt_slist(x,y,z) \
diff --git a/src/tool_strdup.c b/src/tool_strdup.c
index cb4a1c5..e6e151b 100644
--- a/src/tool_strdup.c
+++ b/src/tool_strdup.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,11 +35,11 @@ char *strdup(const char *str)
if(len >= ((size_t)-1) / sizeof(char))
return (char *)NULL;
- newstr = malloc((len+1)*sizeof(char));
+ newstr = malloc((len + 1)*sizeof(char));
if(!newstr)
return (char *)NULL;
- memcpy(newstr, str, (len+1)*sizeof(char));
+ memcpy(newstr, str, (len + 1)*sizeof(char));
return newstr;
diff --git a/src/tool_urlglob.c b/src/tool_urlglob.c
index d56dcd9..f78d058 100644
--- a/src/tool_urlglob.c
+++ b/src/tool_urlglob.c
@@ -49,7 +49,7 @@ static CURLcode glob_fixed(URLGlob *glob, char *fixed, size_t len)
if(!pat->content.Set.elements)
return GLOBERROR("out of memory", 0, CURLE_OUT_OF_MEMORY);
- pat->content.Set.elements[0] = malloc(len+1);
+ pat->content.Set.elements[0] = malloc(len + 1);
if(!pat->content.Set.elements[0])
return GLOBERROR("out of memory", 0, CURLE_OUT_OF_MEMORY);
@@ -113,7 +113,7 @@ static CURLcode glob_set(URLGlob *glob, char **patternp,
CURLE_URL_MALFORMAT);
/* add 1 to size since it'll be incremented below */
- if(multiply(amount, pat->content.Set.size+1))
+ if(multiply(amount, pat->content.Set.size + 1))
return GLOBERROR("range overflow", 0, CURLE_URL_MALFORMAT);
/* fall-through */
@@ -207,7 +207,7 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
if(errno || &pattern[4] == endp || *endp != ']')
step = 0;
else
- pattern = endp+1;
+ pattern = endp + 1;
}
else if(end_c != ']')
/* then this is wrong */
@@ -259,12 +259,12 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
errno = 0;
min_n = strtoul(pattern, &endp, 10);
if(errno || (endp == pattern))
- endp=NULL;
+ endp = NULL;
else {
if(*endp != '-')
endp = NULL;
else {
- pattern = endp+1;
+ pattern = endp + 1;
while(*pattern && ISBLANK(*pattern))
pattern++;
if(!ISDIGIT(*pattern)) {
@@ -277,7 +277,7 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
/* overflow */
endp = NULL;
else if(*endp == ':') {
- pattern = endp+1;
+ pattern = endp + 1;
errno = 0;
step_n = strtoul(pattern, &endp, 10);
if(errno)
@@ -287,7 +287,7 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
else
step_n = 1;
if(endp && (*endp == ']')) {
- pattern= endp+1;
+ pattern = endp + 1;
}
else
endp = NULL;
@@ -367,9 +367,11 @@ static CURLcode glob_parse(URLGlob *glob, char *pattern,
size_t sublen = 0;
while(*pattern && *pattern != '{') {
if(*pattern == '[') {
- /* Skip over potential IPv6 literals. */
- size_t skip;
- if(peek_ipv6(pattern, &skip)) {
+ /* skip over IPv6 literals and [] */
+ size_t skip = 0;
+ if(!peek_ipv6(pattern, &skip) && (pattern[1] == ']'))
+ skip = 2;
+ if(skip) {
memcpy(buf, pattern, skip);
buf += skip;
pattern += skip;
@@ -384,8 +386,8 @@ static CURLcode glob_parse(URLGlob *glob, char *pattern,
/* only allow \ to escape known "special letters" */
if(*pattern == '\\' &&
- (*(pattern+1) == '{' || *(pattern+1) == '[' ||
- *(pattern+1) == '}' || *(pattern+1) == ']') ) {
+ (*(pattern + 1) == '{' || *(pattern + 1) == '[' ||
+ *(pattern + 1) == '}' || *(pattern + 1) == ']') ) {
/* escape character, skip '\' */
++pattern;
@@ -444,7 +446,7 @@ CURLcode glob_url(URLGlob **glob, char *url, unsigned long *urlnum,
glob_buffer = malloc(strlen(url) + 1);
if(!glob_buffer)
return CURLE_OUT_OF_MEMORY;
- glob_buffer[0]=0;
+ glob_buffer[0] = 0;
glob_expand = calloc(1, sizeof(URLGlob));
if(!glob_expand) {
@@ -623,12 +625,12 @@ CURLcode glob_match_url(char **result, char *filename, URLGlob *glob)
unsigned long i;
char *ptr = filename;
unsigned long num = strtoul(&filename[1], &filename, 10);
- URLPattern *pat =NULL;
+ URLPattern *pat = NULL;
if(num < glob->size) {
num--; /* make it zero based */
/* find the correct glob entry */
- for(i=0; i<glob->size; i++) {
+ for(i = 0; i<glob->size; i++) {
if(glob->pattern[i].globindex == (int)num) {
pat = &glob->pattern[i];
break;
diff --git a/src/tool_version.h b/src/tool_version.h
index af77fff..a9d596a 100644
--- a/src/tool_version.h
+++ b/src/tool_version.h
@@ -25,7 +25,7 @@
#define CURL_NAME "curl"
#define CURL_COPYRIGHT LIBCURL_COPYRIGHT
-#define CURL_VERSION "7.55.1"
+#define CURL_VERSION "7.57.0"
#define CURL_VERSION_MAJOR LIBCURL_VERSION_MAJOR
#define CURL_VERSION_MINOR LIBCURL_VERSION_MINOR
#define CURL_VERSION_PATCH LIBCURL_VERSION_PATCH
diff --git a/tests/FILEFORMAT b/tests/FILEFORMAT
index 75e561a..fbeee2a 100644
--- a/tests/FILEFORMAT
+++ b/tests/FILEFORMAT
@@ -74,6 +74,8 @@ B) The request was HTTP and included digest details, which adds 1000 to NUM
C) If a HTTP request is NTLM type-1, it adds 1001 to num
D) If a HTTP request is NTLM type-3, it adds 1002 to num
E) If a HTTP request is Basic and num is already >=1000, it adds 1 to num
+F) If a HTTP request is Negotiate, num gets incremented by one for each
+request with Negotiate authorization header on the same test case.
Dynamically changing num in this way allows the test harness to be used to
test authentication negotiation where several different requests must be sent
@@ -243,6 +245,7 @@ threaded-resolver
unittest
unix-sockets
WinSSL
+ld_preload
as well as each protocol that curl supports. A protocol only needs to be
specified if it is different from the server (useful when the server
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 3d18489..d6e6cfe 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -53,7 +53,7 @@ DIST_UNIT = unit
endif
SUBDIRS = certs data server libtest $(BUILD_UNIT)
-DIST_SUBDIRS = $(SUBDIRS) $(DIST_UNIT) fuzz
+DIST_SUBDIRS = $(SUBDIRS) $(DIST_UNIT)
PERLFLAGS = -I$(srcdir)
diff --git a/tests/curl_test_data.py b/tests/curl_test_data.py
index bfe1287..2174740 100755
--- a/tests/curl_test_data.py
+++ b/tests/curl_test_data.py
@@ -24,12 +24,15 @@
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import os
-import xml.etree.ElementTree as ET
+import re
import logging
log = logging.getLogger(__name__)
+REPLY_DATA = re.compile("<reply>\s*<data>(.*?)</data>", re.MULTILINE | re.DOTALL)
+
+
class TestData(object):
def __init__(self, data_folder):
self.data_folder = data_folder
@@ -39,15 +42,17 @@ class TestData(object):
filename = os.path.join(self.data_folder,
"test{0}".format(test_number))
- # The user should handle the exception from failing to find the file.
- tree = ET.parse(filename)
+ log.debug("Parsing file %s", filename)
+
+ with open(filename, "rb") as f:
+ contents = f.read().decode("utf-8")
- # We need the <reply><data> text.
- reply = tree.find("reply")
- data = reply.find("data")
+ m = REPLY_DATA.search(contents)
+ if not m:
+ raise Exception("Couldn't find a <reply><data> section")
- # Return the text contents of the data
- return data.text
+ # Left-strip the data so we don't get a newline before our data.
+ return m.group(1).lstrip()
if __name__ == '__main__':
diff --git a/tests/data/DISABLED b/tests/data/DISABLED
index 11d54b4..fcbf0ff 100644
--- a/tests/data/DISABLED
+++ b/tests/data/DISABLED
@@ -18,3 +18,5 @@
1510
# Pipelining test that is causing false positives a little too often
1903
+# causes memory leaks for now:
+1553
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index 1657ac6..8383d4c 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -45,16 +45,16 @@ test190 test191 test192 test193 test194 test195 test196 test197 test198 \
test199 test200 test201 test202 test203 test204 test205 test206 test207 \
test208 test209 test210 test211 test212 test213 test214 test215 test216 \
test217 test218 test219 test220 test221 test222 test223 test224 test225 \
-test226 test227 test228 test229 test231 test233 test234 \
+test226 test227 test228 test229 test230 test231 test233 test234 \
test235 test236 test237 test238 test239 test240 test241 test242 test243 \
- test245 test246 test247 test248 test249 test250 test251 test252 \
+test244 test245 test246 test247 test248 test249 test250 test251 test252 \
test253 test254 test255 test256 test257 test258 test259 test260 test261 \
test262 test263 test264 test265 test266 test267 test268 test269 test270 \
test271 test272 test273 test274 test275 test276 test277 test278 test279 \
test280 test281 test282 test283 test284 test285 test286 test287 test288 \
test289 test290 test291 test292 test293 test294 test295 test296 test297 \
test298 test299 test300 test301 test302 test303 test304 test305 test306 \
-test307 test308 test309 test310 test311 test312 test313 \
+test307 test308 test309 test310 test311 test312 test313 test314 test315 \
test320 test321 test322 test323 test324 \
test325 \
test350 test351 test352 test353 test354 \
@@ -70,14 +70,16 @@ test536 test537 test538 test539 test540 test541 test542 test543 test544 \
test545 test546 test547 test548 test549 test550 test551 test552 test553 \
test554 test555 test556 test557 test558 test559 test560 test561 test562 \
test563 test564 test565 test566 test567 test568 test569 test570 test571 \
-test572 test573 test574 test575 test576 test578 test579 test580 \
-test581 test582 test583 test584 test585 test586 test587 test588 \
+test572 test573 test574 test575 test576 test577 test578 test579 test580 \
+test581 test582 test583 test584 test585 test586 test587 test588 test589 \
test590 test591 test592 test593 test594 test595 test596 test597 test598 \
test599 test600 test601 test602 test603 test604 test605 test606 test607 \
test608 test609 test610 test611 test612 test613 test614 test615 test616 \
test617 test618 test619 test620 test621 test622 test623 test624 test625 \
test626 test627 test628 test629 test630 test631 test632 test633 test634 \
-test635 test636 test637 test638 test639 test640 test641 \
+test635 test636 test637 test638 test639 test640 test641 test642 \
+test643 test644 test645 test646 test647 test648 test649 test650 test651 \
+test652 test653 \
\
test700 test701 test702 test703 test704 test705 test706 test707 test708 \
test709 test710 test711 test712 test713 test714 test715 \
@@ -87,7 +89,7 @@ test809 test810 test811 test812 test813 test814 test815 test816 test817 \
test818 test819 test820 test821 test822 test823 test824 test825 test826 \
test827 test828 test829 test830 test831 test832 test833 test834 test835 \
test836 test837 test838 test839 test840 test841 test842 test843 test844 \
-test845 \
+test845 test846 \
\
test850 test851 test852 test853 test854 test855 test856 test857 test858 \
test859 test860 test861 test862 test863 test864 test865 test866 test867 \
@@ -100,7 +102,7 @@ test909 test910 test911 test912 test913 test914 test915 test916 test917 \
test918 test919 test920 test921 test922 test923 test924 test925 test926 \
test927 test928 test929 test930 test931 test932 test933 test934 test935 \
test936 test937 test938 test939 test940 test941 test942 test943 test944 \
-test945 test946 test947 test948 test949 \
+test945 test946 test947 test948 test949 test950 \
\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
@@ -120,7 +122,10 @@ test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 \
test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 \
test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \
test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
-test1144 test1145 test1146 test1147 test1148 \
+test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
+test1152 test1153 \
+\
+test1160 test1161 test1162 test1163 \
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
test1216 test1217 test1218 test1219 \
@@ -129,15 +134,15 @@ test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
-test1260 test1261 test1262 \
+test1260 test1261 test1262 test1263 test1264 \
\
test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
-test1288 test1289 \
+test1288 test1289 test1290 test1291 \
test1298 test1299 \
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \
- test1325 test1326 test1327 test1328 test1329 test1330 test1331 \
+test1324 test1325 test1326 test1327 test1328 test1329 test1330 test1331 \
test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 \
test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 \
test1348 test1349 test1350 test1351 test1352 test1353 test1354 test1355 \
@@ -154,8 +159,8 @@ test1416 test1417 test1418 test1419 test1420 test1421 test1422 test1423 \
test1424 test1425 test1426 test1427 \
test1428 test1429 test1430 test1431 test1432 test1433 test1434 test1435 \
test1436 test1437 test1438 test1439 test1440 test1441 test1442 test1443 \
-test1444 test1445 test1446 test1447 test1448 test1450 test1451 \
-test1452 \
+test1444 test1445 test1446 test1447 test1448 test1449 test1450 test1451 \
+test1452 test1453 \
test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
test1516 test1517 \
@@ -165,14 +170,14 @@ test1520 test1521 \
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
test1533 test1534 test1535 test1536 test1537 test1538 \
test1540 \
-test1550 test1551 \
+test1550 test1551 test1552 test1553 test1554 \
test1600 test1601 test1602 test1603 test1604 test1605 test1606 \
\
test1700 test1701 test1702 \
\
test1800 test1801 \
\
-test1900 test1901 test1902 test1903 \
+test1900 test1901 test1902 test1903 test1904 \
\
test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
@@ -180,4 +185,8 @@ test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
-test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055
+test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
+test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
+test2064 test2065 test2066 test2067 test2068 test2069 \
+\
+test2070 test2071 test2072
diff --git a/tests/data/test1034 b/tests/data/test1034
index 6c1beb6..beab0d3 100644
--- a/tests/data/test1034
+++ b/tests/data/test1034
@@ -13,24 +13,17 @@ config file
#
# Server-side
<reply>
-<data>
-HTTP/1.0 503 Service Unavailable
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake swsclose
-Content-Type: text/html
-Funny-head: yesyes
-
-</data>
</reply>
#
# Client-side
<client>
<server>
-http
+none
</server>
<features>
idn
+http
</features>
<setenv>
LC_ALL=
@@ -54,17 +47,9 @@ url = "http://invalid-utf8-â.local/page/1034"
</client>
#
-# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET http://invalid-utf8-â.local/page/1034 HTTP/1.1
-Host: invalid-utf8-â.local
-Accept: */*
-Proxy-Connection: Keep-Alive
-
-</protocol>
+<errorcode>
+3
+</errorcode>
</verify>
</testcase>
diff --git a/tests/data/test1035 b/tests/data/test1035
index 033a48a..a316c51 100644
--- a/tests/data/test1035
+++ b/tests/data/test1035
@@ -12,24 +12,17 @@ FAILURE
#
# Server-side
<reply>
-<data>
-HTTP/1.0 503 Service Unavailable
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake swsclose
-Content-Type: text/html
-Funny-head: yesyes
-
-</data>
</reply>
#
# Client-side
<client>
<server>
-http
+none
</server>
<features>
idn
+http
</features>
<setenv>
LC_ALL=
@@ -52,12 +45,8 @@ http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/10
<strip>
^User-Agent:.*
</strip>
-<protocol>
-GET http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/1035 HTTP/1.1
-Host: too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local
-Accept: */*
-Proxy-Connection: Keep-Alive
-
-</protocol>
+<errorcode>
+3
+</errorcode>
</verify>
</testcase>
diff --git a/tests/data/test1053 b/tests/data/test1053
index 8c60e5c..239a110 100644
--- a/tests/data/test1053
+++ b/tests/data/test1053
@@ -79,7 +79,6 @@ User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 z
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 410
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
------------------------------9ef8d6205763
@@ -104,7 +103,6 @@ User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 z
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 410
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
------------------------------9ef8d6205763
diff --git a/tests/data/test1133 b/tests/data/test1133
index 8b016fc..b8ed56b 100644
--- a/tests/data/test1133
+++ b/tests/data/test1133
@@ -23,10 +23,10 @@ blablabla
http
</server>
<name>
-HTTP RFC1867-type formposting with filename contains ',', ';', '"'
+HTTP RFC1867-type formposting with filename/data contains ',', ';', '"'
</name>
<command>
-http://%HOSTIP:%HTTPPORT/we/want/1133 -F "file=@\"log/test1133,a\\\"nd;.txt\";type=mo/foo;filename=\"faker,and;.txt\"" -F 'file2=@"log/test1133,a\"nd;.txt"' -F 'file3=@"log/test1133,a\"nd;.txt";type=m/f,"log/test1133,a\"nd;.txt"'
+http://%HOSTIP:%HTTPPORT/we/want/1133 -F "file=@\"log/test1133,a\\\"nd;.txt\";type=mo/foo;filename=\"faker,and;.txt\"" -F 'file2=@"log/test1133,a\"nd;.txt"' -F 'file3=@"log/test1133,a\"nd;.txt";type=m/f,"log/test1133,a\"nd;.txt"' -F a="{\"field1\":\"value1\",\"field2\":\"value2\"}" -F 'b=" \\value1;type=\"whatever\" "; type=text/foo; charset=utf-8 ; filename=param_b'
</command>
# We create this file before the command is invoked!
<file name=log/test1133,a"nd;.txt>
@@ -47,7 +47,7 @@ POST /we/want/1133 HTTP/1.1
User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 967
+Content-Length: 1270
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32
@@ -89,6 +89,14 @@ This is a bar foo
bar
foo
+
+Content-Disposition: form-data; name="a"
+
+{"field1":"value1","field2":"value2"}
+Content-Disposition: form-data; name="b"; filename="param_b"
+Content-Type: text/foo; charset=utf-8
+
+ \value1;type="whatever"
------------------------------24e78000bd32--
</protocol>
</verify>
diff --git a/tests/data/test1135 b/tests/data/test1135
index f7c6a7a..6a80ddf 100644
--- a/tests/data/test1135
+++ b/tests/data/test1135
@@ -28,8 +28,20 @@ Verify CURL_EXTERN order
<verify>
<stdout>
-CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2);
-CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n);
+CURL_EXTERN int curl_strequal(const char *s1, const char *s2);
+CURL_EXTERN int curl_strnequal(const char *s1, const char *s2, size_t n);
+CURL_EXTERN curl_mime *curl_mime_init(CURL *easy);
+CURL_EXTERN void curl_mime_free(curl_mime *mime);
+CURL_EXTERN curl_mimepart *curl_mime_addpart(curl_mime *mime);
+CURL_EXTERN CURLcode curl_mime_name(curl_mimepart *part, const char *name);
+CURL_EXTERN CURLcode curl_mime_filename(curl_mimepart *part,
+CURL_EXTERN CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype);
+CURL_EXTERN CURLcode curl_mime_encoder(curl_mimepart *part,
+CURL_EXTERN CURLcode curl_mime_data(curl_mimepart *part,
+CURL_EXTERN CURLcode curl_mime_filedata(curl_mimepart *part,
+CURL_EXTERN CURLcode curl_mime_data_cb(curl_mimepart *part,
+CURL_EXTERN CURLcode curl_mime_subparts(curl_mimepart *part,
+CURL_EXTERN CURLcode curl_mime_headers(curl_mimepart *part,
CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost,
CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg,
CURL_EXTERN void curl_formfree(struct curl_httppost *form);
@@ -43,6 +55,7 @@ CURL_EXTERN void curl_free(void *p);
CURL_EXTERN CURLcode curl_global_init(long flags);
CURL_EXTERN CURLcode curl_global_init_mem(long flags,
CURL_EXTERN void curl_global_cleanup(void);
+CURL_EXTERN CURLsslset curl_global_sslset(curl_sslbackend id, const char *name,
CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,
CURL_EXTERN void curl_slist_free_all(struct curl_slist *);
CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused);
diff --git a/tests/data/test1149 b/tests/data/test1149
new file mode 100644
index 0000000..ae081a8
--- /dev/null
+++ b/tests/data/test1149
@@ -0,0 +1,64 @@
+# based on test1010
+<testcase>
+<info>
+<keywords>
+FTP
+PASV
+LIST
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+# When doing LIST, we get the default list output hard-coded in the test
+# FTP server
+<datacheck mode="text">
+total 20
+drwxr-xr-x 8 98 98 512 Oct 22 13:06 .
+drwxr-xr-x 8 98 98 512 Oct 22 13:06 ..
+drwxr-xr-x 2 98 98 512 May 2 1996 .NeXT
+-r--r--r-- 1 0 1 35 Jul 16 1996 README
+lrwxrwxrwx 1 0 1 7 Dec 9 1999 bin -> usr/bin
+dr-xr-xr-x 2 0 1 512 Oct 1 1997 dev
+drwxrwxrwx 2 98 98 512 May 29 16:04 download.html
+dr-xr-xr-x 2 0 1 512 Nov 30 1995 etc
+drwxrwxrwx 2 98 1 512 Oct 30 14:33 pub
+dr-xr-xr-x 5 0 1 512 Oct 1 1997 usr
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP dir list multicwd then again nocwd
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/list/this/path/1149/ --ftp-method multicwd --next ftp://%HOSTIP:%FTPPORT/list/this/path/1149/ --ftp-method nocwd
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+CWD list
+CWD this
+CWD path
+CWD 1149
+EPSV
+TYPE A
+LIST
+CWD /
+EPSV
+LIST list/this/path/1149/
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1150 b/tests/data/test1150
new file mode 100644
index 0000000..ecd95d5
--- /dev/null
+++ b/tests/data/test1150
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP proxy
+</keywords>
+</info>
+# Server-side
+<reply>
+
+# this is returned when we get a GET!
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 7
+Content-Type: text/html
+Funny-head: yesyes
+
+daniel
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP proxy with URLs using different ports
+ </name>
+ <command>
+--proxy http://%HOSTIP:%HTTPPORT http://test.remote.example.com.1150:150/path http://test.remote.example.com.1150:1234/path/
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent: curl/.*
+</strip>
+<protocol>
+GET http://test.remote.example.com.1150:150/path HTTP/1.1
+Host: test.remote.example.com.1150:150
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+GET http://test.remote.example.com.1150:1234/path/ HTTP/1.1
+Host: test.remote.example.com.1150:1234
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1151 b/tests/data/test1151
new file mode 100644
index 0000000..08658d8
--- /dev/null
+++ b/tests/data/test1151
@@ -0,0 +1,66 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+cookies
+</keywords>
+</info>
+
+# Server-side
+<reply>
+
+# reject cookies with too long name (instead of capping)
+# 3000 bytes name + 1096 bytes content is fine
+# 3000 bytes name + 1097 bytes content is NOT OK
+# 4096 bytes name + 1 byte content is NOT OK
+# 4094 bytes name + 1 byte content is fine
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes swsclose
+Set-Cookie: foobar=name; domain=127.0.0.1; path=/;
+Set-Cookie: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; domain=127.0.0.1; path=/;
+Set-Cookie: CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; domain=127.0.0.1; path=/;
+Set-Cookie: DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=E; domain=127.0.0.1; path=/;
+Set-Cookie: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF=E; domain=127.0.0.1; path=/;
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP with too long cookies
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1151 -c log/cookies1151.txt
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1151 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+<file name="log/cookies1151.txt">
+# Netscape HTTP Cookie File
+# https://curl.haxx.se/docs/http-cookies.html
+# This file was generated by libcurl! Edit at your own risk.
+
+127.0.0.1 FALSE / FALSE 0 foobar name
+127.0.0.1 FALSE / FALSE 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
+127.0.0.1 FALSE / FALSE 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1152 b/tests/data/test1152
new file mode 100644
index 0000000..aa8c0a7
--- /dev/null
+++ b/tests/data/test1152
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+FTP
+PASV
+LIST
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<servercmd>
+REPLY PWD 257 "just one
+</servercmd>
+
+# When doing LIST, we get the default list output hard-coded in the test
+# FTP server
+<data mode="text">
+total 20
+drwxr-xr-x 8 98 98 512 Oct 22 13:06 .
+drwxr-xr-x 8 98 98 512 Oct 22 13:06 ..
+drwxr-xr-x 2 98 98 512 May 2 1996 curl-releases
+-r--r--r-- 1 0 1 35 Jul 16 1996 README
+lrwxrwxrwx 1 0 1 7 Dec 9 1999 bin -> usr/bin
+dr-xr-xr-x 2 0 1 512 Oct 1 1997 dev
+drwxrwxrwx 2 98 98 512 May 29 16:04 download.html
+dr-xr-xr-x 2 0 1 512 Nov 30 1995 etc
+drwxrwxrwx 2 98 1 512 Oct 30 14:33 pub
+dr-xr-xr-x 5 0 1 512 Oct 1 1997 usr
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP with uneven quote in PWD response
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/test-1152/
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+CWD test-1152
+EPSV
+TYPE A
+LIST
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1153 b/tests/data/test1153
new file mode 100644
index 0000000..c0e37c1
--- /dev/null
+++ b/tests/data/test1153
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+FTP
+PASV
+LIST
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<servercmd>
+REPLY PWD 257 "/""hello"""
+</servercmd>
+
+# When doing LIST, we get the default list output hard-coded in the test
+# FTP server
+<data mode="text">
+total 20
+drwxr-xr-x 8 98 98 512 Oct 22 13:06 .
+drwxr-xr-x 8 98 98 512 Oct 22 13:06 ..
+drwxr-xr-x 2 98 98 512 May 2 1996 curl-releases
+-r--r--r-- 1 0 1 35 Jul 16 1996 README
+lrwxrwxrwx 1 0 1 7 Dec 9 1999 bin -> usr/bin
+dr-xr-xr-x 2 0 1 512 Oct 1 1997 dev
+drwxrwxrwx 2 98 98 512 May 29 16:04 download.html
+dr-xr-xr-x 2 0 1 512 Nov 30 1995 etc
+drwxrwxrwx 2 98 1 512 Oct 30 14:33 pub
+dr-xr-xr-x 5 0 1 512 Oct 1 1997 usr
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP with quoted double quotes
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/test-1153/
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+CWD test-1153
+EPSV
+TYPE A
+LIST
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1160 b/tests/data/test1160
new file mode 100644
index 0000000..26a758c
--- /dev/null
+++ b/tests/data/test1160
@@ -0,0 +1,49 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+cookies
+</keywords>
+</info>
+
+# Server-side
+<reply>
+
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 0
+Set-Cookie: ÿ= ; ÿ zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz†……€zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzúzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzó –zzzzzzzzzzzz~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz¶zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP with long funny format cookie
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1160 -c log/cookies1160.txt
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1160 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+<file name="log/cookies1160.txt">
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1161 b/tests/data/test1161
new file mode 100644
index 0000000..1795313
--- /dev/null
+++ b/tests/data/test1161
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+cookies
+</keywords>
+</info>
+
+# Server-side
+<reply>
+
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 0
+Set-Cookie: ckyPersistent=permanent;path=;path=/
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP cookie with path set twice
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1161 -c log/cookies1161.txt
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1161 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+<file name="log/cookies1161.txt">
+# Netscape HTTP Cookie File
+# https://curl.haxx.se/docs/http-cookies.html
+# This file was generated by libcurl! Edit at your own risk.
+
+127.0.0.1 FALSE / FALSE 0 ckyPersistent permanent
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1162 b/tests/data/test1162
new file mode 100644
index 0000000..73e4646
--- /dev/null
+++ b/tests/data/test1162
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+FTP
+RETR
+LIST
+wildcardmatch
+ftplistparser
+flaky
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+<tool>
+lib576
+</tool>
+<name>
+FTP wildcard with crazy pattern
+</name>
+<command>
+"ftp://%HOSTIP:%FTPPORT/fully_simulated/DOS/[*\\s-'tl"
+</command>
+</client>
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+CWD fully_simulated
+CWD DOS
+EPSV
+TYPE A
+LIST
+QUIT
+</protocol>
+# 78 == CURLE_REMOTE_FILE_NOT_FOUND
+<errorcode>
+78
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1163 b/tests/data/test1163
new file mode 100644
index 0000000..a109b51
--- /dev/null
+++ b/tests/data/test1163
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+FTP
+RETR
+LIST
+wildcardmatch
+ftplistparser
+flaky
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+<tool>
+lib576
+</tool>
+<name>
+FTP wildcard with pattern ending with an open-bracket
+</name>
+<command>
+"ftp://%HOSTIP:%FTPPORT/fully_simulated/DOS/*[]["
+</command>
+</client>
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+CWD fully_simulated
+CWD DOS
+EPSV
+TYPE A
+LIST
+QUIT
+</protocol>
+# 78 == CURLE_REMOTE_FILE_NOT_FOUND
+<errorcode>
+78
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1263 b/tests/data/test1263
new file mode 100644
index 0000000..7946916
--- /dev/null
+++ b/tests/data/test1263
@@ -0,0 +1,37 @@
+# similar to test 1260
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+http
+</features>
+ <name>
+HTTP URL with rubbish after IPv6 bracket
+ </name>
+ <command>
+-g "http://[%HOSTIP]test:%HTTPPORT/we/want/1263" "http://[%HOSTIP][%HOSTIP]:%HTTPPORT/we/want/1263" "http://user@[::1]@localhost"
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+# CURLE_URL_MALFORMAT == 3
+<errorcode>
+3
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1264 b/tests/data/test1264
new file mode 100644
index 0000000..272db73
--- /dev/null
+++ b/tests/data/test1264
@@ -0,0 +1,36 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+http
+</features>
+ <name>
+HTTP URL with space in host name
+ </name>
+ <command>
+-g "http://127.0.0.1 www.example.com/we/want/1264"
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+# CURLE_URL_MALFORMAT == 3
+<errorcode>
+3
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1290 b/tests/data/test1290
new file mode 100644
index 0000000..e556303
--- /dev/null
+++ b/tests/data/test1290
@@ -0,0 +1,48 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+globbing
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+
+-foo-
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Verify URL globbing ignores []
+</name>
+<command>
+"http://%HOSTIP:%HTTPPORT/we/want/[]/page/1290"
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/[]/page/1290 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1291 b/tests/data/test1291
new file mode 100644
index 0000000..12d65f3
--- /dev/null
+++ b/tests/data/test1291
@@ -0,0 +1,51 @@
+# This test case is primarily meant to verify that parsing and adding the 100K
+# files is a swift operation.
+#
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<name>
+Attempt to upload 100K files but fail immediately
+</name>
+<command>
+-K log/cmd1291 --fail-early
+</command>
+<file name="log/upload-this">
+XXXXXXXx
+</file>
+# generate the config file
+<precheck>
+perl -e 'for(1 .. 100000) { printf("upload-file=log/upload-this\nurl=htttttp://non-existing-host.haxx.se/upload/1291\n", $_);}' > log/cmd1291;
+</precheck>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+1
+</errorcode>
+
+# we disable valgrind here since it takes 40+ seconds even on a fairly snappy
+# machine
+<valgrind>
+disable
+</valgrind>
+</verify>
+</testcase>
diff --git a/tests/data/test1315 b/tests/data/test1315
index c2f158a..888ddc5 100644
--- a/tests/data/test1315
+++ b/tests/data/test1315
@@ -47,8 +47,7 @@ POST /we/want/1315 HTTP/1.1
User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 795
-Expect: 100-continue
+Content-Length: 797
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
------------------------------9ef8d6205763
@@ -77,6 +76,7 @@ Content-Type: text/plain
dummy data
------------------------------aaaaaaaaaaaa--
+
------------------------------9ef8d6205763--
</protocol>
</verify>
diff --git a/tests/data/test1324 b/tests/data/test1324
new file mode 100644
index 0000000..d7e663a
--- /dev/null
+++ b/tests/data/test1324
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+--resolve
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http-ipv6
+</server>
+<name>
+HTTP with --resolve and [ipv6address]
+</name>
+<command>
+--resolve example.com:%HTTP6PORT:%HOST6IP http://example.com:%HTTP6PORT/1324
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1324 HTTP/1.1
+Host: example.com:%HTTP6PORT
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1401 b/tests/data/test1401
index 2217ed8..de4d0aa 100644
--- a/tests/data/test1401
+++ b/tests/data/test1401
@@ -84,10 +84,10 @@ int main(int argc, char *argv[])
curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1401");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_USERPWD, "fake:user");
- curl_easy_setopt(hnd, CURLOPT_USERAGENT, "MyUA");
+ curl_easy_setopt(hnd, CURLOPT_HTTPAUTH, (long)CURLAUTH_BASIC);
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, slist1);
+ curl_easy_setopt(hnd, CURLOPT_USERAGENT, "MyUA");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
- curl_easy_setopt(hnd, CURLOPT_HTTPAUTH, (long)CURLAUTH_BASIC);
curl_easy_setopt(hnd, CURLOPT_COOKIE, "chocolate=chip");
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
diff --git a/tests/data/test1404 b/tests/data/test1404
index c86d260..53ab37b 100644
--- a/tests/data/test1404
+++ b/tests/data/test1404
@@ -27,13 +27,13 @@ Connection: close
http
</server>
<name>
---libcurl for HTTP RFC1867-type formposting - -F with three files, one with explicit type
+--libcurl for HTTP RFC1867-type formposting - -F with 3 files, one with explicit type & encoder
</name>
<setenv>
SSL_CERT_FILE=
</setenv>
<command>
-http://%HOSTIP:%HTTPPORT/we/want/1404 -F name=value -F 'file=@log/test1404.txt,log/test1404.txt;type=magic/content,log/test1404.txt' --libcurl log/test1404.c
+http://%HOSTIP:%HTTPPORT/we/want/1404 -F name=value -F 'file=@log/test1404.txt,log/test1404.txt;type=magic/content;encoder=8bit,log/test1404.txt;headers=X-testheader-1: header 1;headers=X-testheader-2: header 2' --libcurl log/test1404.c
</command>
# We create this file before the command is invoked!
<file name="log/test1404.txt">
@@ -51,8 +51,7 @@ POST /we/want/1404 HTTP/1.1
User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 795
-Expect: 100-continue
+Content-Length: 882
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
------------------------------9ef8d6205763
@@ -71,16 +70,20 @@ dummy data
------------------------------9ef8d6205763
Content-Disposition: attachment; filename="test1404.txt"
Content-Type: magic/content
+Content-Transfer-Encoding: 8bit
dummy data
------------------------------9ef8d6205763
Content-Disposition: attachment; filename="test1404.txt"
Content-Type: text/plain
+X-testheader-1: header 1
+X-testheader-2: header 2
dummy data
------------------------------aaaaaaaaaaaa--
+
------------------------------9ef8d6205763--
</protocol>
<stripfile>
@@ -103,30 +106,42 @@ int main(int argc, char *argv[])
{
CURLcode ret;
CURL *hnd;
- struct curl_httppost *post1;
- struct curl_httppost *postend;
+ curl_mime *mime1;
+ curl_mimepart *part1;
+ curl_mime *mime2;
+ curl_mimepart *part2;
+ struct curl_slist *slist1;
- post1 = NULL;
- postend = NULL;
- curl_formadd(&post1, &postend,
- CURLFORM_COPYNAME, "name",
- CURLFORM_COPYCONTENTS, "value",
- CURLFORM_END);
- curl_formadd(&post1, &postend,
- CURLFORM_COPYNAME, "file",
- CURLFORM_FILE, "log/test1404.txt",
- CURLFORM_CONTENTTYPE, "text/plain",
- CURLFORM_FILE, "log/test1404.txt",
- CURLFORM_CONTENTTYPE, "magic/content",
- CURLFORM_FILE, "log/test1404.txt",
- CURLFORM_CONTENTTYPE, "text/plain",
- CURLFORM_END);
+ mime1 = NULL;
+ mime2 = NULL;
+ slist1 = NULL;
+ slist1 = curl_slist_append(slist1, "X-testheader-1: header 1");
+ slist1 = curl_slist_append(slist1, "X-testheader-2: header 2");
hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1404");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
- curl_easy_setopt(hnd, CURLOPT_HTTPPOST, post1);
+ mime1 = curl_mime_init(hnd);
+ part1 = curl_mime_addpart(mime1);
+ curl_mime_data(part1, "value", CURL_ZERO_TERMINATED);
+ curl_mime_name(part1, "name");
+ part1 = curl_mime_addpart(mime1);
+ mime2 = curl_mime_init(hnd);
+ part2 = curl_mime_addpart(mime2);
+ curl_mime_filedata(part2, "log/test1404.txt");
+ part2 = curl_mime_addpart(mime2);
+ curl_mime_filedata(part2, "log/test1404.txt");
+ curl_mime_encoder(part2, "8bit");
+ curl_mime_type(part2, "magic/content");
+ part2 = curl_mime_addpart(mime2);
+ curl_mime_filedata(part2, "log/test1404.txt");
+ curl_mime_headers(part2, slist1, 1);
+ slist1 = NULL;
+ curl_mime_subparts(part1, mime2);
+ mime2 = NULL;
+ curl_mime_name(part1, "file");
+ curl_easy_setopt(hnd, CURLOPT_MIMEPOST, mime1);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
@@ -156,8 +171,12 @@ int main(int argc, char *argv[])
curl_easy_cleanup(hnd);
hnd = NULL;
- curl_formfree(post1);
- post1 = NULL;
+ curl_mime_free(mime1);
+ mime1 = NULL;
+ curl_mime_free(mime2);
+ mime2 = NULL;
+ curl_slist_free_all(slist1);
+ slist1 = NULL;
return (int)ret;
}
diff --git a/tests/data/test1422 b/tests/data/test1422
index 9b436cc..df9d750 100644
--- a/tests/data/test1422
+++ b/tests/data/test1422
@@ -16,7 +16,7 @@ Server: test-server/fake
Content-Length: 0
Connection: close
Content-Type: text/html
-Content-Disposition: filename=name1422; charset=funny; option=strange
+Content-Disposition: filename=name1422; charset=funny; option=str//nge
</data>
</reply>
diff --git a/tests/data/test1449 b/tests/data/test1449
new file mode 100644
index 0000000..d30c13c
--- /dev/null
+++ b/tests/data/test1449
@@ -0,0 +1,38 @@
+# initially based on test110
+<testcase>
+<info>
+<keywords>
+FTP
+PASV
+RETR
+Resume
+</keywords>
+</info>
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP download range with integer overflow
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/1449 -r 36893488147419103232-
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1453 b/tests/data/test1453
new file mode 100644
index 0000000..eaf9dd3
--- /dev/null
+++ b/tests/data/test1453
@@ -0,0 +1,38 @@
+<testcase>
+<info>
+<keywords>
+Too long tftp filename
+FAILURE
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+tftp
+</features>
+ <name>
+Too long tftp filename
+ </name>
+ <command>
+tftp://%HOSTIP:%TFTPPORT/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# TFTP file name too long
+<errorcode>
+71
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1552 b/tests/data/test1552
new file mode 100644
index 0000000..c5b1b57
--- /dev/null
+++ b/tests/data/test1552
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+IMAP
+Clear Text
+FETCH
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+From: me@somewhere
+To: fake@nowhere
+
+body
+
+--
+ yours sincerely
+</data>
+<datacheck>
+</datacheck>
+<servercmd>
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+imap
+</server>
+ <name>
+IMAP multi transfer error without curl_multi_remove_handle
+ </name>
+# tool is what to use instead of 'curl'
+<tool>
+lib1552
+</tool>
+ <command>
+'imap://%HOSTIP:%IMAPPORT/1552/;UID=1'
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1553 b/tests/data/test1553
new file mode 100644
index 0000000..c2fb9cc
--- /dev/null
+++ b/tests/data/test1553
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+IMAP
+Clear Text
+FETCH
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+From: me@somewhere
+To: fake@nowhere
+
+body
+
+--
+ yours sincerely
+</data>
+<datacheck>
+</datacheck>
+<servercmd>
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+imap
+</server>
+ <name>
+IMAP cleanup before a connection was created
+ </name>
+# tool is what to use instead of 'curl'
+<tool>
+lib1553
+</tool>
+ <command>
+imap://non-existing-host.haxx.se:%IMAPPORT/1553
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1554 b/tests/data/test1554
new file mode 100644
index 0000000..8739b2c
--- /dev/null
+++ b/tests/data/test1554
@@ -0,0 +1,77 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+shared connections
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Content-Length: 29
+
+run 1: foobar and so on fun!
+</data>
+<datacheck>
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+run 1: foobar and so on fun!
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+run 1: foobar and so on fun!
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+run 1: foobar and so on fun!
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP with shared connection cache
+</name>
+<tool>
+lib1554
+</tool>
+<command>
+http://%HOSTIP:%HTTPPORT/1554
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test158 b/tests/data/test158
index 9c4b22f..dca51b1 100644
--- a/tests/data/test158
+++ b/tests/data/test158
@@ -41,7 +41,6 @@ User-Agent: curl/7.11.2-CVS (i686-pc-linux-gnu) libcurl/7.11.2-CVS OpenSSL/0.9.6
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 145
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------4f12fcdaa3bc
------------------------------4f12fcdaa3bc
diff --git a/tests/data/test163 b/tests/data/test163
index 22341c0..b4e2d26 100644
--- a/tests/data/test163
+++ b/tests/data/test163
@@ -54,7 +54,6 @@ User-Agent: curl/7.11.2-CVS (i686-pc-linux-gnu) libcurl/7.11.2-CVS OpenSSL/0.9.6
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 304
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------c2d1767eb6ac
------------------------------c2d1767eb6ac
diff --git a/tests/data/test166 b/tests/data/test166
index 2036773..f170752 100644
--- a/tests/data/test166
+++ b/tests/data/test166
@@ -46,7 +46,6 @@ User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 223
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------b0b3d6d23991
------------------------------b0b3d6d23991
diff --git a/tests/data/test173 b/tests/data/test173
index bf6af00..865ef7b 100644
--- a/tests/data/test173
+++ b/tests/data/test173
@@ -54,7 +54,6 @@ User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 360
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------5dbea401cd8c
------------------------------5dbea401cd8c
diff --git a/tests/data/test186 b/tests/data/test186
index b07736c..4abc74a 100644
--- a/tests/data/test186
+++ b/tests/data/test186
@@ -43,8 +43,7 @@ POST /we/want/186 HTTP/1.1
User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.7d zlib/1.2.1.1 c-ares/1.2.0 libidn/0.5.2
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 321
-Expect: 100-continue
+Content-Length: 320
Content-Type: multipart/form-data; boundary=----------------------------212d9006ceb5
------------------------------212d9006ceb5
@@ -56,7 +55,7 @@ daniel
Content-Disposition: form-data; name="html"
Content-Type: text/html;charset=verymoo
- <body>hello</body>
+<body>hello</body>
------------------------------212d9006ceb5--
</protocol>
</verify>
diff --git a/tests/data/test1904 b/tests/data/test1904
new file mode 100644
index 0000000..08ad534
--- /dev/null
+++ b/tests/data/test1904
@@ -0,0 +1,79 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP CONNECT
+HTTP proxy
+proxytunnel
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Content-Type: text/html
+Funny-head: yesyes
+Content-Length: 9
+
+contents
+</data>
+<connect>
+HTTP/1.1 204 Sure go ahead
+
+</connect>
+<datacheck>
+HTTP/1.1 204 Sure go ahead
+
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Content-Type: text/html
+Funny-head: yesyes
+Content-Length: 9
+
+contents
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+http-proxy
+</server>
+ <name>
+HTTP CONNECT with 204 response
+ </name>
+ <command>
+http://test.1904:%HTTPPORT/we/want/that/page/1904 -p --proxy %HOSTIP:%PROXYPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<proxy>
+CONNECT test.1904:%HTTPPORT HTTP/1.1
+Host: test.1904:%HTTPPORT
+User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+Proxy-Connection: Keep-Alive
+
+</proxy>
+<protocol>
+GET /we/want/that/page/1904 HTTP/1.1
+Host: test.1904:%HTTPPORT
+User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2056 b/tests/data/test2056
new file mode 100644
index 0000000..f00e212
--- /dev/null
+++ b/tests/data/test2056
@@ -0,0 +1,87 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Negotiate auth (stub krb5)
+</keywords>
+</info>
+# Server-side
+<reply>
+<!-- First request, expect 401 Negotiate -->
+<data>
+HTTP/1.1 401 Authorization Required
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate
+Content-Length: 13
+
+Not yet sir!
+</data>
+<!-- Second request, expect success in one shot -->
+<data1>
+HTTP/1.1 200 Things are fine in server land
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate RA==
+Content-Length: 15
+
+Nice auth sir!
+</data1>
+<datacheck>
+HTTP/1.1 401 Authorization Required
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate
+Content-Length: 13
+
+HTTP/1.1 200 Things are fine in server land
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate RA==
+Content-Length: 15
+
+Nice auth sir!
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP Negotiate authentication (stub krb5)
+</name>
+<features>
+GSS-API
+ld_preload
+!debug
+</features>
+<setenv>
+LD_PRELOAD=%PWD/libtest/.libs/libstubgss.so
+CURL_STUB_GSS_CREDS="KRB5_Alice"
+</setenv>
+<command>
+-u: --negotiate http://%HOSTIP:%HTTPPORT/2056
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /2056 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /2056 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Negotiate IktSQjVfQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjE6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2057 b/tests/data/test2057
new file mode 100644
index 0000000..5625051
--- /dev/null
+++ b/tests/data/test2057
@@ -0,0 +1,108 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Negotiate auth (stub ntlm)
+</keywords>
+</info>
+# Server-side
+<reply>
+<!-- First request, expect 401 Negotiate -->
+<data>
+HTTP/1.1 401 Authorization Required
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate
+Content-Length: 13
+
+Not yet sir!
+</data>
+<!-- Second request, expect 401 (ntlm challenge) -->
+<data1>
+HTTP/1.1 401 Authorization Required
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate Qw==
+Content-Length: 19
+
+Still not yet sir!
+</data1>
+<!-- Third request, expect success -->
+<data2>
+HTTP/1.1 200 Things are fine in server land
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate RA==
+Content-Length: 15
+
+Nice auth sir!
+</data2>
+<datacheck>
+HTTP/1.1 401 Authorization Required
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate
+Content-Length: 13
+
+HTTP/1.1 401 Authorization Required
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate Qw==
+Content-Length: 19
+
+HTTP/1.1 200 Things are fine in server land
+Server: Microsoft-IIS/7.0
+Content-Type: text/html; charset=iso-8859-1
+WWW-Authenticate: Negotiate RA==
+Content-Length: 15
+
+Nice auth sir!
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP Negotiate authentication (stub ntlm)
+</name>
+<features>
+GSS-API
+ld_preload
+!debug
+</features>
+<setenv>
+LD_PRELOAD=%PWD/libtest/.libs/libstubgss.so
+CURL_STUB_GSS_CREDS="NTLM_Alice"
+</setenv>
+<command>
+-u: --negotiate http://%HOSTIP:%HTTPPORT/2057
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /2057 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /2057 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Negotiate Ik5UTE1fQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjI6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==
+Accept: */*
+
+GET /2057 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Negotiate Ik5UTE1fQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjM6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2058 b/tests/data/test2058
new file mode 100644
index 0000000..0082503
--- /dev/null
+++ b/tests/data/test2058
@@ -0,0 +1,107 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+HTTP proxy
+HTTP Digest auth
+Resume
+Content-Range
+CUSTOMREQUEST
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 100 Continue
+Server: Microsoft-IIS/5.0
+Date: Sun, 03 Apr 2005 14:57:45 GMT
+X-Powered-By: ASP.NET
+
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", algorithm="SHA-256", nonce="1053604144"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data>
+<data1000>
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</data1000>
+
+<datacheck>
+HTTP/1.1 100 Continue
+Server: Microsoft-IIS/5.0
+Date: Sun, 03 Apr 2005 14:57:45 GMT
+X-Powered-By: ASP.NET
+
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", algorithm="SHA-256", nonce="1053604144"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+#
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+ <name>
+HTTP POST --digest with PUT, resumed upload, modified method and SHA-256
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/2058 -u auser:apasswd --digest -T log/2058 -x http://%HOSTIP:%HTTPPORT -C 2 -X GET
+</command>
+<file name="log/2058">
+test
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://%HOSTIP:%HTTPPORT/2058 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Content-Range: bytes 2-4/5
+User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+Accept: */*
+Proxy-Connection: Keep-Alive
+Content-Length: 0
+
+GET http://%HOSTIP:%HTTPPORT/2058 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2058", response="fbed69f9f3fd304c8f1acb1a43eb32688b933c0e28055c16b926cbcec070aeed", algorithm="SHA-256"
+Content-Range: bytes 2-4/5
+Accept: */*
+Proxy-Connection: Keep-Alive
+Content-Length: 3
+Expect: 100-continue
+
+st
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2059 b/tests/data/test2059
new file mode 100644
index 0000000..b74b0bd
--- /dev/null
+++ b/tests/data/test2059
@@ -0,0 +1,107 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+HTTP proxy
+HTTP Digest auth
+Resume
+Content-Range
+CUSTOMREQUEST
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 100 Continue
+Server: Microsoft-IIS/5.0
+Date: Sun, 03 Apr 2005 14:57:45 GMT
+X-Powered-By: ASP.NET
+
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", algorithm="SHA-512-256", nonce="1053604144", userhash=true
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data>
+<data1000>
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</data1000>
+
+<datacheck>
+HTTP/1.1 100 Continue
+Server: Microsoft-IIS/5.0
+Date: Sun, 03 Apr 2005 14:57:45 GMT
+X-Powered-By: ASP.NET
+
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", algorithm="SHA-512-256", nonce="1053604144", userhash=true
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+#
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+ <name>
+HTTP POST --digest with PUT, resumed upload, modified method, SHA-512-256 and userhash=true
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/2059 -u auser:apasswd --digest -T log/2059 -x http://%HOSTIP:%HTTPPORT -C 2 -X GET
+</command>
+<file name="log/2059">
+test
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://%HOSTIP:%HTTPPORT/2059 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Content-Range: bytes 2-4/5
+User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+Accept: */*
+Proxy-Connection: Keep-Alive
+Content-Length: 0
+
+GET http://%HOSTIP:%HTTPPORT/2059 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="fddc3bc7b753b73ab0848fd83cb20cbbca971258eb8d20c941dd5e0b010d66be", realm="testrealm", nonce="1053604144", uri="/2059", response="fc09be8192851e284e73e8b719b32a2f6f91cca0594e68713da8c49dc2c1656e", algorithm="SHA-512-256", userhash=true
+Content-Range: bytes 2-4/5
+Accept: */*
+Proxy-Connection: Keep-Alive
+Content-Length: 3
+Expect: 100-continue
+
+st
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2060 b/tests/data/test2060
new file mode 100644
index 0000000..f323eb5
--- /dev/null
+++ b/tests/data/test2060
@@ -0,0 +1,107 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+HTTP proxy
+HTTP Digest auth
+Resume
+Content-Range
+CUSTOMREQUEST
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 100 Continue
+Server: Microsoft-IIS/5.0
+Date: Sun, 03 Apr 2005 14:57:45 GMT
+X-Powered-By: ASP.NET
+
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", algorithm="SHA-512-256", nonce="1053604144"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data>
+<data1000>
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</data1000>
+
+<datacheck>
+HTTP/1.1 100 Continue
+Server: Microsoft-IIS/5.0
+Date: Sun, 03 Apr 2005 14:57:45 GMT
+X-Powered-By: ASP.NET
+
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", algorithm="SHA-512-256", nonce="1053604144"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+#
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+ <name>
+HTTP POST --digest with PUT, resumed upload, modified method, SHA-512-256 and userhash=false
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/2060 -u auser:apasswd --digest -T log/2060 -x http://%HOSTIP:%HTTPPORT -C 2 -X GET
+</command>
+<file name="log/2060">
+test
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://%HOSTIP:%HTTPPORT/2060 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Content-Range: bytes 2-4/5
+User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+Accept: */*
+Proxy-Connection: Keep-Alive
+Content-Length: 0
+
+GET http://%HOSTIP:%HTTPPORT/2060 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2060", response="3ce1e25ffa611bdbe90e2ab367b9602fa223db9f6de76ac667f0d6157e2178a6", algorithm="SHA-512-256"
+Content-Range: bytes 2-4/5
+Accept: */*
+Proxy-Connection: Keep-Alive
+Content-Length: 3
+Expect: 100-continue
+
+st
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2061 b/tests/data/test2061
new file mode 100644
index 0000000..af3758c
--- /dev/null
+++ b/tests/data/test2061
@@ -0,0 +1,84 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Digest auth
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 Authorization Required swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604145", algorithm="SHA-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+This is not the real page
+</data>
+
+# This is supposed to be returned when the server gets a
+# Authorization: Digest line passed-in from the client
+<data1000>
+HTTP/1.1 200 OK swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 23
+
+This IS the real page!
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 Authorization Required swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604145", algorithm="SHA-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+HTTP/1.1 200 OK swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 23
+
+This IS the real page!
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+ <name>
+HTTP with RFC7616 SHA256 Digest authorization
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/2061 -u testuser:testpass --digest
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /2061 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /2061 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2061", response="9dc55255f1a2537b838311674b621d45346b862a81631bb20e4ce356ef25062d", algorithm="SHA-256"
+User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2062 b/tests/data/test2062
new file mode 100644
index 0000000..d5ce689
--- /dev/null
+++ b/tests/data/test2062
@@ -0,0 +1,84 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Digest auth
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 Authorization Required swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604145", algorithm="SHA-512-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+This is not the real page
+</data>
+
+# This is supposed to be returned when the server gets a
+# Authorization: Digest line passed-in from the client
+<data1000>
+HTTP/1.1 200 OK swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 23
+
+This IS the real page!
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 Authorization Required swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604145", algorithm="SHA-512-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+HTTP/1.1 200 OK swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 23
+
+This IS the real page!
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+ <name>
+HTTP with RFC7616 SHA-512-256 Digest authorization and userhash=false
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/2062 -u testuser:testpass --digest
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /2062 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /2062 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2062", response="2af735ec3508f4dff99248ffbbe9de9002bfd7cc770cfa2b026cb334042a54e3", algorithm="SHA-512-256"
+User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2063 b/tests/data/test2063
new file mode 100644
index 0000000..220fe4e
--- /dev/null
+++ b/tests/data/test2063
@@ -0,0 +1,84 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Digest auth
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 Authorization Required swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604145", algorithm="SHA-512-256", userhash=true
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+This is not the real page
+</data>
+
+# This is supposed to be returned when the server gets a
+# Authorization: Digest line passed-in from the client
+<data1000>
+HTTP/1.1 200 OK swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 23
+
+This IS the real page!
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 Authorization Required swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604145", algorithm="SHA-512-256", userhash=true
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+HTTP/1.1 200 OK swsclose
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 23
+
+This IS the real page!
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+ <name>
+HTTP with RFC7616 SHA-512-256 Digest authorization and userhash=true
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/2063 -u testuser:testpass --digest
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /2063 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /2063 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="75af8a3500f771e58a52093a25e7905d6e428a511285c12ea1420c73078dfd61", realm="testrealm", nonce="1053604145", uri="/2063", response="43f7ab531dff687b5dc75617daa59d1fd67d648341d6d2655ca65ef5064cfb51", algorithm="SHA-512-256", userhash=true
+User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2064 b/tests/data/test2064
new file mode 100644
index 0000000..aa20c0b
--- /dev/null
+++ b/tests/data/test2064
@@ -0,0 +1,84 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Digest auth
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 Authorization Required
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="2053604145", algorithm="SHA-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+This is not the real page
+</data>
+
+# This is supposed to be returned when the server gets a
+# Authorization: Digest line passed-in from the client
+<data1000>
+HTTP/1.1 401 Still a bad password you moron
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 34
+
+This is not the real page either
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 Authorization Required
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="2053604145", algorithm="SHA-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+HTTP/1.1 401 Still a bad password you moron
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 34
+
+This is not the real page either
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+ <name>
+HTTP with RFC7616 Digest authorization with bad password and SHA256
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/2064 -u testuser:test2pass --digest
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /2064 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /2064 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2064", response="a9c3ec1036068b336cbabefe9dfcad52ee8b89bc7c91ddbb5bb415c6acdf38a5", algorithm="SHA-256"
+User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2065 b/tests/data/test2065
new file mode 100644
index 0000000..d3afe0b
--- /dev/null
+++ b/tests/data/test2065
@@ -0,0 +1,84 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Digest auth
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 Authorization Required
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="2053604145", algorithm="SHA-512-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+This is not the real page
+</data>
+
+# This is supposed to be returned when the server gets a
+# Authorization: Digest line passed-in from the client
+<data1000>
+HTTP/1.1 401 Still a bad password you moron
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 34
+
+This is not the real page either
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 Authorization Required
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="2053604145", algorithm="SHA-512-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+HTTP/1.1 401 Still a bad password you moron
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 34
+
+This is not the real page either
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+ <name>
+HTTP with RFC7616 Digest authorization with bad password, SHA-512-256 and userhash=false
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/2065 -u testuser:test2pass --digest
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /2065 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /2065 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2065", response="5a5f20b0e601aeddc6f96422c2332d49ff431c49ab143b5f836ef76e9ac78f5e", algorithm="SHA-512-256"
+User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2066 b/tests/data/test2066
new file mode 100644
index 0000000..e6ec28a
--- /dev/null
+++ b/tests/data/test2066
@@ -0,0 +1,84 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Digest auth
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 Authorization Required
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="2053604145", algorithm="SHA-512-256", userhash=true
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+This is not the real page
+</data>
+
+# This is supposed to be returned when the server gets a
+# Authorization: Digest line passed-in from the client
+<data1000>
+HTTP/1.1 401 Still a bad password you moron
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 34
+
+This is not the real page either
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 Authorization Required
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+WWW-Authenticate: Digest realm="testrealm", nonce="2053604145", algorithm="SHA-512-256", userhash=true
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 26
+
+HTTP/1.1 401 Still a bad password you moron
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 34
+
+This is not the real page either
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+ <name>
+HTTP with RFC7616 Digest authorization with bad password, SHA-512-256 and userhash=true
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/2066 -u testuser:test2pass --digest
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /2066 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /2066 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="75af8a3500f771e58a52093a25e7905d6e428a511285c12ea1420c73078dfd61", realm="testrealm", nonce="2053604145", uri="/2066", response="a2e2ae589f575fb132991d6f550ef14bf7ef697d2fef1242d2498f07eafc77dc", algorithm="SHA-512-256", userhash=true
+User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2067 b/tests/data/test2067
new file mode 100644
index 0000000..faa7c57
--- /dev/null
+++ b/tests/data/test2067
@@ -0,0 +1,89 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP Digest auth
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144", algorithm="SHA-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data>
+<data1000>
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144", algorithm="SHA-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+#
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+<name>
+HTTP POST --digest with SHA256 and user-specified Content-Length header
+</name>
+# This test is to ensure 'Content-Length: 0' is sent while negotiating auth
+# even when there is a user-specified Content-Length header.
+# https://github.com/curl/curl/pull/1242
+<command>
+-H "Content-Length: 11" -u auser:apasswd --digest -d "junkelijunk" http://%HOSTIP:%HTTPPORT/2067
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol nonewline="yes">
+POST /2067 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 0
+Content-Type: application/x-www-form-urlencoded
+
+POST /2067 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2067", response="67b97af219c92fa7e8685e5bebb8e74892f6c6792e911c52bd2dfbf0b49272eb", algorithm="SHA-256"
+Accept: */*
+Content-Length: 11
+Content-Type: application/x-www-form-urlencoded
+
+junkelijunk
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2068 b/tests/data/test2068
new file mode 100644
index 0000000..43a50e6
--- /dev/null
+++ b/tests/data/test2068
@@ -0,0 +1,89 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP Digest auth
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144", algorithm="SHA-512-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data>
+<data1000>
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144", algorithm="SHA-512-256"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+#
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+<name>
+HTTP POST --digest with SHA-512-256, userhash=false and user-specified Content-Length header
+</name>
+# This test is to ensure 'Content-Length: 0' is sent while negotiating auth
+# even when there is a user-specified Content-Length header.
+# https://github.com/curl/curl/pull/1242
+<command>
+-H "Content-Length: 11" -u auser:apasswd --digest -d "junkelijunk" http://%HOSTIP:%HTTPPORT/2068
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol nonewline="yes">
+POST /2068 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 0
+Content-Type: application/x-www-form-urlencoded
+
+POST /2068 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2068", response="4bc9c97a72f1856bcec9b0e1518c6b7ee28773f91357d56840bdc30bd89ca68f", algorithm="SHA-512-256"
+Accept: */*
+Content-Length: 11
+Content-Type: application/x-www-form-urlencoded
+
+junkelijunk
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2069 b/tests/data/test2069
new file mode 100644
index 0000000..e8040a5
--- /dev/null
+++ b/tests/data/test2069
@@ -0,0 +1,89 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP Digest auth
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144", algorithm="SHA-512-256", userhash=true
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data>
+<data1000>
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144", algorithm="SHA-512-256", userhash=true
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+#
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+<name>
+HTTP POST --digest with SHA-512-256, userhash=true and user-specified Content-Length header
+</name>
+# This test is to ensure 'Content-Length: 0' is sent while negotiating auth
+# even when there is a user-specified Content-Length header.
+# https://github.com/curl/curl/pull/1242
+<command>
+-H "Content-Length: 11" -u auser:apasswd --digest -d "junkelijunk" http://%HOSTIP:%HTTPPORT/2069
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol nonewline="yes">
+POST /2069 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 0
+Content-Type: application/x-www-form-urlencoded
+
+POST /2069 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="fddc3bc7b753b73ab0848fd83cb20cbbca971258eb8d20c941dd5e0b010d66be", realm="testrealm", nonce="1053604144", uri="/2069", response="ff13d977110a471f30de75e747976e4de78d7a3d2425cd23ff46e67f4bc9ead7", algorithm="SHA-512-256", userhash=true
+Accept: */*
+Content-Length: 11
+Content-Type: application/x-www-form-urlencoded
+
+junkelijunk
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2070 b/tests/data/test2070
new file mode 100644
index 0000000..bc3898a
--- /dev/null
+++ b/tests/data/test2070
@@ -0,0 +1,41 @@
+<testcase>
+<info>
+<keywords>
+FILE
+</keywords>
+</info>
+
+<reply>
+<data>
+foo
+ bar
+bar
+ foo
+moo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+file
+</server>
+ <name>
+basic file:// file with no authority
+ </name>
+ <command>
+file:%PWD/log/test2070.txt
+</command>
+<file name="log/test2070.txt">
+foo
+ bar
+bar
+ foo
+moo
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test2071 b/tests/data/test2071
new file mode 100644
index 0000000..997dfff
--- /dev/null
+++ b/tests/data/test2071
@@ -0,0 +1,41 @@
+<testcase>
+<info>
+<keywords>
+FILE
+</keywords>
+</info>
+
+<reply>
+<data>
+foo
+ bar
+bar
+ foo
+moo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+file
+</server>
+ <name>
+basic file:// file with "127.0.0.1" hostname
+ </name>
+ <command>
+file://127.0.0.1/%PWD/log/test2070.txt
+</command>
+<file name="log/test2070.txt">
+foo
+ bar
+bar
+ foo
+moo
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test2072 b/tests/data/test2072
new file mode 100644
index 0000000..2949c25
--- /dev/null
+++ b/tests/data/test2072
@@ -0,0 +1,38 @@
+<testcase>
+<info>
+<keywords>
+FILE
+</keywords>
+</info>
+
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+file
+</server>
+<name>
+file:// with SMB path
+</name>
+<command>
+file:////bad-host%PWD/log/test1145.txt
+</command>
+<file name="log/test1145.txt">
+foo
+ bar
+bar
+ foo
+moo
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+# CURLE_URL_MALFORMAT is error code 3
+<errorcode>
+3
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test220 b/tests/data/test220
index 2fb0b8a..7fd2643 100644
--- a/tests/data/test220
+++ b/tests/data/test220
@@ -57,11 +57,14 @@ http://%HOSTIP:%HTTPPORT/220 --compressed
<strip>
^User-Agent:.*
</strip>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
<protocol>
GET /220 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Accept-Encoding: deflate, gzip
+Accept-Encoding: xxx
</protocol>
</verify>
diff --git a/tests/data/test221 b/tests/data/test221
index 95edb49..3a85439 100644
--- a/tests/data/test221
+++ b/tests/data/test221
@@ -57,11 +57,14 @@ http://%HOSTIP:%HTTPPORT/221 --compressed
<strip>
^User-Agent:.*
</strip>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
<protocol>
GET /221 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Accept-Encoding: deflate, gzip
+Accept-Encoding: xxx
</protocol>
<errorcode>
diff --git a/tests/data/test222 b/tests/data/test222
index a459486..865266e 100644
--- a/tests/data/test222
+++ b/tests/data/test222
@@ -188,11 +188,14 @@ http://%HOSTIP:%HTTPPORT/222 --compressed
<strip>
^User-Agent:.*
</strip>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
<protocol>
GET /222 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Accept-Encoding: deflate, gzip
+Accept-Encoding: xxx
</protocol>
</verify>
diff --git a/tests/data/test223 b/tests/data/test223
index 196e78c..884967e 100644
--- a/tests/data/test223
+++ b/tests/data/test223
@@ -78,11 +78,14 @@ http://%HOSTIP:%HTTPPORT/223 --compressed
<strip>
^User-Agent:.*
</strip>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
<protocol>
GET /223 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Accept-Encoding: deflate, gzip
+Accept-Encoding: xxx
</protocol>
<errorcode>
diff --git a/tests/data/test224 b/tests/data/test224
index 1c8ad23..a560468 100644
--- a/tests/data/test224
+++ b/tests/data/test224
@@ -93,11 +93,14 @@ http://%HOSTIP:%HTTPPORT/224 --compressed
<strip>
^User-Agent:.*
</strip>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
<protocol>
GET /224 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Accept-Encoding: deflate, gzip
+Accept-Encoding: xxx
</protocol>
</verify>
diff --git a/tests/data/test230 b/tests/data/test230
new file mode 100644
index 0000000..2174434
--- /dev/null
+++ b/tests/data/test230
@@ -0,0 +1,203 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+compressed
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data base64="yes">
+SFRUUC8xLjEgMjAwIE9LDQpEYXRlOiBNb24sIDI5IE5vdiAyMDA0IDIxOjU2OjUzIEdNVA0KU2Vy
+dmVyOiBBcGFjaGUvMS4zLjMxIChEZWJpYW4gR05VL0xpbnV4KSBtb2RfZ3ppcC8xLjMuMjYuMWEg
+UEhQLzQuMy45LTEgbW9kX3NzbC8yLjguMjAgT3BlblNTTC8wLjkuN2QgbW9kX3BlcmwvMS4yOQ0K
+VmFyeTogQWNjZXB0LUVuY29kaW5nDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1J
+U08tODg1OS0xDQpDb250ZW50LUVuY29kaW5nOiBkZWZsYXRlLCBpZGVudGl0eSwgZ3ppcA0KQ29u
+dGVudC1MZW5ndGg6IDEzMjgNCg0KH4sIAPpl+lkAAwEZBeb6eJzcWNtu4zYQfTeQf2D91AK2brYT
+OXC0KHLZBM02wdoFuk8GLdE2G0kUSMq5PPTbO5QoibEcr3eDvgRIYnLmnMPhDEmTmXx6SmK0IVxQ
+lp51XcvpIpKGLKLp6qx7M73r+/5o3He7n4LO5JeLu/PZt/tLlHH2DwllP6ZCAhBNv01nl19Qdy1l
+dmrbS07EOiFYWimR9gKHDySN7GXS1zzRd6yhFcmoC6JbWkEHocqm2k1vTqPAPXa9iW0YSkSEJZnj
+KCKAGI/9vuP3PRc5w1PHPfXGE9vwG4Q8Ux9R4DnOsO86fddHjnfqwc9AUyrEqzhSnJC5WDMugzDn
+cR2OYW/jl3kcF3CE0wjFdNGmFhAdHhGhljpnSVJSUoIkY7UAx/wZLRlHYUxJKvuCRgT99fUWSY5T
+sYSKWjCLRshQ3hkMogLhcgSlWqlwVd8ljYk46uRCddQY4jmV+MlCNxKJPMtAX6Dr2ey+V/yd9tAV
+tI86V0X74uZ81kOzy9s/L+Hz9uJ3gF3d3F72iuE/391fX36FNgzwSGKIqZTqZ0zInm7m0AoZe6BE
+FNooz2KGIxgCllqekKiZdQ9lWIhHxiPVhMjSPFkU9un09qgTEi7pkoZQVzD9QTj4mChDgWo8wQjF
+tCAbGXsknERHncVzlaQekmvyZsarslhHndkaqAjD74KmajMJSG2dapVgBpsOec5RJ8bpKscrIooY
+SLqhnKUJDCBAR5fQWBsbKnFM5fNchIyTYHTiD63RycTesm+BM8JDkAwGlntsYCvzFhrm8wB7bWwg
+C5Ne1yzLY8ybsY5HY4hhCMt529MiVAO6A8t3XxFeh2I4ymCc0Su0EQ7HxbnhWyNnYuuO6ZmHLAdd
+z6282vAKUw7iD2qMMYDIFyLkNJNwRIpgoE6H16YSBqVPw/Vc7eXggixxHsuJbRpLGNR/Xh1gGZQ9
+2HloVielrdaLPbFbrEZszRLythAsYMpLFXV42iZD69YCjaZcvRwuB2CtpGiNyOLFO1wEwFpE0RqR
+F5odLgJgLaJojUi4hj1GYrY6XKqmaMFGopHlWXK4IIC1lKI1IhFZHC4CYC2iaI0IE0+HiwBYiyia
+US8RqfPyB2pWEqq6abqxzHMOaRMk0Ou36hqF2YgfKMlGVMXYCENE3RwOV1FoLVMQG52Ecs744Uol
+XmtpslnXhAVVraBZemIKhxyk4MvNzP4bncPpASmjeYJuS8fErhAar76n5JyTmNSZa5nn+v4WnFiu
+Z8EF6Q33G2x1rzo5dvxRi1hdsNocdS/afXHaBSznYu+azATOUQITXjM5l2v4qoactUwlEucSbjKi
+DqnsV93aoE9gnFISo6kkKXzDrya26WxRoEq76/7vAq8ioopsIFt0zmIS3D2mhNe4wlRFapuhVr1q
+CasveE4TmmJpzk5yuCEUtYGC1p2W1/OO97kHe7n7nK7v7+W6e8eFpbE/6r1u93i4zz3eS/bHe73O
+Xrc7+k7c3wlsf2SD1tjl/W67/LAmMngywUMMrqO1Tm18RvI5I2ddTkJ4HSibeknVi7LBmRvZUUPt
+cuwk6nsLuE+Gqhg7XTuZxuOsRd1+uL3FlVSqDQV2uLOjX/Vt6redWiW23mkN4u28seLehuP/L2nO
+T2dsOHhnxtT76uMnyvUGI/cdmXqBp9jHz9LAc4Yn78jSNaFJhOOPn6jhcDTw3pGosA9PffEzeTIs
++qyv/ysUdP4DAAD//4IzEaNjAAAAAP//AwDdOI7RbCh2MRkFAAA=
+</data>
+
+<datacheck>
+HTTP/1.1 200 OK
+Date: Mon, 29 Nov 2004 21:56:53 GMT
+Server: Apache/1.3.31 (Debian GNU/Linux) mod_gzip/1.3.26.1a PHP/4.3.9-1 mod_ssl/2.8.20 OpenSSL/0.9.7d mod_perl/1.29
+Vary: Accept-Encoding
+Content-Type: text/html; charset=ISO-8859-1
+Content-Encoding: deflate, identity, gzip
+Content-Length: 1328
+
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE project-listing SYSTEM "http://freshmeat.net/backend/fm-projects-0.4.dtd">
+<project-listing>
+ <project>
+ <project_id>1612</project_id>
+ <date_added>1998-08-21 04:01:29</date_added>
+ <date_updated>2004-10-18 02:22:23</date_updated>
+ <projectname_short>curl</projectname_short>
+ <projectname_full>curl and libcurl</projectname_full>
+ <desc_short>Command line tool and library for client-side URL transfers.</desc_short>
+ <desc_full>curl and libcurl is a tool for transferring files
+using URL syntax. It supports HTTP, HTTPS, FTP,
+FTPS, DICT, TELNET, LDAP, FILE, and GOPHER, as
+well as HTTP-post, HTTP-put, cookies, FTP upload,
+resumed transfers, passwords, portnumbers, SSL
+certificates, Kerberos, and proxies. It is powered
+by libcurl, the client-side URL transfer library.
+There are bindings to libcurl for over 20
+languages and environments.
+</desc_full>
+ <vitality_score>5784.57</vitality_score>
+ <vitality_percent>3.16</vitality_percent>
+ <vitality_rank>169</vitality_rank>
+ <popularity_score>6594.54</popularity_score>
+ <popularity_percent>13.81</popularity_percent>
+ <popularity_rank>105</popularity_rank>
+ <rating>8.50</rating>
+ <rating_count>21</rating_count>
+ <rating_rank>183</rating_rank>
+ <subscriptions>323</subscriptions>
+ <branch_name>Default</branch_name>
+ <url_project_page>http://freshmeat.net/projects/curl/</url_project_page>
+ <url_homepage>http://freshmeat.net/redir/curl/1612/url_homepage/</url_homepage>
+ <url_tgz>http://freshmeat.net/redir/curl/1612/url_tgz/</url_tgz>
+ <url_bz2>http://freshmeat.net/redir/curl/1612/url_bz2/</url_bz2>
+ <url_zip>http://freshmeat.net/redir/curl/1612/url_zip/</url_zip>
+ <url_changelog>http://freshmeat.net/redir/curl/1612/url_changelog/</url_changelog>
+ <url_rpm>http://freshmeat.net/redir/curl/1612/url_rpm/</url_rpm>
+ <url_deb>http://freshmeat.net/redir/curl/1612/url_deb/</url_deb>
+ <url_osx>http://freshmeat.net/redir/curl/1612/url_osx/</url_osx>
+ <url_bsdport>http://freshmeat.net/redir/curl/1612/url_bsdport/</url_bsdport>
+ <url_purchase></url_purchase>
+ <url_cvs>http://freshmeat.net/redir/curl/1612/url_cvs/</url_cvs>
+ <url_list>http://freshmeat.net/redir/curl/1612/url_list/</url_list>
+ <url_mirror>http://freshmeat.net/redir/curl/1612/url_mirror/</url_mirror>
+ <url_demo></url_demo>
+ <license>MIT/X Consortium License</license>
+ <latest_release>
+ <latest_release_version>7.12.2</latest_release_version>
+ <latest_release_id>176085</latest_release_id>
+ <latest_release_date>2004-10-18 02:22:23</latest_release_date>
+ </latest_release>
+ <screenshot_thumb></screenshot_thumb>
+ <authors>
+ <author>
+ <author_name>Daniel Stenberg</author_name>
+ <author_url>http://freshmeat.net/~bagder/</author_url>
+ <author_role>Owner</author_role>
+ </author>
+ </authors>
+ <descriminators>
+ <trove_id>12</trove_id>
+ <trove_id>226</trove_id>
+ <trove_id>3</trove_id>
+ <trove_id>2</trove_id>
+ <trove_id>188</trove_id>
+ <trove_id>216</trove_id>
+ <trove_id>200</trove_id>
+ <trove_id>220</trove_id>
+ <trove_id>164</trove_id>
+ <trove_id>90</trove_id>
+ <trove_id>89</trove_id>
+ <trove_id>809</trove_id>
+ <trove_id>150</trove_id>
+ <trove_id>224</trove_id>
+ <trove_id>900</trove_id>
+ <trove_id>839</trove_id>
+ </descriminators>
+ <dependencies>
+ <dependency type="recommended">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>7464</dependency_branch_id>
+ <dependency_project_id>7464</dependency_project_id>
+ <dependency_project_title>OpenSSL (Default)</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>7443</dependency_project_id>
+ <dependency_project_title>OpenLDAP</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>12351</dependency_project_id>
+ <dependency_project_title>zlib</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>32047</dependency_project_id>
+ <dependency_project_title>Heimdal</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>44532</dependency_project_id>
+ <dependency_project_title>c-ares</dependency_project_title>
+ </dependency>
+ </dependencies>
+ </project>
+</project-listing>
+</datacheck>
+
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+libz
+</features>
+<server>
+http
+</server>
+ <name>
+HTTP GET multiply compressed content
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/230 --compressed
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
+<protocol>
+GET /230 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Accept-Encoding: xxx
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test237 b/tests/data/test237
index 9a40f1f..e9147dc 100644
--- a/tests/data/test237
+++ b/tests/data/test237
@@ -30,13 +30,9 @@ ftp://%HOSTIP:%FTPPORT/237 --disable-epsv
# certain hosts with buggy resolver code, the resulting address (192.0.2.127)
# is from an address block that is guaranteed never to be assigned (RFC3330).
<verify>
-# curl: (15) Can't resolve new host 1216.256.2.127:32639
-# 15 => CURLE_FTP_CANT_GET_HOST
-# some systems just don't fail on the illegal host name/address but instead
-# moves on and attempt to connect to... yes, to what?
-# 7= CURLE_COULDNT_CONNECT
+# 14 = CURLE_FTP_WEIRD_227_FORMAT
<errorcode>
-15, 7
+14
</errorcode>
<protocol>
USER anonymous
diff --git a/tests/data/test244 b/tests/data/test244
new file mode 100644
index 0000000..8ce4b63
--- /dev/null
+++ b/tests/data/test244
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+FTP
+PASV
+CWD
+--ftp-method
+nocwd
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data mode="text">
+total 20
+drwxr-xr-x 8 98 98 512 Oct 22 13:06 .
+drwxr-xr-x 8 98 98 512 Oct 22 13:06 ..
+drwxr-xr-x 2 98 98 512 May 2 1996 .NeXT
+-r--r--r-- 1 0 1 35 Jul 16 1996 README
+lrwxrwxrwx 1 0 1 7 Dec 9 1999 bin -> usr/bin
+dr-xr-xr-x 2 0 1 512 Oct 1 1997 dev
+drwxrwxrwx 2 98 98 512 May 29 16:04 download.html
+dr-xr-xr-x 2 0 1 512 Nov 30 1995 etc
+drwxrwxrwx 2 98 1 512 Oct 30 14:33 pub
+dr-xr-xr-x 5 0 1 512 Oct 1 1997 usr
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP dir listing with nocwd and URL encoded path
+ </name>
+ <command>
+--ftp-method nocwd ftp://%HOSTIP:%FTPPORT/fir%23t/th%69rd/244/
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE A
+LIST fir#t/third/244/
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test259 b/tests/data/test259
index 9532887..6e18536 100644
--- a/tests/data/test259
+++ b/tests/data/test259
@@ -59,7 +59,7 @@ crypto
HTTP POST multipart with Expect: header using proxy anyauth (Digest)
</name>
<command>
--x http://%HOSTIP:%HTTPPORT http://remotehost:54321/we/want/259 -F name=daniel -F tool=curl -F file=@log/test259.txt -U uuuser:pppassword --proxy-anyauth
+-x http://%HOSTIP:%HTTPPORT http://remotehost:54321/we/want/259 -F name=daniel -F tool=curl -F file=@log/test259.txt -U uuuser:pppassword --proxy-anyauth -H "Expect: 100-continue"
</command>
# We create this file before the command is invoked!
<file name="log/test259.txt">
@@ -80,8 +80,8 @@ Host: remotehost:54321
User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*
Proxy-Connection: Keep-Alive
-Content-Length: 409
Expect: 100-continue
+Content-Length: 409
Content-Type: multipart/form-data; boundary=----------------------------7c633d5c27ce
------------------------------7c633d5c27ce
@@ -107,8 +107,8 @@ User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 z
Proxy-Authorization: Digest username="uuuser", realm="many secrets", nonce="911", uri="/we/want/259", response="b479994d13e60f3aa192a67c5892ddc5"
Accept: */*
Proxy-Connection: Keep-Alive
-Content-Length: 409
Expect: 100-continue
+Content-Length: 409
Content-Type: multipart/form-data; boundary=----------------------------7c633d5c27ce
------------------------------7c633d5c27ce
diff --git a/tests/data/test277 b/tests/data/test277
index a509b40..d3e9d0f 100644
--- a/tests/data/test277
+++ b/tests/data/test277
@@ -45,12 +45,11 @@ POST /want/277 HTTP/1.1
User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 145
-Expect: 100-continue
+Content-Length: 146
Content-Type: text/info; boundary=------------------------
--------------------------
-Content-Disposition: form-data; name="name"
+Content-Disposition: attachment; name="name"
daniel
----------------------------
diff --git a/tests/data/test298 b/tests/data/test298
index 80913e8..09b127f 100644
--- a/tests/data/test298
+++ b/tests/data/test298
@@ -25,7 +25,7 @@ ftp
FTP CWD with --ftp-method nocwd
</name>
<command>
---ftp-method nocwd ftp://%HOSTIP:%FTPPORT/first/second/third/298
+--ftp-method nocwd ftp://%HOSTIP:%FTPPORT/first/second/th%69rd/298
</command>
</client>
diff --git a/tests/data/test308 b/tests/data/test308
index d20556a..1a3c8ec 100644
--- a/tests/data/test308
+++ b/tests/data/test308
@@ -12,6 +12,7 @@ FAILURE
<client>
<features>
OpenSSL
+!MultiSSL
</features>
<server>
https
diff --git a/tests/data/test314 b/tests/data/test314
new file mode 100644
index 0000000..f4703cd
--- /dev/null
+++ b/tests/data/test314
@@ -0,0 +1,198 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+compressed
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data base64="yes">
+SFRUUC8xLjEgMjAwIE9LDQpEYXRlOiBNb24sIDI5IE5vdiAyMDA0IDIxOjU2OjUzIEdNVA0KU2Vy
+dmVyOiBBcGFjaGUvMS4zLjMxIChEZWJpYW4gR05VL0xpbnV4KSBtb2RfZ3ppcC8xLjMuMjYuMWEg
+UEhQLzQuMy45LTEgbW9kX3NzbC8yLjguMjAgT3BlblNTTC8wLjkuN2QgbW9kX3BlcmwvMS4yOQ0K
+VmFyeTogQWNjZXB0LUVuY29kaW5nDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1J
+U08tODg1OS0xDQpDb250ZW50LUVuY29kaW5nOiBicg0KQ29udGVudC1MZW5ndGg6IDEwNTYNCg0K
+G7ATAJwFdhtdgaQ8i+mZBoO/lwogPKuqHpeP38jV5TDITTB7/oJVCS69FFDKWDVtMk8y4SfMSu/a
+9vvLxWPweDCKePH/2y9VIkbF+EgCYSNs9v53J8QTIHT4ZucHCCRQiXRdT6XdE60KSlbIvobr5rJQ
+sRn7ipIjMVMq3Go+/UXtY2d0yP1qaaGSxCn8nZuUNGh74KOI7EEkgFl1tjYytkpc9mJJy9J+wTTI
++HroUQP2VR2DYkNoUECqgtOLlGcVEln4+eVzEWcrb8fNrcrVxLArJBpSd8FX8eZs8ebJUO7aBZ5e
+pHz6zel7lhLlfHoQIkGh34riaSVr7VTGDmmO6HjSCzKO27LybZ9I3CtMSD2Il4mB131Tlcbut1Bd
+zL4XU4DZYMLBN4jwVZEoHpjzHX+vQ3prnrNw4oB7OWOr/fBzjvfjDuO24WxwzPqPo+V6VNcthz1p
+fF1+sMK4yWY7He33m32EuQgQFSZ3a5Wu4FyQcAb45Z+wUxM5XCmX52YmdUR2YTs+W+bNw2EZSfMR
+cP3CinyJI/cTT+JubL3T4COkhz0Rffeoh/3E4c/6ugma1ubhokYecXp8HBwmeDL48d62H26u69DO
+yMhg1PFj+oVDWnK4K+L5AlRr0mpJLqoGHrzflMLQ6qL2oIo9hN6qCeZEEqXM+/KunVYpWVeTY+ht
+hA0y5p5RLLTTS4cehaJOpbFyAVxZOardIkJAVx0NshOZY4hDbts9BXsXzFEOgsFhrIQYgh04StZz
+llIRMVDptYlwGmpZCHHmVECdGiFIfEhkQ2INSwMCuuKpaycgSOO9hJA9UFKDBdzTiLJBP9oUVkKL
+bHjwicICCi3k0HcppcvQaW27AMI06kuQU4WUGizgnkaUDcZqCgsotMgG528UFlBo8SFpb05OAjJq
+2gEI0UgN93KS1OvAOYSLN5IaLOCeRnQpJXuLUwcm7urpg6lYxAk26uEoADdsRytHGkSWjOKP6T07
+wiceuNo7CXyu7ohtUZXoEWawRHGVkPDVJYqH+xa0DDRKSSgM4K3efLVPSTaUPvBGIZgnn2JBFFWa
+MsKZguUuUnz6qaSGqnmGAYiupdC1EFye58V4CLbWVjJU4NF2jrOUYR/Dv04zYwVQtQcFzgmK6H4N
+HAhmb0a6pQRKxZaZ+x2vCC7sCuIu4dNCATwqzk12ue6oEsxzYybLPNGJd084M43O9W8E+5/drd/F
+QVB2X4jlFlCuHuWeQxQo+w73Tb9swW692v3BlfQTP1ClWzuJ+RwuSb9m4V3QVa4MEL+0Xzc5FX9P
++YX1cgaL+6oMHw7L+IOjOt+n1BOloyqk35lLHX7RZmu8SckMnGP95XjWc4FRKP9x/iXrKaeCnut/
+zstyZdJS5FRmBT/wb5KK9YWBGnqPLO8isN2HS8gA
+</data>
+
+<datacheck>
+HTTP/1.1 200 OK
+Date: Mon, 29 Nov 2004 21:56:53 GMT
+Server: Apache/1.3.31 (Debian GNU/Linux) mod_gzip/1.3.26.1a PHP/4.3.9-1 mod_ssl/2.8.20 OpenSSL/0.9.7d mod_perl/1.29
+Vary: Accept-Encoding
+Content-Type: text/html; charset=ISO-8859-1
+Content-Encoding: br
+Content-Length: 1056
+
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE project-listing SYSTEM "http://freshmeat.net/backend/fm-projects-0.4.dtd">
+<project-listing>
+ <project>
+ <project_id>1612</project_id>
+ <date_added>1998-08-21 04:01:29</date_added>
+ <date_updated>2004-10-18 02:22:23</date_updated>
+ <projectname_short>curl</projectname_short>
+ <projectname_full>curl and libcurl</projectname_full>
+ <desc_short>Command line tool and library for client-side URL transfers.</desc_short>
+ <desc_full>curl and libcurl is a tool for transferring files
+using URL syntax. It supports HTTP, HTTPS, FTP,
+FTPS, DICT, TELNET, LDAP, FILE, and GOPHER, as
+well as HTTP-post, HTTP-put, cookies, FTP upload,
+resumed transfers, passwords, portnumbers, SSL
+certificates, Kerberos, and proxies. It is powered
+by libcurl, the client-side URL transfer library.
+There are bindings to libcurl for over 20
+languages and environments.
+</desc_full>
+ <vitality_score>5784.57</vitality_score>
+ <vitality_percent>3.16</vitality_percent>
+ <vitality_rank>169</vitality_rank>
+ <popularity_score>6594.54</popularity_score>
+ <popularity_percent>13.81</popularity_percent>
+ <popularity_rank>105</popularity_rank>
+ <rating>8.50</rating>
+ <rating_count>21</rating_count>
+ <rating_rank>183</rating_rank>
+ <subscriptions>323</subscriptions>
+ <branch_name>Default</branch_name>
+ <url_project_page>http://freshmeat.net/projects/curl/</url_project_page>
+ <url_homepage>http://freshmeat.net/redir/curl/1612/url_homepage/</url_homepage>
+ <url_tgz>http://freshmeat.net/redir/curl/1612/url_tgz/</url_tgz>
+ <url_bz2>http://freshmeat.net/redir/curl/1612/url_bz2/</url_bz2>
+ <url_zip>http://freshmeat.net/redir/curl/1612/url_zip/</url_zip>
+ <url_changelog>http://freshmeat.net/redir/curl/1612/url_changelog/</url_changelog>
+ <url_rpm>http://freshmeat.net/redir/curl/1612/url_rpm/</url_rpm>
+ <url_deb>http://freshmeat.net/redir/curl/1612/url_deb/</url_deb>
+ <url_osx>http://freshmeat.net/redir/curl/1612/url_osx/</url_osx>
+ <url_bsdport>http://freshmeat.net/redir/curl/1612/url_bsdport/</url_bsdport>
+ <url_purchase></url_purchase>
+ <url_cvs>http://freshmeat.net/redir/curl/1612/url_cvs/</url_cvs>
+ <url_list>http://freshmeat.net/redir/curl/1612/url_list/</url_list>
+ <url_mirror>http://freshmeat.net/redir/curl/1612/url_mirror/</url_mirror>
+ <url_demo></url_demo>
+ <license>MIT/X Consortium License</license>
+ <latest_release>
+ <latest_release_version>7.12.2</latest_release_version>
+ <latest_release_id>176085</latest_release_id>
+ <latest_release_date>2004-10-18 02:22:23</latest_release_date>
+ </latest_release>
+ <screenshot_thumb></screenshot_thumb>
+ <authors>
+ <author>
+ <author_name>Daniel Stenberg</author_name>
+ <author_url>http://freshmeat.net/~bagder/</author_url>
+ <author_role>Owner</author_role>
+ </author>
+ </authors>
+ <descriminators>
+ <trove_id>12</trove_id>
+ <trove_id>226</trove_id>
+ <trove_id>3</trove_id>
+ <trove_id>2</trove_id>
+ <trove_id>188</trove_id>
+ <trove_id>216</trove_id>
+ <trove_id>200</trove_id>
+ <trove_id>220</trove_id>
+ <trove_id>164</trove_id>
+ <trove_id>90</trove_id>
+ <trove_id>89</trove_id>
+ <trove_id>809</trove_id>
+ <trove_id>150</trove_id>
+ <trove_id>224</trove_id>
+ <trove_id>900</trove_id>
+ <trove_id>839</trove_id>
+ </descriminators>
+ <dependencies>
+ <dependency type="recommended">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>7464</dependency_branch_id>
+ <dependency_project_id>7464</dependency_project_id>
+ <dependency_project_title>OpenSSL (Default)</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>7443</dependency_project_id>
+ <dependency_project_title>OpenLDAP</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>12351</dependency_project_id>
+ <dependency_project_title>zlib</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>32047</dependency_project_id>
+ <dependency_project_title>Heimdal</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>44532</dependency_project_id>
+ <dependency_project_title>c-ares</dependency_project_title>
+ </dependency>
+ </dependencies>
+ </project>
+</project-listing>
+</datacheck>
+
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+brotli
+</features>
+<server>
+http
+</server>
+ <name>
+HTTP GET brotli compressed content
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/314 --compressed
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
+<protocol>
+GET /314 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Accept-Encoding: xxx
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test315 b/tests/data/test315
new file mode 100644
index 0000000..c75d9ae
--- /dev/null
+++ b/tests/data/test315
@@ -0,0 +1,91 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+compressed
+FAILURE
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+# this brotli chunk has three bytes removed from the beginning
+<data base64="yes">
+SFRUUC8xLjEgMjAwIE9LDQpEYXRlOiBNb24sIDI5IE5vdiAyMDA0IDIxOjU2OjUzIEdNVA0KU2Vy
+dmVyOiBBcGFjaGUvMS4zLjMxIChEZWJpYW4gR05VL0xpbnV4KSBtb2RfZ3ppcC8xLjMuMjYuMWEg
+UEhQLzQuMy45LTEgbW9kX3NzbC8yLjguMjAgT3BlblNTTC8wLjkuN2QgbW9kX3BlcmwvMS4yOQ0K
+VmFyeTogQWNjZXB0LUVuY29kaW5nDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1J
+U08tODg1OS0xDQpDb250ZW50LUVuY29kaW5nOiBicg0KQ29udGVudC1MZW5ndGg6IDEwNTYNCg0K
+AJwFdhtdgaQ8i+mZBoO/lwogPKuqHpeP38jV5TDITTB7/oJVCS69FFDKWDVtMk8y4SfMSu/a9vvL
+xWPweDCKePH/2y9VIkbF+EgCYSNs9v53J8QTIHT4ZucHCCRQiXRdT6XdE60KSlbIvobr5rJQsRn7
+ipIjMVMq3Go+/UXtY2d0yP1qaaGSxCn8nZuUNGh74KOI7EEkgFl1tjYytkpc9mJJy9J+wTTI+Hro
+UQP2VR2DYkNoUECqgtOLlGcVEln4+eVzEWcrb8fNrcrVxLArJBpSd8FX8eZs8ebJUO7aBZ5epHz6
+zel7lhLlfHoQIkGh34riaSVr7VTGDmmO6HjSCzKO27LybZ9I3CtMSD2Il4mB131Tlcbut1BdzL4X
+U4DZYMLBN4jwVZEoHpjzHX+vQ3prnrNw4oB7OWOr/fBzjvfjDuO24WxwzPqPo+V6VNcthz1pfF1+
+sMK4yWY7He33m32EuQgQFSZ3a5Wu4FyQcAb45Z+wUxM5XCmX52YmdUR2YTs+W+bNw2EZSfMRcP3C
+inyJI/cTT+JubL3T4COkhz0Rffeoh/3E4c/6ugma1ubhokYecXp8HBwmeDL48d62H26u69DOyMhg
+1PFj+oVDWnK4K+L5AlRr0mpJLqoGHrzflMLQ6qL2oIo9hN6qCeZEEqXM+/KunVYpWVeTY+hthA0y
+5p5RLLTTS4cehaJOpbFyAVxZOardIkJAVx0NshOZY4hDbts9BXsXzFEOgsFhrIQYgh04StZzllIR
+MVDptYlwGmpZCHHmVECdGiFIfEhkQ2INSwMCuuKpaycgSOO9hJA9UFKDBdzTiLJBP9oUVkKLbHjw
+icICCi3k0HcppcvQaW27AMI06kuQU4WUGizgnkaUDcZqCgsotMgG528UFlBo8SFpb05OAjJq2gEI
+0UgN93KS1OvAOYSLN5IaLOCeRnQpJXuLUwcm7urpg6lYxAk26uEoADdsRytHGkSWjOKP6T07wice
+uNo7CXyu7ohtUZXoEWawRHGVkPDVJYqH+xa0DDRKSSgM4K3efLVPSTaUPvBGIZgnn2JBFFWaMsKZ
+guUuUnz6qaSGqnmGAYiupdC1EFye58V4CLbWVjJU4NF2jrOUYR/Dv04zYwVQtQcFzgmK6H4NHAhm
+b0a6pQRKxZaZ+x2vCC7sCuIu4dNCATwqzk12ue6oEsxzYybLPNGJd084M43O9W8E+5/drd/FQVB2
+X4jlFlCuHuWeQxQo+w73Tb9swW692v3BlfQTP1ClWzuJ+RwuSb9m4V3QVa4MEL+0Xzc5FX9P+YX1
+cgaL+6oMHw7L+IOjOt+n1BOloyqk35lLHX7RZmu8SckMnGP95XjWc4FRKP9x/iXrKaeCnut/zsty
+ZdJS5FRmBT/wb5KK9YWBGnqPLO8isN2HS8gA
+</data>
+
+<datacheck>
+HTTP/1.1 200 OK
+Date: Mon, 29 Nov 2004 21:56:53 GMT
+Server: Apache/1.3.31 (Debian GNU/Linux) mod_gzip/1.3.26.1a PHP/4.3.9-1 mod_ssl/2.8.20 OpenSSL/0.9.7d mod_perl/1.29
+Vary: Accept-Encoding
+Content-Type: text/html; charset=ISO-8859-1
+Content-Encoding: br
+Content-Length: 1056
+
+</datacheck>
+
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+brotli
+</features>
+<server>
+http
+</server>
+ <name>
+HTTP GET brotli compressed content with broken header
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/315 --compressed
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
+<protocol>
+GET /315 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Accept-Encoding: xxx
+
+</protocol>
+<errorcode>
+61
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test4 b/tests/data/test4
index df69d32..542347d 100644
--- a/tests/data/test4
+++ b/tests/data/test4
@@ -30,7 +30,7 @@ http
Replaced internal and added custom HTTP headers
</name>
<command>
- -H "extra-header: here" -H "Accept: replaced" -H "X-Custom-Header;" -H "X-Test: foo; " -H "X-Test:" -H "X-Test2: foo;" -H "X-Test3: " -H "X-Test4; " -H "X-Test5;ignored" http://%HOSTIP:%HTTPPORT/4
+ -H "extra-header: here" -H "Accept: replaced" -H "X-Custom-Header;" -H "X-Test: foo; " -H "X-Test:" -H "X-Test2: foo;" -H "X-Test3: " -H "X-Test4; " -H "X-Test5;ignored" http://%HOSTIP:%HTTPPORT/4 http://%HOSTIP:%HTTPPORT/4
</command>
</client>
@@ -49,6 +49,14 @@ X-Custom-Header:
X-Test: foo;
X-Test2: foo;
+GET /4 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+extra-header: here
+Accept: replaced
+X-Custom-Header:
+X-Test: foo;
+X-Test2: foo;
+
</protocol>
</verify>
</testcase>
diff --git a/tests/data/test46 b/tests/data/test46
index d1045b3..abcbda8 100644
--- a/tests/data/test46
+++ b/tests/data/test46
@@ -19,7 +19,7 @@ Set-Cookie: ckyPersistent=permanent; expires=Fri, 02-Feb-2035 11:56:27 GMT; path
Set-Cookie: ckySession=temporary; path=/
Set-Cookie: ASPSESSIONIDQGGQQSJJ=GKNBDIFAAOFDPDAIEAKDIBKE; path=/
Set-Cookie: justaname=; path=/;
-Set-Cookie: simplyhuge=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+Set-Cookie: simplyhuge=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Cache-control: private
Content-Length: 41
@@ -83,7 +83,7 @@ www.loser.com FALSE / FALSE 2139150993 UID 99
%HOSTIP FALSE / FALSE 0 ckySession temporary
%HOSTIP FALSE / FALSE 0 ASPSESSIONIDQGGQQSJJ GKNBDIFAAOFDPDAIEAKDIBKE
%HOSTIP FALSE / FALSE 0 justaname
-%HOSTIP FALSE /want/ FALSE 0 simplyhuge zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+%HOSTIP FALSE /want/ FALSE 0 simplyhuge zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
</file>
</verify>
</testcase>
diff --git a/tests/data/test506 b/tests/data/test506
index 40eee25..70d2daa 100644
--- a/tests/data/test506
+++ b/tests/data/test506
@@ -195,6 +195,8 @@ CURLOPT_COOKIEJAR
CURLOPT_COOKIELIST RELOAD
lock: cookie [Pigs in space]: 78
unlock: cookie [Pigs in space]: 79
+lock: cookie [Pigs in space]: 80
+unlock: cookie [Pigs in space]: 81
loaded cookies:
-----------------
.host.foo.com TRUE / FALSE 1896263787 injected yes
@@ -207,17 +209,17 @@ loaded cookies:
www.host.foo.com FALSE / FALSE 1993463787 test6 six_more
-----------------
try SHARE_CLEANUP...
-lock: share [Pigs in space]: 80
-unlock: share [Pigs in space]: 81
+lock: share [Pigs in space]: 82
+unlock: share [Pigs in space]: 83
SHARE_CLEANUP failed, correct
CLEANUP
-lock: cookie [Pigs in space]: 82
-unlock: cookie [Pigs in space]: 83
-lock: share [Pigs in space]: 84
-unlock: share [Pigs in space]: 85
-SHARE_CLEANUP
+lock: cookie [Pigs in space]: 84
+unlock: cookie [Pigs in space]: 85
lock: share [Pigs in space]: 86
unlock: share [Pigs in space]: 87
+SHARE_CLEANUP
+lock: share [Pigs in space]: 88
+unlock: share [Pigs in space]: 89
GLOBAL_CLEANUP
</stdout>
<stderr>
diff --git a/tests/data/test554 b/tests/data/test554
index 3419e5e..24d9c04 100644
--- a/tests/data/test554
+++ b/tests/data/test554
@@ -68,8 +68,7 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
POST /554 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 718
-Expect: 100-continue
+Content-Length: 744
Content-Type: multipart/form-data; boundary=----------------------------
------------------------------
@@ -88,6 +87,7 @@ Content-Disposition: form-data; name="filename"
postit2.c
------------------------------
Content-Disposition: form-data; name="submit"
+Content-Type: text/plain
send
------------------------------
@@ -99,8 +99,7 @@ blah blah
POST /554 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 732
-Expect: 100-continue
+Content-Length: 758
Content-Type: multipart/form-data; boundary=----------------------------
------------------------------
@@ -119,6 +118,7 @@ Content-Disposition: form-data; name="filename"
postit2.c
------------------------------
Content-Disposition: form-data; name="submit"
+Content-Type: text/plain
send
------------------------------
diff --git a/tests/data/test564 b/tests/data/test564
index 72bf129..4c9ecd4 100644
--- a/tests/data/test564
+++ b/tests/data/test564
@@ -1,4 +1,6 @@
<testcase>
+# Warning: if this test fails to start the SSH server, check that none of
+# the user's shell profiles sends output to stdout of a non-interactive shell.
<info>
<keywords>
FTP
diff --git a/tests/data/test577 b/tests/data/test577
new file mode 100644
index 0000000..5255492
--- /dev/null
+++ b/tests/data/test577
@@ -0,0 +1,55 @@
+<testcase>
+
+#Informational
+<info>
+<keywords>
+RTSP
+OPTIONS
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+RTSP/1.1234567 200 OK
+Server: RTSPD/libcurl-test
+CSeq: 1
+Public: DESCRIBE, OPTIONS, SETUP, TEARDOWN, PLAY, PAUSE
+Curl-Private: swsclose
+</data>
+<datacheck>
+</datacheck>
+</reply>
+
+# Client-Side
+<client>
+<server>
+rtsp
+</server>
+<tool>
+lib567
+</tool>
+
+<name>
+Funny RTSP version in response
+</name>
+<command>
+rtsp://%HOSTIP:%RTSPPORT/577
+</command>
+</client>
+
+<verify>
+<protocol>
+OPTIONS rtsp://%HOSTIP:%RTSPPORT/577 RTSP/1.0
+CSeq: 1
+User-Agent: test567
+Test-Number: 567
+
+</protocol>
+# 8 == CURLE_WEIRD_SERVER_REPLY
+<errorcode>
+8
+</errorcode>
+</verify>
+
+</testcase>
diff --git a/tests/data/test587 b/tests/data/test587
index 69cbe1e..0d9530e 100644
--- a/tests/data/test587
+++ b/tests/data/test587
@@ -3,6 +3,7 @@
<keywords>
HTTP
HTTP POST
+flaky
</keywords>
</info>
@@ -42,8 +43,7 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
POST /587 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 718
-Expect: 100-continue
+Content-Length: 744
Content-Type: multipart/form-data; boundary=----------------------------
------------------------------
diff --git a/tests/data/test589 b/tests/data/test589
new file mode 100644
index 0000000..451bb15
--- /dev/null
+++ b/tests/data/test589
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP MIME
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 3
+
+OK
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib589
+</tool>
+
+ <name>
+make a HTTP MIME POST set to NULL
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/589
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+POST /589 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 0
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test642 b/tests/data/test642
new file mode 100644
index 0000000..41fd444
--- /dev/null
+++ b/tests/data/test642
@@ -0,0 +1,42 @@
+<testcase>
+<info>
+<keywords>
+SFTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+Test data
+for ssh test
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+sftp
+</server>
+ <name>
+SFTP retrieval
+ </name>
+ <command>
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: --compressed-ssh sftp://%HOSTIP:%SSHPORT%PWD/log/file642.txt --insecure
+</command>
+<file name="log/file642.txt">
+Test data
+for ssh test
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<valgrind>
+disable
+</valgrind>
+</verify>
+</testcase>
diff --git a/tests/data/test643 b/tests/data/test643
new file mode 100644
index 0000000..0eaf22c
--- /dev/null
+++ b/tests/data/test643
@@ -0,0 +1,131 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP MIME POST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+<datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib643
+</tool>
+
+ <name>
+HTTP multi-part mimepost using read callback for the file part
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/643
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+# Note that the stripping above removes 12 bytes from every occurrence of the
+# boundary string and since 5 of them are in the body contents, we see
+# (5*12) == 60 bytes less
+<protocol>
+POST /643 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 718
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="sendfile"; filename="postit2.c"
+
+this is what we post to the silly web server
+
+------------------------------
+Content-Disposition: form-data; name="callbackdata"
+
+this is what we post to the silly web server
+
+------------------------------
+Content-Disposition: form-data; name="filename"
+
+postit2.c
+------------------------------
+Content-Disposition: form-data; name="submit"
+
+send
+------------------------------
+Content-Disposition: form-data; name="somename"; filename="somefile.txt"
+Content-Type: text/plain
+
+blah blah
+--------------------------------
+POST /643 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 732
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="sendfile alternative"; filename="file name 2"
+
+this is what we post to the silly web server
+
+------------------------------
+Content-Disposition: form-data; name="callbackdata"
+
+this is what we post to the silly web server
+
+------------------------------
+Content-Disposition: form-data; name="filename"
+
+postit2.c
+------------------------------
+Content-Disposition: form-data; name="submit"
+
+send
+------------------------------
+Content-Disposition: form-data; name="somename"; filename="somefile.txt"
+Content-Type: text/plain
+
+blah blah
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test644 b/tests/data/test644
new file mode 100644
index 0000000..4c9a501
--- /dev/null
+++ b/tests/data/test644
@@ -0,0 +1,59 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP MIME POST
+flaky
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib644
+</tool>
+
+ <name>
+HTTP multi-part formpost with aborted read callback
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/644
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /644 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 718
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="sendfile"; filename="postit2.c"
+
+</protocol>
+# CURLE_ABORTED_BY_CALLBACK (42)
+<errorcode>
+42
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test645 b/tests/data/test645
new file mode 100644
index 0000000..6533944
--- /dev/null
+++ b/tests/data/test645
@@ -0,0 +1,141 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP MIME POST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+<datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib645
+</tool>
+
+ <name>
+HTTP multi-part chunked mimepost using read callback for the file part
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/645
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+# Note that the stripping above removes 12 bytes from every occurrence of the
+# boundary string and since 5 of them are in the body contents, we see
+# (5*12) == 60 bytes less
+<protocol>
+POST /645 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Transfer-Encoding: chunked
+Content-Type: multipart/form-data; boundary=----------------------------
+Expect: 100-continue
+
+2ce
+------------------------------
+Content-Disposition: form-data; name="sendfile"; filename="postit2.c"
+
+this is what we post to the silly web server
+
+------------------------------
+Content-Disposition: form-data; name="callbackdata"
+
+this is what we post to the silly web server
+
+------------------------------
+Content-Disposition: form-data; name="filename"
+
+postit2.c
+------------------------------
+Content-Disposition: form-data; name="submit"
+
+send
+------------------------------
+Content-Disposition: form-data; name="somename"; filename="somefile.txt"
+Content-Type: text/plain
+
+blah blah
+--------------------------------
+
+0
+
+POST /645 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Transfer-Encoding: chunked
+Content-Type: multipart/form-data; boundary=----------------------------
+Expect: 100-continue
+
+2dc
+------------------------------
+Content-Disposition: form-data; name="sendfile alternative"; filename="file name 2"
+
+this is what we post to the silly web server
+
+------------------------------
+Content-Disposition: form-data; name="callbackdata"
+
+this is what we post to the silly web server
+
+------------------------------
+Content-Disposition: form-data; name="filename"
+
+postit2.c
+------------------------------
+Content-Disposition: form-data; name="submit"
+
+send
+------------------------------
+Content-Disposition: form-data; name="somename"; filename="somefile.txt"
+Content-Type: text/plain
+
+blah blah
+--------------------------------
+
+0
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test646 b/tests/data/test646
new file mode 100644
index 0000000..a53c340
--- /dev/null
+++ b/tests/data/test646
@@ -0,0 +1,98 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+MULTIPART
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP multipart using mime API
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/646 --mail-rcpt recipient@example.com --mail-from sender@example.com -F "=(;type=multipart/alternative" -F "= <body>This is the html version</body>;headers=X-test1: this is a header;type=text/html;headers=X-test2: this is another header " -F "=This is the plain text version;headers=@log/headers646" -F "=)" -F "=@log/test646.txt;headers=<log/headers646" -H "From: different" -H "To: another" -H "Reply-To: <followup@example.com>"
+</command>
+<file1 name="log/test646.txt">
+This is an attached file.
+
+It may contain any type of data.
+</file1>
+<file2 name="log/headers646">
+# This line is a comment
+X-fileheader1: This is a header from a file
+
+# This line is another comment. It precedes a folded header.
+X-fileheader2: This is #a
+ folded header
+</file2>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+EHLO 646
+MAIL FROM:<sender@example.com>
+RCPT TO:<recipient@example.com>
+DATA
+QUIT
+</protocol>
+<upload>
+Content-Type: multipart/mixed; boundary=----------------------------
+Mime-Version: 1.0
+From: different
+To: another
+Reply-To: <followup@example.com>
+
+------------------------------
+Content-Type: multipart/alternative; boundary=----------------------------
+
+------------------------------
+Content-Type: text/html
+Content-Transfer-Encoding: 8bit
+X-test1: this is a header
+X-test2: this is another header
+
+<body>This is the html version</body>
+------------------------------
+X-fileheader1: This is a header from a file
+X-fileheader2: This is #a folded header
+
+This is the plain text version
+--------------------------------
+
+------------------------------
+Content-Disposition: attachment; filename="test646.txt"
+X-fileheader1: This is a header from a file
+X-fileheader2: This is #a folded header
+
+This is an attached file.
+
+It may contain any type of data.
+
+--------------------------------
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test647 b/tests/data/test647
new file mode 100644
index 0000000..de2b467
--- /dev/null
+++ b/tests/data/test647
@@ -0,0 +1,79 @@
+<testcase>
+<info>
+<keywords>
+IMAP
+APPEND
+MULTIPART
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+imap
+</server>
+ <name>
+IMAP APPEND multipart using mime API
+ </name>
+ <command>
+imap://%HOSTIP:%IMAPPORT/647 -F "=(;type=multipart/alternative" -F "= <body>This is the html version</body>;type=text/html" -F "=This is the plain text version" -F "=)" -F "=@log/test647.txt" -H "Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)" -H "From: Fred Foobar <foobar@example.com>" -H "To: joe@example.com" -H "Message-Id: <B27397-0100000@example.com>" -H "Subject: afternoon meeting" -u user:secret
+</command>
+<file name="log/test647.txt">
+This is an attached file.
+
+It may contain any type of data.
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+A001 CAPABILITY
+A002 LOGIN user secret
+A003 APPEND 647 (\Seen) {892}
+A004 LOGOUT
+</protocol>
+<upload>
+Content-Type: multipart/mixed; boundary=----------------------------
+Mime-Version: 1.0
+Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
+From: Fred Foobar <foobar@example.com>
+To: joe@example.com
+Message-Id: <B27397-0100000@example.com>
+Subject: afternoon meeting
+
+------------------------------
+Content-Type: multipart/alternative; boundary=----------------------------
+
+------------------------------
+Content-Type: text/html
+Content-Transfer-Encoding: 8bit
+
+<body>This is the html version</body>
+------------------------------
+
+This is the plain text version
+--------------------------------
+
+------------------------------
+Content-Disposition: attachment; filename="test647.txt"
+
+This is an attached file.
+
+It may contain any type of data.
+
+--------------------------------
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test648 b/tests/data/test648
new file mode 100644
index 0000000..a2b227b
--- /dev/null
+++ b/tests/data/test648
@@ -0,0 +1,75 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+MULTIPART
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP multipart with transfer content encoders
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/648 --mail-rcpt recipient@example.com --mail-from sender@example.com -F '=This is the e-mail inline text with a very long line containing the special character = and that should be split by encoder.;headers=Content-disposition: "inline";encoder=quoted-printable' -F "=@log/test648.txt;encoder=base64" -H "From: different" -H "To: another"
+</command>
+<file name="log/test648.txt">
+This is an attached file.
+
+It may contain any type of data and will be encoded in base64 for transfer.
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+EHLO 648
+MAIL FROM:<sender@example.com>
+RCPT TO:<recipient@example.com>
+DATA
+QUIT
+</protocol>
+<upload>
+Content-Type: multipart/mixed; boundary=----------------------------
+Mime-Version: 1.0
+From: different
+To: another
+
+------------------------------
+Content-Transfer-Encoding: quoted-printable
+Content-disposition: "inline"
+
+This is the e-mail inline text with a very long line containing the special=
+ character =3D and that should be split by encoder.
+------------------------------
+Content-Disposition: attachment; filename="test648.txt"
+Content-Transfer-Encoding: base64
+
+VGhpcyBpcyBhbiBhdHRhY2hlZCBmaWxlLgoKSXQgbWF5IGNvbnRhaW4gYW55IHR5cGUgb2YgZGF0
+YSBhbmQgd2lsbCBiZSBlbmNvZGVkIGluIGJhc2U2NCBmb3IgdHJhbnNmZXIuCg==
+--------------------------------
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test649 b/tests/data/test649
new file mode 100644
index 0000000..46c01cd
--- /dev/null
+++ b/tests/data/test649
@@ -0,0 +1,72 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+MULTIPART
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP multipart with 7bit encoder error
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/649 --mail-rcpt recipient@example.com --mail-from sender@example.com -F '=This is valid;encoder=7bit' -F "=@log/test649.txt;encoder=7bit" -H "From: different" -H "To: another"
+</command>
+<file name="log/test649.txt">
+This is an attached file (in french: pièce jointe).
+
+It contains at least an 8-bit byte value.
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+EHLO 649
+MAIL FROM:<sender@example.com>
+RCPT TO:<recipient@example.com>
+DATA
+</protocol>
+<upload nonewline="yes">
+Content-Type: multipart/mixed; boundary=----------------------------
+Mime-Version: 1.0
+From: different
+To: another
+
+------------------------------
+Content-Transfer-Encoding: 7bit
+
+This is valid
+------------------------------
+Content-Disposition: attachment; filename="test649.txt"
+Content-Transfer-Encoding: 7bit
+
+This is an attached file (in french: pi
+</upload>
+<errorcode>
+26
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test650 b/tests/data/test650
new file mode 100644
index 0000000..1a06064
--- /dev/null
+++ b/tests/data/test650
@@ -0,0 +1,123 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+FORM
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib650
+</tool>
+
+ <name>
+HTTP formpost using form API
+ </name>
+<stdin>
+ Some data from stdin
+</stdin>
+ <command>
+http://%HOSTIP:%HTTPPORT/650 log/test650.filedata
+</command>
+<file name="log/test650.filedata">
+This is data from a file.
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+# Note that the stripping above removes 12 bytes from every occurrence of the
+# boundary string and since 5 of them are in the body contents, we see
+# (5*12) == 60 bytes less
+<protocol>
+POST /650 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Transfer-Encoding: chunked
+Content-Type: multipart/form-data; boundary=----------------------------
+Expect: 100-continue
+
+60a
+------------------------------
+Content-Disposition: form-data; name="fieldname"
+Content-Type: text/plain
+X-customheader-1: Header 1 data
+X-customheader-2: Header 2 data
+
+this is what we post to the silly web server
+------------------------------
+Content-Disposition: form-data; name="fieldnam"
+
+uhis is what we post to the silly web serve
+------------------------------
+Content-Disposition: form-data; name="multifile"
+Content-Type: multipart/mixed; boundary=----------------------------
+
+------------------------------
+Content-Disposition: attachment; filename="test650.filedata"
+Content-Type: application/octet-stream
+
+This is data from a file.
+
+------------------------------
+Content-Disposition: attachment; filename="test650.filedata"
+Content-Type: text/whatever
+
+This is data from a file.
+
+------------------------------
+Content-Disposition: attachment; filename="test650.filedata"
+Content-Type: text/whatever
+
+This is data from a file.
+
+--------------------------------
+
+------------------------------
+Content-Disposition: form-data; name="filecontents"
+
+This is data from a file.
+
+------------------------------
+Content-Disposition: form-data; name="formlength"
+
+1367
+------------------------------
+Content-Disposition: form-data; name="standardinput"
+Content-Type: application/octet-stream
+
+ Some data from stdin
+
+--------------------------------
+
+0
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test651 b/tests/data/test651
new file mode 100644
index 0000000..b00ca5d
--- /dev/null
+++ b/tests/data/test651
@@ -0,0 +1,73 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+FORM
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib651
+</tool>
+
+ <name>
+curl_formadd with huge COPYCONTENTS
+ </name>
+<stdin>
+ Some data from stdin
+</stdin>
+ <command>
+http://%HOSTIP:%HTTPPORT/651 log/test651.filedata
+</command>
+<file name="log/test651.filedata">
+This is data from a file.
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+# Note that the stripping above removes 12 bytes from every occurrence of the
+# boundary string and since 5 of them are in the body contents, we see
+# (5*12) == 60 bytes less
+<protocol>
+POST /651 HTTP/1.1
+Host: 127.0.0.1:8990
+Accept: */*
+Content-Length: 17139
+Content-Type: multipart/form-data; boundary=----------------------------
+Expect: 100-continue
+
+------------------------------
+Content-Disposition: form-data; name="hello"
+
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test652 b/tests/data/test652
new file mode 100644
index 0000000..c91dcf2
--- /dev/null
+++ b/tests/data/test652
@@ -0,0 +1,358 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+MIME
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<tool>
+lib652
+</tool>
+
+ <name>
+SMTP with encoded huge mime data contents
+ </name>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/652
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+EHLO 652
+MAIL FROM:<somebody@example.com>
+RCPT TO:<someone@example.com>
+DATA
+QUIT
+</protocol>
+<upload>
+Content-Type: multipart/mixed; boundary=----------------------------
+Mime-Version: 1.0
+
+------------------------------
+Content-Disposition: attachment; filename="myfile.jpg"
+Content-Type: image/jpeg
+Content-Transfer-Encoding: base64
+
+QUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZG
+RkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExM
+TExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFS
+UlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dX
+V1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0ND
+Q0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJ
+SUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5O
+Tk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRU
+VFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpa
+WlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVF
+RkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tL
+S0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFR
+UVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZX
+V1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJC
+QkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhI
+SEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5O
+Tk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NT
+U1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZ
+WVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVF
+RUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpK
+S0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQ
+UFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZW
+VlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFC
+QkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dH
+R0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1N
+TU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNT
+U1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhY
+WFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDRERERERE
+REREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpK
+SkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09P
+UFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVV
+VVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFB
+QUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZH
+R0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExM
+TExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJS
+UlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hY
+WFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0ND
+Q0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJ
+SUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09P
+T09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRU
+VVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpa
+WlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZG
+RkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tM
+TExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFR
+UVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dX
+V1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkND
+Q0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhI
+SElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5O
+Tk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRU
+VFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZ
+WlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVF
+RUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tL
+S0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBR
+UVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZW
+VlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJC
+QkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hI
+SEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1N
+TU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NT
+U1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZ
+WVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERE
+RUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpK
+SkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQ
+UFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVW
+VlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFB
+QUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dH
+R0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1N
+TU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJS
+UlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhY
+WFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDRERE
+REREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJ
+SkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09P
+T09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVV
+VVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpB
+QUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZG
+RkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExM
+TExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJS
+UlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dX
+V1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0ND
+Q0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJ
+SUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5O
+T09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRU
+VFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpa
+WlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVG
+RkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tL
+S0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFR
+UVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldX
+V1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJC
+QkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhI
+SEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5O
+Tk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NT
+VFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZ
+WVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVF
+RUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpL
+S0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQ
+UFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZW
+VlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJC
+QkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dH
+R0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1N
+TU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NT
+U1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhY
+WVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERE
+RERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpK
+SkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09Q
+UFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVV
+VVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFB
+QUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdH
+R0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExM
+TE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJS
+UlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhY
+WFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0ND
+REREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJ
+SUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09P
+T09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRV
+VVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpa
+WlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZG
+RkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xM
+TExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFR
+UVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dX
+V1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0ND
+Q0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhI
+SUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5O
+Tk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRU
+VFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVla
+WlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVF
+RUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tL
+S0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFR
+UVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZW
+VldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJC
+QkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhI
+SEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1N
+Tk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NT
+U1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZ
+WVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERF
+RUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpK
+SkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQ
+UFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZW
+VlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFB
+QUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dH
+R0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1N
+TU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJS
+U1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhY
+WFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERE
+RERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlK
+SkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09P
+T09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVV
+VVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFB
+QUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZG
+RkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExM
+TExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJS
+UlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dX
+WFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0ND
+Q0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJ
+SUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5P
+T09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRU
+VFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpa
+WlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZG
+RkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tL
+S0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFR
+UVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dX
+V1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJC
+Q0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhI
+SEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5O
+Tk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NU
+VFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZ
+WVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVF
+RUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktL
+S0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQ
+UFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZW
+VlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJC
+QkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dH
+SEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1N
+TU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NT
+U1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZ
+WVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERE
+RERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpK
+SkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQ
+UFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVV
+VVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFB
+QUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dH
+R0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExM
+TU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJS
+UlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhY
+WFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NE
+RERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJ
+SUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09P
+T09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVV
+VVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpa
+WkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZG
+RkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExM
+TExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFR
+UlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dX
+V1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0ND
+Q0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJ
+SUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5O
+Tk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRU
+VFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpa
+WlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVF
+RUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tL
+S0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFR
+UVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZW
+V1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJC
+QkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhI
+SEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1O
+Tk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NT
+U1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZ
+WVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVF
+RUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpK
+SktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQ
+UFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZW
+VlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFB
+QkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dH
+R0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1N
+TU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJT
+U1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhY
+WFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERE
+RERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpK
+SkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09P
+T1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVV
+VVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFB
+QUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZG
+R0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExM
+TExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJS
+UlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dY
+WFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0ND
+Q0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJ
+SUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9P
+T09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRU
+VFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpa
+WlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZG
+RkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tL
+TExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFR
+UVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dX
+V1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJD
+Q0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhI
+SEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5O
+Tk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RU
+VFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZ
+WVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVF
+RUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tL
+S0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQ
+UVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZW
+VlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJC
+QkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dI
+SEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1N
+TU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NT
+U1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZ
+WVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDRERERERERERE
+REVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpK
+SkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQ
+UFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVV
+VlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFB
+QUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dH
+R0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExN
+TU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJS
+UlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhY
+WFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RE
+RERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJ
+SUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09P
+T09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVV
+VVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpa
+QUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZG
+RkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExM
+TExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFS
+UlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dX
+V1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0ND
+Q0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJ
+SUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5O
+Tk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRU
+VFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpa
+WlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVF
+RkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tL
+S0tLTExMTExMTExMTE1NTU1NTU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFR
+UVFRUVFRUlJSUlJSUlJSUlNTU1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZX
+V1dXV1dXV1dXWFhYWFhYWFhYWFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJC
+QkJDQ0NDQ0NDQ0NDREREREREREREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhI
+SEhISEhJSUlJSUlJSUlJSkpKSkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5O
+Tk5OTk5OTk5PT09PT09PT09PUFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NT
+U1RUVFRUVFRUVFRVVVVVVVVVVVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZ
+WVlZWVpaWlpaWlpaWlpBQUFBQUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVF
+RUVFRUVFRUZGRkZGRkZGRkZHR0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpK
+S0tLS0tLS0tLS0xMTExMTExMTExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQ
+UFBQUVFRUVFRUVFRUVJSUlJSUlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZW
+VlZWVlZWV1dXV1dXV1dXV1hYWFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFC
+QkJCQkJCQkJCQ0NDQ0NDQ0NDQ0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dH
+R0dISEhISEhISEhISUlJSUlJSUlJSUpKSkpKSkpKSkpLS0tLS0tLS0tLTExMTExMTExMTE1NTU1N
+TU1NTU1OTk5OTk5OTk5OT09PT09PT09PT1BQUFBQUFBQUFBRUVFRUVFRUVFRUlJSUlJSUlJSUlNT
+U1NTU1NTU1NUVFRUVFRUVFRUVVVVVVVVVVVVVVZWVlZWVlZWVlZXV1dXV1dXV1dXWFhYWFhYWFhY
+WFlZWVlZWVlZWVlaWlpaWlpaWlpaQUFBQUFBQUFBQUJCQkJCQkJCQkJDQ0NDQ0NDQ0NDRERERERE
+REREREVFRUVFRUVFRUVGRkZGRkZGRkZGR0dHR0dHR0dHR0hISEhISEhISEhJSUlJSUlJSUlJSkpK
+SkpKSkpKSktLS0tLS0tLS0tMTExMTExMTExMTU1NTU1NTU1NTU5OTk5OTk5OTk5PT09PT09PT09P
+UFBQUFBQUFBQUFFRUVFRUVFRUVFSUlJSUlJSUlJSU1NTU1NTU1NTU1RUVFRUVFRUVFRVVVVVVVVV
+VVVVVlZWVlZWVlZWVldXV1dXV1dXV1dYWFhYWFhYWFhYWVlZWVlZWVlZWVpaWlpaWlpaWlpBQUFB
+QUFBQUFBQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NERERERERERERERUVFRUVFRUVFRUZGRkZGRkZGRkZH
+R0dHR0dHR0dHSEhISEhISEhISElJSUlJSUlJSUlKSkpKSkpKSkpKS0tLS0tLS0tLS0xMTExMTExM
+TExNTU1NTU1NTU1NTk5OTk5OTk5OTk9PT09PT09PT09QUFBQUFBQUFBQUVFRUVFRUVFRUVJSUlJS
+UlJSUlJTU1NTU1NTU1NTVFRUVFRUVFRUVFVVVVVVVVVVVVVWVlZWVlZWVlZWV1dXV1dXV1dXV1hY
+WFhYWFhYWFhZWVlZWVlZWVlZWlpaWlpaWlpaWkFBQUFBQUFBQUFCQkJCQkJCQkJCQ0NDQ0NDQ0ND
+Q0RERERERERERERFRUVFRUVFRUVFRkZGRkZGRkZGRkdHR0dHR0dHR0dISEhISEhISEhISUlJSUlJ
+SUlJSUpKSkpKSkpKSko=
+--------------------------------
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test653 b/tests/data/test653
new file mode 100644
index 0000000..d620b57
--- /dev/null
+++ b/tests/data/test653
@@ -0,0 +1,93 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+MIME
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+<datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib653
+</tool>
+
+ <name>
+Reuse of handle after altering mime data
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/653
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+# Note that the stripping above removes 12 bytes from every occurrence of the
+# boundary string and since 5 of them are in the body contents, we see
+# (5*12) == 60 bytes less
+<protocol>
+POST /653 HTTP/1.1
+Host: 127.0.0.1:8990
+Accept: */*
+Content-Length: 150
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="name"
+
+short value
+--------------------------------
+POST /653 HTTP/1.1
+Host: 127.0.0.1:8990
+Accept: */*
+Content-Length: 167
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="name"
+
+long value for length change
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test71 b/tests/data/test71
index 341a003..0bc76fc 100644
--- a/tests/data/test71
+++ b/tests/data/test71
@@ -54,7 +54,6 @@ POST /we/want/71 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 408
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
------------------------------9ef8d6205763
diff --git a/tests/data/test800 b/tests/data/test800
index 6b29f7a..360206b 100644
--- a/tests/data/test800
+++ b/tests/data/test800
@@ -31,7 +31,7 @@ imap
IMAP FETCH message
</name>
<command>
-'imap://%HOSTIP:%IMAPPORT/800/;UID=1' -u user:secret
+'imap://%HOSTIP:%IMAPPORT/800/;UID=1' -u '"user:sec"ret{'
</command>
</client>
@@ -40,7 +40,7 @@ IMAP FETCH message
<verify>
<protocol>
A001 CAPABILITY
-A002 LOGIN user secret
+A002 LOGIN "\"user" "sec\"ret{"
A003 SELECT 800
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/data/test846 b/tests/data/test846
new file mode 100644
index 0000000..b363ffd
--- /dev/null
+++ b/tests/data/test846
@@ -0,0 +1,50 @@
+<testcase>
+<info>
+<keywords>
+IMAP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+REPLY welcome * PREAUTH ready to serve already!
+REPLY CAPABILITY * CAPABILITY IMAP4REV1 I18NLEVEL=1 LITERAL+ IDLE UIDPLUS NAMESPACE CHILDREN MAILBOX-REFERRALS BINARY UNSELECT ESEARCH WITHIN SCAN SORT THREAD=REFERENCES THREAD=ORDEREDSUBJECT MULTIAPPEND SASL-IR LOGIN-REFERRALS STARTTLS LOGINDISABLED\r\nA001 OK CAPABILITY completed
+</servercmd>
+<data>
+From: me@somewhere
+To: fake@nowhere
+
+body
+
+--
+ yours sincerely
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+imap
+</server>
+ <name>
+IMAP PREAUTH response
+ </name>
+ <command>
+'imap://%HOSTIP:%IMAPPORT/846/;UID=1' -u notused:still-provided
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+A001 CAPABILITY
+A002 SELECT 846
+A003 FETCH 1 BODY[]
+A004 LOGOUT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test856 b/tests/data/test856
index 4d8d7ed..dcb07c5 100644
--- a/tests/data/test856
+++ b/tests/data/test856
@@ -10,6 +10,9 @@ FAILURE
#
# Server-side
<reply>
+<servercmd>
+REPLY PASS -ERR Login failure
+</servercmd>
</reply>
#
diff --git a/tests/data/test9 b/tests/data/test9
index 7905ac8..53fe25e 100644
--- a/tests/data/test9
+++ b/tests/data/test9
@@ -48,7 +48,6 @@ User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 z
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 407
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
------------------------------9ef8d6205763
diff --git a/tests/data/test950 b/tests/data/test950
new file mode 100644
index 0000000..295f8b8
--- /dev/null
+++ b/tests/data/test950
@@ -0,0 +1,43 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+VRFY
+--request
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+250 <recipient@example.com>
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP VRFY with custom request
+ </name>
+
+# the custom request just does it lowercase to remain the same command
+<command>
+smtp://%HOSTIP:%SMTPPORT/950 --mail-rcpt recipient --request "vrfy"
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 950
+vrfy recipient
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl
index 081298f..ae8b4a0 100755
--- a/tests/ftpserver.pl
+++ b/tests/ftpserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -174,7 +174,6 @@ my $exit_signal; # first signal handled in exit_signal_handler
#**********************************************************************
# Mail related definitions
#
-my $TEXT_USERNAME = "user";
my $TEXT_PASSWORD = "secret";
my $POP3_TIMESTAMP = "<1972.987654321\@curl>";
@@ -1121,9 +1120,6 @@ sub LOGIN_imap {
if ($user eq "") {
sendcontrol "$cmdid BAD Command Argument\r\n";
}
- elsif (($user ne $TEXT_USERNAME) || ($password ne $TEXT_PASSWORD)) {
- sendcontrol "$cmdid NO LOGIN failed\r\n";
- }
else {
sendcontrol "$cmdid OK LOGIN completed\r\n";
}
@@ -1681,7 +1677,7 @@ sub APOP_pop3 {
else {
my $digest = Digest::MD5::md5_hex($POP3_TIMESTAMP, $TEXT_PASSWORD);
- if (($user ne $TEXT_USERNAME) || ($secret ne $digest)) {
+ if ($secret ne $digest) {
sendcontrol "-ERR Login failure\r\n";
}
else {
@@ -1740,12 +1736,7 @@ sub PASS_pop3 {
logmsg "PASS_pop3 got $password\n";
- if (($username ne $TEXT_USERNAME) || ($password ne $TEXT_PASSWORD)) {
- sendcontrol "-ERR Login failure\r\n";
- }
- else {
- sendcontrol "+OK Login successful\r\n";
- }
+ sendcontrol "+OK Login successful\r\n";
return 0;
}
@@ -3032,7 +3023,7 @@ while(1) {
undef $ftplistparserstate;
}
if($ftptargetdir) {
- undef $ftptargetdir;
+ $ftptargetdir = "";
}
if($verbose) {
@@ -3202,7 +3193,7 @@ while(1) {
}
# only perform this if we're not faking a reply
- my $func = $commandfunc{$FTPCMD};
+ my $func = $commandfunc{uc($FTPCMD)};
if($func) {
&$func($FTPARG, $FTPCMD);
$check = 0;
diff --git a/tests/fuzz/CMakeLists.txt b/tests/fuzz/CMakeLists.txt
deleted file mode 100644
index aefedf2..0000000
--- a/tests/fuzz/CMakeLists.txt
+++ /dev/null
@@ -1 +0,0 @@
-# FIXME, probably adapt from file in ../unit
diff --git a/tests/fuzz/Makefile.am b/tests/fuzz/Makefile.am
deleted file mode 100644
index 0d20d79..0000000
--- a/tests/fuzz/Makefile.am
+++ /dev/null
@@ -1,57 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-AUTOMAKE_OPTIONS = foreign nostdinc
-
-# Specify our include paths here, and do it relative to $(top_srcdir) and
-# $(top_builddir), to ensure that these paths which belong to the library
-# being currently built and tested are searched before the library which
-# might possibly already be installed in the system.
-#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
-# $(top_srcdir)/include is for libcurl's external include files
-# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
-# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
-
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
- -I$(top_builddir)/lib \
- -I$(top_srcdir)/lib \
- -I$(top_srcdir)/tests/fuzz
-
-EXTRA_DIST = Makefile.inc CMakeLists.txt
-
-LIBS = -lpthread -lFuzzer -lstdc++ -lm
-LDFLAGS = -L/usr/lib/llvm-5.0/lib #-L/home/daniel/src/Fuzzer/
-
-LDADD = $(top_builddir)/lib/libcurl.la \
- @LDFLAGS@ @LIBCURL_LIBS@
-
-# Makefile.inc provides neat definitions
-include Makefile.inc
-
-checksrc:
- @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
-
-noinst_PROGRAMS = $(FUZZPROGS)
-
diff --git a/tests/fuzz/Makefile.inc b/tests/fuzz/Makefile.inc
deleted file mode 100644
index fb6cdb1..0000000
--- a/tests/fuzz/Makefile.inc
+++ /dev/null
@@ -1,19 +0,0 @@
-FUZZPROGS = http11 ftp imap pop3 httpupload http2
-
-http11_SOURCES = curl_fuzzer.c
-http11_CPPFLAGS = $(AM_CPPFLAGS)
-
-ftp_SOURCES = curl_fuzzer.c
-ftp_CPPFLAGS = -DFUZZER_FTP $(AM_CPPFLAGS)
-
-imap_SOURCES = curl_fuzzer.c
-imap_CPPFLAGS = -DFUZZER_IMAP $(AM_CPPFLAGS)
-
-pop3_SOURCES = curl_fuzzer.c
-pop3_CPPFLAGS = -DFUZZER_POP3 $(AM_CPPFLAGS)
-
-httpupload_SOURCES = curl_fuzzer.c
-httpupload_CPPFLAGS = -DFUZZER_HTTP_UPLOAD $(AM_CPPFLAGS)
-
-http2_SOURCES = curl_fuzzer.c
-http2_CPPFLAGS = -DFUZZER_HTTP2 $(AM_CPPFLAGS)
diff --git a/tests/fuzz/README b/tests/fuzz/README
deleted file mode 100644
index 459bda4..0000000
--- a/tests/fuzz/README
+++ /dev/null
@@ -1,14 +0,0 @@
-Fuzz tests
-==========
-
-The goal is to add tests for *ALL* protocols supported in libcurl.
-We will need some additional patches in the future, to increase coverage.
-
-Building the fuzz target
-========================
-
-CC=clang-5.0 CFLAGS="-fsanitize=address -fsanitize-address-use-after-scope -fsanitize-coverage=trace-pc-guard,trace-cmp" ./configure --disable-shared --enable-debug --enable-maintainer-mode
-make -sj
-
-cd tests/fuzz
-make
diff --git a/tests/fuzz/curl_fuzzer.c b/tests/fuzz/curl_fuzzer.c
deleted file mode 100644
index 2ccf1b3..0000000
--- a/tests/fuzz/curl_fuzzer.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
-# Copyright 2016 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-################################################################################
-*/
-
-#include <errno.h>
-#include <fcntl.h>
-#include <netinet/in.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/select.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <curl/curl.h>
-
-static const void *cur_data;
-static int cur_size = -1;
-static int server_fd = -1;
-static int client_fd = -1;
-static int wrote = 0;
-
-static void fail(const char *why) {
- perror(why);
- exit(1);
-}
-
-static curl_socket_t open_sock(void *ctx, curlsocktype purpose,
- struct curl_sockaddr *address) {
- if(cur_size == -1) {
- fail("not fuzzing");
- }
- if(server_fd != -1 || client_fd != -1) {
- fail("already connected");
- }
- int fds[2];
- if(socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) {
- fail("socketpair");
- }
- server_fd = fds[0];
- client_fd = fds[1];
- if(write(server_fd, cur_data, cur_size) != cur_size) {
- fail("write");
- }
- if(shutdown(server_fd, SHUT_WR)) {
- fail("shutdown");
- }
- return client_fd;
-}
-
-static int set_opt(void *ctx, curl_socket_t curlfd, curlsocktype purpose) {
- return CURL_SOCKOPT_ALREADY_CONNECTED;
-}
-
-static size_t write_callback(char *ptr, size_t size, size_t n, void *ctx) {
- return size * n;
-}
-
-static size_t read_callback(char *buf, size_t size, size_t n, void *ctx) {
- if(wrote || size * n == 0) {
- return 0;
- }
- wrote = 1;
- buf[0] = 'a';
- return 1;
-}
-
-int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
- cur_data = Data;
- cur_size = Size;
- wrote = 0;
- CURL *curl = curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
- curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
- curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, open_sock);
- curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, set_opt);
-#if defined(FUZZER_FTP)
- curl_easy_setopt(curl, CURLOPT_URL, "ftp://user@localhost/file.txt");
-#elif defined(FUZZER_IMAP)
- curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
- curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
- curl_easy_setopt(curl, CURLOPT_URL, "imap://localhost");
-#elif defined(FUZZER_POP3)
- curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
- curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
- curl_easy_setopt(curl, CURLOPT_URL, "pop3://localhost");
-#elif defined(FUZZER_HTTP_UPLOAD)
- curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/");
- curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
- curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
-#elif defined(FUZZER_HTTP2)
- curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/");
- /* use non-TLS HTTP/2 without HTTP/1.1 Upgrade: */
- curl_easy_setopt(curl, CURLOPT_HTTP_VERSION,
- CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE);
-#else
- curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/");
- curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
-#endif
- curl_easy_perform(curl);
- curl_easy_cleanup(curl);
- close(server_fd);
- close(client_fd);
- server_fd = -1;
- client_fd = -1;
- cur_data = NULL;
- cur_size = -1;
- return 0;
-}
diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am
index 9128a45..a4e85ef 100644
--- a/tests/libtest/Makefile.am
+++ b/tests/libtest/Makefile.am
@@ -109,6 +109,21 @@ libhostname_la_SOURCES = sethostname.c sethostname.h
libhostname_la_LIBADD =
libhostname_la_DEPENDENCIES =
+# Build a stub gssapi implementation for testing
+if BUILD_STUB_GSS
+noinst_LTLIBRARIES += libstubgss.la
+
+libstubgss_la_CPPFLAGS = $(AM_CPPFLAGS)
+libstubgss_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version -rpath /nowhere
+libstubgss_la_CFLAGS = $(AM_CFLAGS) -g -Wno-unused-parameter
+
+libstubgss_la_SOURCES = stub_gssapi.c stub_gssapi.h
+
+libstubgss_la_LIBADD =
+libstubgss_la_DEPENDENCIES =
+endif
+
+
lib1521.c: $(top_srcdir)/tests/libtest/mk-lib1521.pl $(top_srcdir)/include/curl/curl.h
@PERL@ $(top_srcdir)/tests/libtest/mk-lib1521.pl < $(top_srcdir)/include/curl/curl.h > lib1521.c
diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc
index 727582b..9e1ba28 100644
--- a/tests/libtest/Makefile.inc
+++ b/tests/libtest/Makefile.inc
@@ -19,14 +19,15 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
lib547 lib548 lib549 lib552 lib553 lib554 lib555 lib556 lib557 lib558 \
lib559 lib560 lib562 lib564 lib565 lib566 lib567 lib568 lib569 lib570 \
lib571 lib572 lib573 lib574 lib575 lib576 lib578 lib579 lib582 \
- lib583 lib585 lib586 lib587 lib590 lib591 lib597 lib598 lib599 \
+ lib583 lib585 lib586 lib587 lib589 lib590 lib591 lib597 lib598 lib599 \
+ lib643 lib644 lib645 lib650 lib651 lib652 lib653 \
lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \
lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515 lib1517 \
lib1520 lib1521 \
lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
lib1534 lib1535 lib1536 lib1537 lib1538 \
lib1540 \
- lib1550 lib1551 \
+ lib1550 lib1551 lib1552 lib1553 lib1554 \
lib1900 \
lib2033
@@ -282,6 +283,9 @@ lib586_CPPFLAGS = $(AM_CPPFLAGS)
lib587_SOURCES = lib554.c $(SUPPORTFILES)
lib587_CPPFLAGS = $(AM_CPPFLAGS) -DLIB587
+lib589_SOURCES = lib589.c $(SUPPORTFILES)
+lib589_CPPFLAGS = $(AM_CPPFLAGS)
+
lib590_SOURCES = lib590.c $(SUPPORTFILES)
lib590_CPPFLAGS = $(AM_CPPFLAGS)
@@ -299,6 +303,27 @@ lib598_CPPFLAGS = $(AM_CPPFLAGS)
lib599_SOURCES = lib599.c $(SUPPORTFILES)
lib599_CPPFLAGS = $(AM_CPPFLAGS)
+lib643_SOURCES = lib643.c $(SUPPORTFILES)
+lib643_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib644_SOURCES = lib643.c $(SUPPORTFILES)
+lib644_CPPFLAGS = $(AM_CPPFLAGS) -DLIB644
+
+lib645_SOURCES = lib643.c $(SUPPORTFILES)
+lib645_CPPFLAGS = $(AM_CPPFLAGS) -DLIB645
+
+lib650_SOURCES = lib650.c $(SUPPORTFILES)
+lib650_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib651_SOURCES = lib651.c $(SUPPORTFILES)
+lib651_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib652_SOURCES = lib652.c $(SUPPORTFILES)
+lib652_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib653_SOURCES = lib653.c $(SUPPORTFILES)
+lib653_CPPFLAGS = $(AM_CPPFLAGS)
+
lib1500_SOURCES = lib1500.c $(SUPPORTFILES) $(TESTUTIL)
lib1500_LDADD = $(TESTUTIL_LIBS)
lib1500_CPPFLAGS = $(AM_CPPFLAGS)
@@ -438,6 +463,17 @@ lib1550_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
lib1551_SOURCES = lib1551.c $(SUPPORTFILES)
lib1551_CPPFLAGS = $(AM_CPPFLAGS)
+lib1552_SOURCES = lib1552.c $(SUPPORTFILES) $(TESTUTIL)
+lib1552_LDADD = $(TESTUTIL_LIBS)
+lib1552_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1553_SOURCES = lib1553.c $(SUPPORTFILES) $(TESTUTIL)
+lib1553_LDADD = $(TESTUTIL_LIBS)
+lib1553_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1554_SOURCES = lib1554.c $(SUPPORTFILES)
+lib1554_CPPFLAGS = $(AM_CPPFLAGS)
+
lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/tests/libtest/first.c b/tests/libtest/first.c
index 72140e3..86d84ca 100644
--- a/tests/libtest/first.c
+++ b/tests/libtest/first.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -72,8 +72,8 @@ void wait_ms(int ms)
select_wrapper(0, NULL, NULL, NULL, &t);
}
-char *libtest_arg2=NULL;
-char *libtest_arg3=NULL;
+char *libtest_arg2 = NULL;
+char *libtest_arg3 = NULL;
int test_argc;
char **test_argv;
@@ -118,12 +118,12 @@ static void memory_tracking_init(void)
/* returns a hexdump in a static memory area */
char *hexdump(const unsigned char *buffer, size_t len)
{
- static char dump[200*3+1];
+ static char dump[200 * 3 + 1];
char *p = dump;
size_t i;
if(len > 200)
return NULL;
- for(i=0; i<len; i++, p += 3)
+ for(i = 0; i<len; i++, p += 3)
snprintf(p, 4, "%02x ", buffer[i]);
return dump;
}
@@ -162,10 +162,10 @@ int main(int argc, char **argv)
test_argv = argv;
if(argc>2)
- libtest_arg2=argv[2];
+ libtest_arg2 = argv[2];
if(argc>3)
- libtest_arg3=argv[3];
+ libtest_arg3 = argv[3];
URL = argv[1]; /* provide this to the rest */
diff --git a/tests/libtest/lib1501.c b/tests/libtest/lib1501.c
index 8a6ef51..96094d6 100644
--- a/tests/libtest/lib1501.c
+++ b/tests/libtest/lib1501.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -78,7 +78,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
abort_on_test_timeout();
diff --git a/tests/libtest/lib1502.c b/tests/libtest/lib1502.c
index bd555cb..188c120 100644
--- a/tests/libtest/lib1502.c
+++ b/tests/libtest/lib1502.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -99,7 +99,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
abort_on_test_timeout();
diff --git a/tests/libtest/lib1506.c b/tests/libtest/lib1506.c
index 47fc335..d456bc9 100644
--- a/tests/libtest/lib1506.c
+++ b/tests/libtest/lib1506.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013, Linus Nielsen Feltzing <linus@haxx.se>
+ * Copyright (C) 2013, 2017, Linus Nielsen Feltzing <linus@haxx.se>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -45,7 +45,7 @@ int test(char *URL)
(void)URL;
/* Create fake DNS entries for serverX.example.com for all handles */
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
snprintf(dnsentry, sizeof(dnsentry), "server%d.example.com:%s:%s",
i + 1, port, address);
printf("%s\n", dnsentry);
@@ -66,7 +66,7 @@ int test(char *URL)
multi_setopt(m, CURLMOPT_MAXCONNECTS, 3L);
/* get NUM_HANDLES easy handles */
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
/* get an easy handle */
easy_init(curl[i]);
/* specify target */
@@ -85,7 +85,7 @@ int test(char *URL)
fprintf(stderr, "Start at URL 0\n");
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
/* add handle to multi */
multi_add_handle(m, curl[i]);
@@ -112,7 +112,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &rd, &wr, &exc, &interval);
+ select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
@@ -123,7 +123,7 @@ test_cleanup:
/* proper cleanup sequence - type PB */
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
curl_multi_remove_handle(m, curl[i]);
curl_easy_cleanup(curl[i]);
}
diff --git a/tests/libtest/lib1507.c b/tests/libtest/lib1507.c
index cd85001..5e3a592 100644
--- a/tests/libtest/lib1507.c
+++ b/tests/libtest/lib1507.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -118,7 +118,7 @@ int test(char *URL)
case of (maxfd == -1), we call select(0, ...), which is basically equal
to sleep. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
if(tutil_tvdiff(tutil_tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
fprintf(stderr, "ABORTING TEST, since it seems "
diff --git a/tests/libtest/lib1510.c b/tests/libtest/lib1510.c
index 25e9fed..d72749b 100644
--- a/tests/libtest/lib1510.c
+++ b/tests/libtest/lib1510.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013, Linus Nielsen Feltzing <linus@haxx.se>
+ * Copyright (C) 2013, 2017, Linus Nielsen Feltzing <linus@haxx.se>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -43,7 +43,7 @@ int test(char *URL)
(void)URL;
/* Create fake DNS entries for serverX.example.com for all handles */
- for(i=0; i < NUM_URLS; i++) {
+ for(i = 0; i < NUM_URLS; i++) {
snprintf(dnsentry, sizeof(dnsentry), "server%d.example.com:%s:%s", i + 1,
port, address);
printf("%s\n", dnsentry);
@@ -72,7 +72,7 @@ int test(char *URL)
easy_setopt(curl, CURLOPT_MAXCONNECTS, 3L);
/* get NUM_HANDLES easy handles */
- for(i=0; i < NUM_URLS; i++) {
+ for(i = 0; i < NUM_URLS; i++) {
/* specify target */
snprintf(target_url, sizeof(target_url),
"http://server%d.example.com:%s/path/1510%04i",
diff --git a/tests/libtest/lib1512.c b/tests/libtest/lib1512.c
index f4091b4..5e794b2 100644
--- a/tests/libtest/lib1512.c
+++ b/tests/libtest/lib1512.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013 - 2016, Linus Nielsen Feltzing <linus@haxx.se>
+ * Copyright (C) 2013 - 2017, Linus Nielsen Feltzing <linus@haxx.se>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -55,7 +55,7 @@ int test(char *URL)
slist = curl_slist_append(slist, dnsentry);
/* get NUM_HANDLES easy handles */
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
/* get an easy handle */
easy_init(curl[i]);
/* specify target */
@@ -76,7 +76,7 @@ int test(char *URL)
easy_setopt(curl[0], CURLOPT_RESOLVE, slist);
/* run NUM_HANDLES transfers */
- for(i=0; (i < NUM_HANDLES) && !res; i++)
+ for(i = 0; (i < NUM_HANDLES) && !res; i++)
res = curl_easy_perform(curl[i]);
test_cleanup:
diff --git a/tests/libtest/lib1513.c b/tests/libtest/lib1513.c
index d0123f1..932ca72 100644
--- a/tests/libtest/lib1513.c
+++ b/tests/libtest/lib1513.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -48,7 +48,7 @@ static int progressKiller(void *arg,
int test(char *URL)
{
CURL *curl;
- int res=0;
+ int res = 0;
global_init(CURL_GLOBAL_ALL);
diff --git a/tests/libtest/lib1515.c b/tests/libtest/lib1515.c
index c149938..39bccc5 100644
--- a/tests/libtest/lib1515.c
+++ b/tests/libtest/lib1515.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -87,7 +87,7 @@ static int do_one_request(CURLM *m, char *URL, char *resolve)
timeout.tv_usec = 0;
multi_fdset(m, &fdread, &fdwrite, &fdexcep, &maxfd);
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
abort_on_test_timeout();
multi_perform(m, &still_running);
@@ -148,6 +148,7 @@ int test(char *URL)
test_cleanup:
curl_multi_cleanup(multi);
+ curl_global_cleanup();
return (int) res;
}
diff --git a/tests/libtest/lib1517.c b/tests/libtest/lib1517.c
index e270ed7..ea622b0 100644
--- a/tests/libtest/lib1517.c
+++ b/tests/libtest/lib1517.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -54,7 +54,7 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
struct WriteThis pooh;
diff --git a/tests/libtest/lib1521.c b/tests/libtest/lib1521.c
index 519922b..2852b86 100644
--- a/tests/libtest/lib1521.c
+++ b/tests/libtest/lib1521.c
@@ -110,9 +110,10 @@ int test(char *URL)
void *conv_to_network_cb = NULL;
void *conv_from_utf8_cb = NULL;
void *interleavecb = NULL;
- char *stringpointerextra=(char *)"moooo";
- struct curl_slist *slist=NULL;
- struct curl_httppost *httppost=NULL;
+ char *stringpointerextra = (char *)"moooo";
+ struct curl_slist *slist = NULL;
+ struct curl_httppost *httppost = NULL;
+ curl_mime *mimepost = NULL;
FILE *stream = stderr;
struct data object;
char *charp;
@@ -124,6 +125,7 @@ int test(char *URL)
struct curl_tlssessioninfo *tlssession;
CURLcode res = CURLE_OK;
(void)URL; /* not used */
+ global_init(CURL_GLOBAL_ALL);
easy_init(dep);
easy_init(curl);
share = curl_share_init();
@@ -2332,6 +2334,24 @@ int test(char *URL)
res = curl_easy_setopt(curl, CURLOPT_SOCKS5_AUTH, HI);
if(UNEX(res)) {
err("SOCKS5_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_COMPRESSION, 0L);
+ if(UNEX(res)) {
+ err("SSH_COMPRESSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_COMPRESSION, 22L);
+ if(UNEX(res)) {
+ err("SSH_COMPRESSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_COMPRESSION, LO);
+ if(UNEX(res)) {
+ err("SSH_COMPRESSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_COMPRESSION, HI);
+ if(UNEX(res)) {
+ err("SSH_COMPRESSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MIMEPOST, mimepost);
+ if(UNEX(res)) {
+ err("MIMEPOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MIMEPOST, NULL);
+ if(UNEX(res)) {
+ err("MIMEPOST", res, __LINE__); goto test_cleanup; }
res = curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &charp);
if(UNEX(res)) {
geterr("EFFECTIVE_URL", res, __LINE__); goto test_cleanup; }
@@ -2507,6 +2527,7 @@ test_cleanup:
curl_easy_cleanup(curl);
curl_easy_cleanup(dep);
curl_share_cleanup(share);
+ curl_global_cleanup();
return (int)res;
}
diff --git a/tests/libtest/lib1531.c b/tests/libtest/lib1531.c
index 287acd6..5ee617e 100644
--- a/tests/libtest/lib1531.c
+++ b/tests/libtest/lib1531.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,6 +37,9 @@ int test(char *URL)
int still_running; /* keep number of running handles */
CURLMsg *msg; /* for picking up messages with the transfer status */
int msgs_left; /* how many messages are left */
+ int res = CURLE_OK;
+
+ global_init(CURL_GLOBAL_ALL);
/* Allocate one CURL handle per transfer */
easy = curl_easy_init();
@@ -112,7 +115,7 @@ int test(char *URL)
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
@@ -139,6 +142,7 @@ int test(char *URL)
/* Free the CURL handles */
curl_easy_cleanup(easy);
+ curl_global_cleanup();
return 0;
}
diff --git a/tests/libtest/lib1538.c b/tests/libtest/lib1538.c
index e4e16f2..91481e8 100644
--- a/tests/libtest/lib1538.c
+++ b/tests/libtest/lib1538.c
@@ -37,13 +37,14 @@ int test(char *URL)
curl_easy_strerror(-INT_MAX);
curl_multi_strerror(-INT_MAX);
curl_share_strerror(-INT_MAX);
- for(easyret=CURLE_OK; easyret <= CURL_LAST; easyret++) {
+ for(easyret = CURLE_OK; easyret <= CURL_LAST; easyret++) {
printf("e%d: %s\n", (int)easyret, curl_easy_strerror(easyret));
}
- for(multiret=CURLM_CALL_MULTI_PERFORM; multiret <= CURLM_LAST; multiret++) {
+ for(multiret = CURLM_CALL_MULTI_PERFORM; multiret <= CURLM_LAST;
+ multiret++) {
printf("m%d: %s\n", (int)multiret, curl_multi_strerror(multiret));
}
- for(shareret=CURLSHE_OK; shareret <= CURLSHE_LAST; shareret++) {
+ for(shareret = CURLSHE_OK; shareret <= CURLSHE_LAST; shareret++) {
printf("s%d: %s\n", (int)shareret, curl_share_strerror(shareret));
}
diff --git a/tests/libtest/lib1550.c b/tests/libtest/lib1550.c
index 94ee576..d3e17e4 100644
--- a/tests/libtest/lib1550.c
+++ b/tests/libtest/lib1550.c
@@ -27,13 +27,20 @@
int test(char *URL)
{
- CURLM *handle = curl_multi_init();
- const char *bl_servers[] = {"Microsoft-IIS/6.0", "nginx/0.8.54", NULL};
- const char *bl_sites[] = {"curl.haxx.se:443", "example.com:80", NULL};
+ CURLM *handle;
+ int res = CURLE_OK;
+ static const char * const bl_servers[] =
+ {"Microsoft-IIS/6.0", "nginx/0.8.54", NULL};
+ static const char * const bl_sites[] =
+ {"curl.haxx.se:443", "example.com:80", NULL};
+
+ global_init(CURL_GLOBAL_ALL);
+ handle = curl_multi_init();
(void)URL; /* unused */
curl_multi_setopt(handle, CURLMOPT_PIPELINING_SERVER_BL, bl_servers);
curl_multi_setopt(handle, CURLMOPT_PIPELINING_SITE_BL, bl_sites);
curl_multi_cleanup(handle);
+ curl_global_cleanup();
return 0;
}
diff --git a/tests/libtest/lib1551.c b/tests/libtest/lib1551.c
index 16e2727..36ba757 100644
--- a/tests/libtest/lib1551.c
+++ b/tests/libtest/lib1551.c
@@ -30,6 +30,7 @@ int test(char *URL)
CURL *curl;
CURLcode res = CURLE_OK;
+ global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, URL);
@@ -41,5 +42,6 @@ int test(char *URL)
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
+ curl_global_cleanup();
return (int)res;
}
diff --git a/tests/libtest/lib1552.c b/tests/libtest/lib1552.c
new file mode 100644
index 0000000..02c4ea8
--- /dev/null
+++ b/tests/libtest/lib1552.c
@@ -0,0 +1,93 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#define TEST_HANG_TIMEOUT 60 * 1000
+
+int test(char *URL)
+{
+ CURL *curls = NULL;
+ CURLM *multi = NULL;
+ int still_running;
+ int i = 0;
+ int res = 0;
+ CURLMsg *msg;
+ int counter = 3;
+
+ start_test_timing();
+
+ global_init(CURL_GLOBAL_ALL);
+
+ multi_init(multi);
+
+ easy_init(curls);
+
+ easy_setopt(curls, CURLOPT_URL, URL);
+ easy_setopt(curls, CURLOPT_HEADER, 1L);
+ easy_setopt(curls, CURLOPT_VERBOSE, 1L);
+ easy_setopt(curls, CURLOPT_USERPWD, "u:s");
+
+ multi_add_handle(multi, curls);
+
+ multi_perform(multi, &still_running);
+
+ abort_on_test_timeout();
+
+ while(still_running && counter--) {
+ int num;
+ res = curl_multi_wait(multi, NULL, 0, TEST_HANG_TIMEOUT, &num);
+ if(res != CURLM_OK) {
+ printf("curl_multi_wait() returned %d\n", res);
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ abort_on_test_timeout();
+
+ multi_perform(multi, &still_running);
+
+ abort_on_test_timeout();
+ }
+
+ msg = curl_multi_info_read(multi, &still_running);
+ if(msg)
+ /* this should now contain a result code from the easy handle,
+ get it */
+ i = msg->data.result;
+
+test_cleanup:
+
+ /* undocumented cleanup sequence - type UA */
+
+ curl_multi_cleanup(multi);
+ curl_easy_cleanup(curls);
+ curl_global_cleanup();
+
+ if(res)
+ i = res;
+
+ return i; /* return the final return code */
+}
diff --git a/tests/libtest/lib1553.c b/tests/libtest/lib1553.c
new file mode 100644
index 0000000..60be7c1
--- /dev/null
+++ b/tests/libtest/lib1553.c
@@ -0,0 +1,109 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#define TEST_HANG_TIMEOUT 60 * 1000
+
+static int xferinfo(void *p,
+ curl_off_t dltotal, curl_off_t dlnow,
+ curl_off_t ultotal, curl_off_t ulnow)
+{
+ (void)p;
+ (void)dlnow;
+ (void)dltotal;
+ (void)ulnow;
+ (void)ultotal;
+ fprintf(stderr, "xferinfo fail!\n");
+ return 1; /* fail as fast as we can */
+}
+
+int test(char *URL)
+{
+ CURL *curls = NULL;
+ CURLM *multi = NULL;
+ int still_running;
+ int i = 0;
+ int res = 0;
+ curl_mimepart *field = NULL;
+ curl_mime *mime = NULL;
+ int counter = 1;
+
+ start_test_timing();
+
+ global_init(CURL_GLOBAL_ALL);
+
+ multi_init(multi);
+
+ easy_init(curls);
+
+ mime = curl_mime_init(curls);
+ field = curl_mime_addpart(mime);
+ curl_mime_name(field, "name");
+ curl_mime_data(field, "value", CURL_ZERO_TERMINATED);
+
+ easy_setopt(curls, CURLOPT_URL, URL);
+ easy_setopt(curls, CURLOPT_HEADER, 1L);
+ easy_setopt(curls, CURLOPT_VERBOSE, 1L);
+ easy_setopt(curls, CURLOPT_MIMEPOST, mime);
+ easy_setopt(curls, CURLOPT_USERPWD, "u:s");
+ easy_setopt(curls, CURLOPT_XFERINFOFUNCTION, xferinfo);
+ easy_setopt(curls, CURLOPT_NOPROGRESS, 1L);
+
+ multi_add_handle(multi, curls);
+
+ multi_perform(multi, &still_running);
+
+ abort_on_test_timeout();
+
+ while(still_running && counter--) {
+ int num;
+ res = curl_multi_wait(multi, NULL, 0, TEST_HANG_TIMEOUT, &num);
+ if(res != CURLM_OK) {
+ printf("curl_multi_wait() returned %d\n", res);
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ abort_on_test_timeout();
+
+ multi_perform(multi, &still_running);
+
+ abort_on_test_timeout();
+ }
+
+test_cleanup:
+
+ curl_mime_free(mime);
+ curl_multi_remove_handle(multi, curls);
+ curl_multi_cleanup(multi);
+ curl_easy_cleanup(curls);
+ curl_global_cleanup();
+
+ if(res)
+ i = res;
+
+ return i; /* return the final return code */
+}
diff --git a/tests/libtest/lib1554.c b/tests/libtest/lib1554.c
new file mode 100644
index 0000000..aa4aeb7
--- /dev/null
+++ b/tests/libtest/lib1554.c
@@ -0,0 +1,81 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+#include "memdebug.h"
+
+static void my_lock(CURL *handle, curl_lock_data data,
+ curl_lock_access laccess, void *useptr)
+{
+ (void)handle;
+ (void)data;
+ (void)laccess;
+ (void)useptr;
+ printf("-> Mutex lock\n");
+}
+
+static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
+{
+ (void)handle;
+ (void)data;
+ (void)useptr;
+ printf("<- Mutex unlock\n");
+}
+
+/* test function */
+int test(char *URL)
+{
+ CURL *curl;
+ CURLcode res;
+ CURLSH *share;
+ int i;
+
+ share = curl_share_init();
+ curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
+ curl_share_setopt(share, CURLSHOPT_LOCKFUNC, my_lock);
+ curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, my_unlock);
+
+ /* Loop the transfer and cleanup the handle properly every lap. This will
+ still reuse connections since the pool is in the shared object! */
+
+ for(i = 0; i < 3; i++) {
+ curl = curl_easy_init();
+ if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, URL);
+
+ /* use the share object */
+ curl_easy_setopt(curl, CURLOPT_SHARE, share);
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+ /* Check for errors */
+ if(res != CURLE_OK)
+ fprintf(stderr, "curl_easy_perform() failed: %s\n",
+ curl_easy_strerror(res));
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+ }
+ }
+
+ curl_share_cleanup(share);
+ return 0;
+}
diff --git a/tests/libtest/lib1900.c b/tests/libtest/lib1900.c
index cac1dd1..109c570 100644
--- a/tests/libtest/lib1900.c
+++ b/tests/libtest/lib1900.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013 - 2016, Linus Nielsen Feltzing, <linus@haxx.se>
+ * Copyright (C) 2013 - 2017, Linus Nielsen Feltzing, <linus@haxx.se>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -88,13 +88,13 @@ static int parse_url_file(const char *filename)
static void free_urls(void)
{
int i;
- for(i = 0;i < num_handles;i++) {
+ for(i = 0; i < num_handles; i++) {
Curl_safefree(urlstring[i]);
}
- for(i = 0;i < blacklist_num_servers;i++) {
+ for(i = 0; i < blacklist_num_servers; i++) {
Curl_safefree(server_blacklist[i]);
}
- for(i = 0;i < blacklist_num_sites;i++) {
+ for(i = 0; i < blacklist_num_sites; i++) {
Curl_safefree(site_blacklist[i]);
}
}
@@ -103,7 +103,7 @@ static int create_handles(void)
{
int i;
- for(i = 0;i < num_handles;i++) {
+ for(i = 0; i < num_handles; i++) {
handles[i] = curl_easy_init();
}
return 0;
@@ -126,7 +126,7 @@ static void remove_handles(void)
{
int i;
- for(i = 0;i < num_handles;i++) {
+ for(i = 0; i < num_handles; i++) {
if(handles[i])
curl_easy_cleanup(handles[i]);
}
@@ -229,7 +229,7 @@ int test(char *URL)
interval.tv_sec = 0;
interval.tv_usec = 1000;
- select_test(maxfd+1, &rd, &wr, &exc, &interval);
+ select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib500.c b/tests/libtest/lib500.c
index d17b24b..677ab73 100644
--- a/tests/libtest/lib500.c
+++ b/tests/libtest/lib500.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -61,7 +61,7 @@ int test(char *URL)
{
CURLcode res;
CURL *curl;
- char *ipstr=NULL;
+ char *ipstr = NULL;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib501.c b/tests/libtest/lib501.c
index 7a23412..af65bd4 100644
--- a/tests/libtest/lib501.c
+++ b/tests/libtest/lib501.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,6 +44,9 @@ int test(char *URL)
test_setopt(curl, CURLOPT_HEADER, 1L);
+ /* just verify that setting this to -1 is fine */
+ test_setopt(curl, CURLOPT_MAXREDIRS, -1L);
+
res = curl_easy_perform(curl);
test_cleanup:
diff --git a/tests/libtest/lib502.c b/tests/libtest/lib502.c
index 7cf6415..ce4bc47 100644
--- a/tests/libtest/lib502.c
+++ b/tests/libtest/lib502.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -73,7 +73,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib503.c b/tests/libtest/lib503.c
index 2eb2874..15b45f9 100644
--- a/tests/libtest/lib503.c
+++ b/tests/libtest/lib503.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2012, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -83,7 +83,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &rd, &wr, &exc, &interval);
+ select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib504.c b/tests/libtest/lib504.c
index 3466dc9..771b203 100644
--- a/tests/libtest/lib504.c
+++ b/tests/libtest/lib504.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -95,7 +95,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &rd, &wr, &exc, &interval);
+ select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib505.c b/tests/libtest/lib505.c
index ad5d214..cc7463b 100644
--- a/tests/libtest/lib505.c
+++ b/tests/libtest/lib505.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -43,7 +43,7 @@ int test(char *URL)
struct_stat file_info;
struct curl_slist *hl;
- struct curl_slist *headerlist=NULL;
+ struct curl_slist *headerlist = NULL;
const char *buf_1 = "RNFR 505";
const char *buf_2 = "RNTO 505-forreal";
diff --git a/tests/libtest/lib506.c b/tests/libtest/lib506.c
index d26252b..1b522be 100644
--- a/tests/libtest/lib506.c
+++ b/tests/libtest/lib506.c
@@ -131,7 +131,7 @@ static void *fire(void *ptr)
struct curl_slist *headers;
struct Tdata *tdata = (struct Tdata*)ptr;
CURL *curl;
- int i=0;
+ int i = 0;
curl = curl_easy_init();
if(!curl) {
@@ -261,7 +261,7 @@ int test(char *URL)
res = 0;
/* start treads */
- for(i=1; i<=THREADS; i++) {
+ for(i = 1; i <= THREADS; i++) {
/* set thread data */
tdata.url = suburl(URL, i); /* must be curl_free()d */
@@ -349,7 +349,7 @@ int test(char *URL)
/* try to free share, expect to fail because share is in use*/
printf("try SHARE_CLEANUP...\n");
scode = curl_share_cleanup(share);
- if(scode==CURLSHE_OK) {
+ if(scode == CURLSHE_OK) {
fprintf(stderr, "curl_share_cleanup succeed but error expected\n");
share = NULL;
}
@@ -368,7 +368,7 @@ test_cleanup:
/* free share */
printf("SHARE_CLEANUP\n");
scode = curl_share_cleanup(share);
- if(scode!=CURLSHE_OK)
+ if(scode != CURLSHE_OK)
fprintf(stderr, "curl_share_cleanup failed, code errno %d\n",
(int)scode);
diff --git a/tests/libtest/lib507.c b/tests/libtest/lib507.c
index ebe897a..9cd47cc 100644
--- a/tests/libtest/lib507.c
+++ b/tests/libtest/lib507.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -70,7 +70,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
abort_on_test_timeout();
diff --git a/tests/libtest/lib508.c b/tests/libtest/lib508.c
index 1f6c683..30705e4 100644
--- a/tests/libtest/lib508.c
+++ b/tests/libtest/lib508.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -50,7 +50,7 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
struct WriteThis pooh;
diff --git a/tests/libtest/lib510.c b/tests/libtest/lib510.c
index 4c290f1..4d568df 100644
--- a/tests/libtest/lib510.c
+++ b/tests/libtest/lib510.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -62,7 +62,7 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
struct curl_slist *slist = NULL;
struct WriteThis pooh;
pooh.counter = 0;
diff --git a/tests/libtest/lib513.c b/tests/libtest/lib513.c
index 7c34bc4..c6a98cc 100644
--- a/tests/libtest/lib513.c
+++ b/tests/libtest/lib513.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,7 +35,7 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib514.c b/tests/libtest/lib514.c
index 7b33d52..702058b 100644
--- a/tests/libtest/lib514.c
+++ b/tests/libtest/lib514.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,7 +26,7 @@
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib515.c b/tests/libtest/lib515.c
index 6fb1787..9f29d43 100644
--- a/tests/libtest/lib515.c
+++ b/tests/libtest/lib515.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,7 +26,7 @@
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib516.c b/tests/libtest/lib516.c
index 00c54c4..6d83e21 100644
--- a/tests/libtest/lib516.c
+++ b/tests/libtest/lib516.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,7 +26,7 @@
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib517.c b/tests/libtest/lib517.c
index 22162ff..af7b2aa 100644
--- a/tests/libtest/lib517.c
+++ b/tests/libtest/lib517.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -131,7 +131,7 @@ int test(char *URL)
(void)URL; /* not used */
- for(i=0; dates[i]; i++) {
+ for(i = 0; dates[i]; i++) {
printf("%d: %s => %ld\n", i, dates[i], (long)curl_getdate(dates[i], NULL));
}
diff --git a/tests/libtest/lib525.c b/tests/libtest/lib525.c
index 715b7fb..c179960 100644
--- a/tests/libtest/lib525.c
+++ b/tests/libtest/lib525.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -132,7 +132,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &rd, &wr, &exc, &interval);
+ select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib526.c b/tests/libtest/lib526.c
index 522cd74..42eb7cb 100644
--- a/tests/libtest/lib526.c
+++ b/tests/libtest/lib526.c
@@ -59,7 +59,7 @@ int test(char *URL)
int current = 0;
int i;
- for(i=0; i < NUM_HANDLES; i++)
+ for(i = 0; i < NUM_HANDLES; i++)
curl[i] = NULL;
start_test_timing();
@@ -67,7 +67,7 @@ int test(char *URL)
global_init(CURL_GLOBAL_ALL);
/* get NUM_HANDLES easy handles */
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
easy_init(curl[i]);
/* specify target */
easy_setopt(curl[i], CURLOPT_URL, URL);
@@ -133,7 +133,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &rd, &wr, &exc, &interval);
+ select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
@@ -145,7 +145,7 @@ test_cleanup:
/* test 526 and 528 */
/* proper cleanup sequence - type PB */
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
curl_multi_remove_handle(m, curl[i]);
curl_easy_cleanup(curl[i]);
}
@@ -162,7 +162,7 @@ test_cleanup:
will be leaked, let's use undocumented cleanup sequence - type UB */
if(res)
- for(i=0; i < NUM_HANDLES; i++)
+ for(i = 0; i < NUM_HANDLES; i++)
curl_easy_cleanup(curl[i]);
curl_multi_cleanup(m);
@@ -173,7 +173,7 @@ test_cleanup:
/* test 532 */
/* undocumented cleanup sequence - type UB */
- for(i=0; i < NUM_HANDLES; i++)
+ for(i = 0; i < NUM_HANDLES; i++)
curl_easy_cleanup(curl[i]);
curl_multi_cleanup(m);
curl_global_cleanup();
diff --git a/tests/libtest/lib530.c b/tests/libtest/lib530.c
index 82bfab3..7b71fa5 100644
--- a/tests/libtest/lib530.c
+++ b/tests/libtest/lib530.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -39,7 +39,7 @@ int test(char *URL)
char target_url[256];
int handles_added = 0;
- for(i=0; i < NUM_HANDLES; i++)
+ for(i = 0; i < NUM_HANDLES; i++)
curl[i] = NULL;
start_test_timing();
@@ -49,7 +49,7 @@ int test(char *URL)
multi_init(m);
/* get NUM_HANDLES easy handles */
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
/* get an easy handle */
easy_init(curl[i]);
/* specify target */
@@ -101,7 +101,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &rd, &wr, &exc, &interval);
+ select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
@@ -110,7 +110,7 @@ test_cleanup:
/* proper cleanup sequence - type PB */
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
curl_multi_remove_handle(m, curl[i]);
curl_easy_cleanup(curl[i]);
}
diff --git a/tests/libtest/lib533.c b/tests/libtest/lib533.c
index 706b269..7dd0fb5 100644
--- a/tests/libtest/lib533.c
+++ b/tests/libtest/lib533.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,7 +37,7 @@ int test(char *URL)
CURL *curl = NULL;
int running;
CURLM *m = NULL;
- int current=0;
+ int current = 0;
start_test_timing();
@@ -95,7 +95,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &rd, &wr, &exc, &interval);
+ select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib536.c b/tests/libtest/lib536.c
index f3ba573..e694362 100644
--- a/tests/libtest/lib536.c
+++ b/tests/libtest/lib536.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -63,7 +63,7 @@ static int perform(CURLM *multi)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- res_select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &interval);
+ res_select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &interval);
if(res)
return res;
diff --git a/tests/libtest/lib540.c b/tests/libtest/lib540.c
index ac86209..a13653c 100644
--- a/tests/libtest/lib540.c
+++ b/tests/libtest/lib540.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -152,7 +152,7 @@ static int loop(int num, CURLM *cm, const char *url, const char *userpwd,
T.tv_usec = 0;
}
- res_select_test(M+1, &R, &W, &E, &T);
+ res_select_test(M + 1, &R, &W, &E, &T);
if(res)
return res;
}
@@ -165,7 +165,7 @@ static int loop(int num, CURLM *cm, const char *url, const char *userpwd,
curl_easy_strerror(msg->data.result));
curl_multi_remove_handle(cm, e);
curl_easy_cleanup(e);
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
if(eh[i] == e) {
eh[i] = NULL;
break;
@@ -192,7 +192,7 @@ int test(char *URL)
int res = 0;
int i;
- for(i=0; i < NUM_HANDLES; i++)
+ for(i = 0; i < NUM_HANDLES; i++)
eh[i] = NULL;
start_test_timing();
@@ -234,7 +234,7 @@ test_cleanup:
/* proper cleanup sequence - type PB */
- for(i=0; i < NUM_HANDLES; i++) {
+ for(i = 0; i < NUM_HANDLES; i++) {
curl_multi_remove_handle(cm, eh[i]);
curl_easy_cleanup(eh[i]);
}
diff --git a/tests/libtest/lib543.c b/tests/libtest/lib543.c
index 6d2532d..957839f 100644
--- a/tests/libtest/lib543.c
+++ b/tests/libtest/lib543.c
@@ -27,15 +27,18 @@
int test(char *URL)
{
- unsigned char a[] = {0x9c, 0x26, 0x4b, 0x3d, 0x49, 0x4, 0xa1, 0x1,
- 0xe0, 0xd8, 0x7c, 0x20, 0xb7, 0xef, 0x53, 0x29, 0xfa,
- 0x1d, 0x57, 0xe1};
+ static const unsigned char a[] = {
+ 0x9c, 0x26, 0x4b, 0x3d, 0x49, 0x4, 0xa1, 0x1,
+ 0xe0, 0xd8, 0x7c, 0x20, 0xb7, 0xef, 0x53, 0x29, 0xfa,
+ 0x1d, 0x57, 0xe1};
CURL *easy;
int asize;
char *s;
+ CURLcode res = CURLE_OK;
(void)URL;
+ global_init(CURL_GLOBAL_ALL);
easy = curl_easy_init();
if(!easy) {
fprintf(stderr, "curl_easy_init() failed\n");
@@ -44,7 +47,7 @@ int test(char *URL)
asize = (int)sizeof(a);
- s = curl_easy_escape(easy, (char *)a, asize);
+ s = curl_easy_escape(easy, (const char *)a, asize);
if(s)
printf("%s\n", s);
@@ -53,6 +56,7 @@ int test(char *URL)
curl_free(s);
curl_easy_cleanup(easy);
+ curl_global_cleanup();
return 0;
}
diff --git a/tests/libtest/lib544.c b/tests/libtest/lib544.c
index 28eacda..1f832d2 100644
--- a/tests/libtest/lib544.c
+++ b/tests/libtest/lib544.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,7 +40,7 @@ static char teststring[] =
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib547.c b/tests/libtest/lib547.c
index ce967c0..3db4890 100644
--- a/tests/libtest/lib547.c
+++ b/tests/libtest/lib547.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -82,7 +82,7 @@ int test(char *URL)
CURLcode res;
CURL *curl;
#ifndef LIB548
- int counter=0;
+ int counter = 0;
#endif
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
diff --git a/tests/libtest/lib552.c b/tests/libtest/lib552.c
index 3a93daf..5082eb0 100644
--- a/tests/libtest/lib552.c
+++ b/tests/libtest/lib552.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,7 +40,7 @@ void dump(const char *text,
size_t i;
size_t c;
- unsigned int width=0x10;
+ unsigned int width = 0x10;
if(nohex)
/* without the hex output, we can fit more on screen */
@@ -48,30 +48,32 @@ void dump(const char *text,
fprintf(stream, "%s, %d bytes (0x%x)\n", text, (int)size, (int)size);
- for(i=0; i<size; i+= width) {
+ for(i = 0; i<size; i += width) {
fprintf(stream, "%04x: ", (int)i);
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
- if(i+c < size)
- fprintf(stream, "%02x ", ptr[i+c]);
+ if(i + c < size)
+ fprintf(stream, "%02x ", ptr[i + c]);
else
fputs(" ", stream);
}
- for(c = 0; (c < width) && (i+c < size); c++) {
+ for(c = 0; (c < width) && (i + c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
- if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
- i+=(c+2-width);
+ if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+ ptr[i + c + 1] == 0x0A) {
+ i += (c + 2 - width);
break;
}
fprintf(stream, "%c",
- (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
+ (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)? ptr[i + c] : '.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
- if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
- i+=(c+3-width);
+ if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+ ptr[i + c + 2] == 0x0A) {
+ i += (c + 3 - width);
break;
}
}
@@ -166,19 +168,15 @@ static curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp)
int test(char *URL)
{
CURL *curl;
- CURLcode res = CURLE_OUT_OF_MEMORY;
+ CURLcode res = CURLE_OK;
struct data config;
size_t i;
static const char fill[] = "test data";
config.trace_ascii = 1; /* enable ascii tracing */
- curl = curl_easy_init();
- if(!curl) {
- fprintf(stderr, "curl_easy_init() failed\n");
- curl_global_cleanup();
- return TEST_ERR_MAJOR_BAD;
- }
+ global_init(CURL_GLOBAL_ALL);
+ easy_init(curl);
test_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
test_setopt(curl, CURLOPT_DEBUGDATA, &config);
@@ -186,7 +184,7 @@ int test(char *URL)
test_setopt(curl, CURLOPT_VERBOSE, 1L);
/* setup repeated data string */
- for(i=0; i < sizeof(databuf); ++i)
+ for(i = 0; i < sizeof(databuf); ++i)
databuf[i] = fill[i % sizeof fill];
/* Post */
diff --git a/tests/libtest/lib553.c b/tests/libtest/lib553.c
index 288f4c1..c06561e 100644
--- a/tests/libtest/lib553.c
+++ b/tests/libtest/lib553.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,7 +32,7 @@
static size_t myreadfunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
- static size_t total=POSTLEN;
+ static size_t total = POSTLEN;
static char buf[1024];
(void)stream;
@@ -60,7 +60,7 @@ int test(char *URL)
CURL *curl;
CURLcode res = CURLE_FAILED_INIT;
int i;
- struct curl_slist *headerlist=NULL, *hl;
+ struct curl_slist *headerlist = NULL, *hl;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
@@ -77,7 +77,7 @@ int test(char *URL)
for(i = 0; i < NUM_HEADERS; i++) {
int len = snprintf(buf, sizeof(buf), "Header%d: ", i);
memset(&buf[len], 'A', SIZE_HEADERS);
- buf[len + SIZE_HEADERS]=0; /* zero terminate */
+ buf[len + SIZE_HEADERS] = 0; /* zero terminate */
hl = curl_slist_append(headerlist, buf);
if(!hl)
goto test_cleanup;
diff --git a/tests/libtest/lib554.c b/tests/libtest/lib554.c
index 0837462..cc21d24 100644
--- a/tests/libtest/lib554.c
+++ b/tests/libtest/lib554.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -67,11 +67,11 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
static int once(char *URL, bool oldstyle)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
CURLFORMcode formrc;
- struct curl_httppost *formpost=NULL;
- struct curl_httppost *lastptr=NULL;
+ struct curl_httppost *formpost = NULL;
+ struct curl_httppost *lastptr = NULL;
struct WriteThis pooh;
struct WriteThis pooh2;
@@ -117,7 +117,7 @@ static int once(char *URL, bool oldstyle)
CURLFORM_END);
if(formrc)
- printf("curl_formadd(1) = %d\n", (int)formrc);
+ printf("curl_formadd(2) = %d\n", (int)formrc);
/* Fill in the filename field */
formrc = curl_formadd(&formpost,
@@ -134,7 +134,7 @@ static int once(char *URL, bool oldstyle)
CURLFORM_END);
if(formrc)
- printf("curl_formadd(2) = %d\n", (int)formrc);
+ printf("curl_formadd(3) = %d\n", (int)formrc);
/* Fill in a submit field too */
formrc = curl_formadd(&formpost,
@@ -147,10 +147,11 @@ static int once(char *URL, bool oldstyle)
#else
CURLFORM_COPYCONTENTS, "send",
#endif
+ CURLFORM_CONTENTTYPE, "text/plain",
CURLFORM_END);
if(formrc)
- printf("curl_formadd(3) = %d\n", (int)formrc);
+ printf("curl_formadd(4) = %d\n", (int)formrc);
formrc = curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "somename",
@@ -160,7 +161,7 @@ static int once(char *URL, bool oldstyle)
CURLFORM_END);
if(formrc)
- printf("curl_formadd(4) = %d\n", (int)formrc);
+ printf("curl_formadd(5) = %d\n", (int)formrc);
curl = curl_easy_init();
if(!curl) {
diff --git a/tests/libtest/lib555.c b/tests/libtest/lib555.c
index 8156a95..fc71bb6 100644
--- a/tests/libtest/lib555.c
+++ b/tests/libtest/lib555.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -77,9 +77,9 @@ int test(char *URL)
{
int res = 0;
CURL *curl = NULL;
- int counter=0;
+ int counter = 0;
CURLM *m = NULL;
- int running=1;
+ int running = 1;
start_test_timing();
@@ -141,7 +141,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib556.c b/tests/libtest/lib556.c
index f06c529..acb0f63 100644
--- a/tests/libtest/lib556.c
+++ b/tests/libtest/lib556.c
@@ -95,8 +95,8 @@ int test(char *URL)
} while((res == CURLE_OK && iolen != 0) || (res == CURLE_AGAIN));
}
- if(res != CURLE_OK || iolen != 0)
- return TEST_ERR_FAILURE;
+ if(iolen != 0)
+ res = TEST_ERR_FAILURE;
}
test_cleanup:
diff --git a/tests/libtest/lib557.c b/tests/libtest/lib557.c
index 4a598f2..9a87fbd 100644
--- a/tests/libtest/lib557.c
+++ b/tests/libtest/lib557.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,7 +37,7 @@
#include "memdebug.h"
-#if (CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG)
+#if (SIZEOF_CURL_OFF_T > SIZEOF_LONG)
# define MPRNT_SUFFIX_CURL_OFF_T LL
#else
# define MPRNT_SUFFIX_CURL_OFF_T L
@@ -129,7 +129,7 @@ static int test_unsigned_short_formatting(void)
#if (SIZEOF_SHORT == 1)
- i=1; us_test[i].num = 0xFFU; us_test[i].expected = "256";
+ i = 1; us_test[i].num = 0xFFU; us_test[i].expected = "256";
i++; us_test[i].num = 0xF0U; us_test[i].expected = "240";
i++; us_test[i].num = 0x0FU; us_test[i].expected = "15";
@@ -146,7 +146,7 @@ static int test_unsigned_short_formatting(void)
#elif (SIZEOF_SHORT == 2)
- i=1; us_test[i].num = 0xFFFFU; us_test[i].expected = "65535";
+ i = 1; us_test[i].num = 0xFFFFU; us_test[i].expected = "65535";
i++; us_test[i].num = 0xFF00U; us_test[i].expected = "65280";
i++; us_test[i].num = 0x00FFU; us_test[i].expected = "255";
@@ -167,7 +167,7 @@ static int test_unsigned_short_formatting(void)
#elif (SIZEOF_SHORT == 4)
- i=1; us_test[i].num = 0xFFFFFFFFU; us_test[i].expected = "4294967295";
+ i = 1; us_test[i].num = 0xFFFFFFFFU; us_test[i].expected = "4294967295";
i++; us_test[i].num = 0xFFFF0000U; us_test[i].expected = "4294901760";
i++; us_test[i].num = 0x0000FFFFU; us_test[i].expected = "65535";
@@ -201,9 +201,9 @@ static int test_unsigned_short_formatting(void)
#endif
- for(i=1; i<=num_ushort_tests; i++) {
+ for(i = 1; i <= num_ushort_tests; i++) {
- for(j=0; j<BUFSZ; j++)
+ for(j = 0; j<BUFSZ; j++)
us_test[i].result[j] = 'X';
us_test[i].result[BUFSZ-1] = '\0';
@@ -236,7 +236,7 @@ static int test_signed_short_formatting(void)
#if (SIZEOF_SHORT == 1)
- i=1; ss_test[i].num = 0x7F; ss_test[i].expected = "127";
+ i = 1; ss_test[i].num = 0x7F; ss_test[i].expected = "127";
i++; ss_test[i].num = 0x70; ss_test[i].expected = "112";
i++; ss_test[i].num = 0x07; ss_test[i].expected = "7";
@@ -261,7 +261,7 @@ static int test_signed_short_formatting(void)
#elif (SIZEOF_SHORT == 2)
- i=1; ss_test[i].num = 0x7FFF; ss_test[i].expected = "32767";
+ i = 1; ss_test[i].num = 0x7FFF; ss_test[i].expected = "32767";
i++; ss_test[i].num = 0x7FFE; ss_test[i].expected = "32766";
i++; ss_test[i].num = 0x7FFD; ss_test[i].expected = "32765";
i++; ss_test[i].num = 0x7F00; ss_test[i].expected = "32512";
@@ -304,7 +304,7 @@ static int test_signed_short_formatting(void)
#elif (SIZEOF_SHORT == 4)
- i=1; ss_test[i].num = 0x7FFFFFFF; ss_test[i].expected = "2147483647";
+ i = 1; ss_test[i].num = 0x7FFFFFFF; ss_test[i].expected = "2147483647";
i++; ss_test[i].num = 0x7FFFFFFE; ss_test[i].expected = "2147483646";
i++; ss_test[i].num = 0x7FFFFFFD; ss_test[i].expected = "2147483645";
i++; ss_test[i].num = 0x7FFF0000; ss_test[i].expected = "2147418112";
@@ -371,9 +371,9 @@ static int test_signed_short_formatting(void)
#endif
- for(i=1; i<=num_sshort_tests; i++) {
+ for(i = 1; i <= num_sshort_tests; i++) {
- for(j=0; j<BUFSZ; j++)
+ for(j = 0; j<BUFSZ; j++)
ss_test[i].result[j] = 'X';
ss_test[i].result[BUFSZ-1] = '\0';
@@ -406,7 +406,7 @@ static int test_unsigned_int_formatting(void)
#if (SIZEOF_INT == 2)
- i=1; ui_test[i].num = 0xFFFFU; ui_test[i].expected = "65535";
+ i = 1; ui_test[i].num = 0xFFFFU; ui_test[i].expected = "65535";
i++; ui_test[i].num = 0xFF00U; ui_test[i].expected = "65280";
i++; ui_test[i].num = 0x00FFU; ui_test[i].expected = "255";
@@ -427,7 +427,7 @@ static int test_unsigned_int_formatting(void)
#elif (SIZEOF_INT == 4)
- i=1; ui_test[i].num = 0xFFFFFFFFU; ui_test[i].expected = "4294967295";
+ i = 1; ui_test[i].num = 0xFFFFFFFFU; ui_test[i].expected = "4294967295";
i++; ui_test[i].num = 0xFFFF0000U; ui_test[i].expected = "4294901760";
i++; ui_test[i].num = 0x0000FFFFU; ui_test[i].expected = "65535";
@@ -462,7 +462,7 @@ static int test_unsigned_int_formatting(void)
#elif (SIZEOF_INT == 8)
/* !checksrc! disable LONGLINE all */
- i=1; ui_test[i].num = 0xFFFFFFFFFFFFFFFFU; ui_test[i].expected = "18446744073709551615";
+ i = 1; ui_test[i].num = 0xFFFFFFFFFFFFFFFFU; ui_test[i].expected = "18446744073709551615";
i++; ui_test[i].num = 0xFFFFFFFF00000000U; ui_test[i].expected = "18446744069414584320";
i++; ui_test[i].num = 0x00000000FFFFFFFFU; ui_test[i].expected = "4294967295";
@@ -521,9 +521,9 @@ static int test_unsigned_int_formatting(void)
#endif
- for(i=1; i<=num_uint_tests; i++) {
+ for(i = 1; i <= num_uint_tests; i++) {
- for(j=0; j<BUFSZ; j++)
+ for(j = 0; j<BUFSZ; j++)
ui_test[i].result[j] = 'X';
ui_test[i].result[BUFSZ-1] = '\0';
@@ -556,7 +556,7 @@ static int test_signed_int_formatting(void)
#if (SIZEOF_INT == 2)
- i=1; si_test[i].num = 0x7FFF; si_test[i].expected = "32767";
+ i = 1; si_test[i].num = 0x7FFF; si_test[i].expected = "32767";
i++; si_test[i].num = 0x7FFE; si_test[i].expected = "32766";
i++; si_test[i].num = 0x7FFD; si_test[i].expected = "32765";
i++; si_test[i].num = 0x7F00; si_test[i].expected = "32512";
@@ -599,7 +599,7 @@ static int test_signed_int_formatting(void)
#elif (SIZEOF_INT == 4)
- i=1; si_test[i].num = 0x7FFFFFFF; si_test[i].expected = "2147483647";
+ i = 1; si_test[i].num = 0x7FFFFFFF; si_test[i].expected = "2147483647";
i++; si_test[i].num = 0x7FFFFFFE; si_test[i].expected = "2147483646";
i++; si_test[i].num = 0x7FFFFFFD; si_test[i].expected = "2147483645";
i++; si_test[i].num = 0x7FFF0000; si_test[i].expected = "2147418112";
@@ -666,7 +666,7 @@ static int test_signed_int_formatting(void)
#elif (SIZEOF_INT == 8)
- i=1; si_test[i].num = 0x7FFFFFFFFFFFFFFF; si_test[i].expected = "9223372036854775807";
+ i = 1; si_test[i].num = 0x7FFFFFFFFFFFFFFF; si_test[i].expected = "9223372036854775807";
i++; si_test[i].num = 0x7FFFFFFFFFFFFFFE; si_test[i].expected = "9223372036854775806";
i++; si_test[i].num = 0x7FFFFFFFFFFFFFFD; si_test[i].expected = "9223372036854775805";
i++; si_test[i].num = 0x7FFFFFFF00000000; si_test[i].expected = "9223372032559808512";
@@ -749,9 +749,9 @@ static int test_signed_int_formatting(void)
#endif
- for(i=1; i<=num_sint_tests; i++) {
+ for(i = 1; i <= num_sint_tests; i++) {
- for(j=0; j<BUFSZ; j++)
+ for(j = 0; j<BUFSZ; j++)
si_test[i].result[j] = 'X';
si_test[i].result[BUFSZ-1] = '\0';
@@ -782,9 +782,9 @@ static int test_unsigned_long_formatting(void)
int num_ulong_tests;
int failed = 0;
-#if (CURL_SIZEOF_LONG == 2)
+#if (SIZEOF_LONG == 2)
- i=1; ul_test[i].num = 0xFFFFUL; ul_test[i].expected = "65535";
+ i = 1; ul_test[i].num = 0xFFFFUL; ul_test[i].expected = "65535";
i++; ul_test[i].num = 0xFF00UL; ul_test[i].expected = "65280";
i++; ul_test[i].num = 0x00FFUL; ul_test[i].expected = "255";
@@ -803,9 +803,9 @@ static int test_unsigned_long_formatting(void)
num_ulong_tests = i;
-#elif (CURL_SIZEOF_LONG == 4)
+#elif (SIZEOF_LONG == 4)
- i=1; ul_test[i].num = 0xFFFFFFFFUL; ul_test[i].expected = "4294967295";
+ i = 1; ul_test[i].num = 0xFFFFFFFFUL; ul_test[i].expected = "4294967295";
i++; ul_test[i].num = 0xFFFF0000UL; ul_test[i].expected = "4294901760";
i++; ul_test[i].num = 0x0000FFFFUL; ul_test[i].expected = "65535";
@@ -837,9 +837,9 @@ static int test_unsigned_long_formatting(void)
num_ulong_tests = i;
-#elif (CURL_SIZEOF_LONG == 8)
+#elif (SIZEOF_LONG == 8)
- i=1; ul_test[i].num = 0xFFFFFFFFFFFFFFFFUL; ul_test[i].expected = "18446744073709551615";
+ i = 1; ul_test[i].num = 0xFFFFFFFFFFFFFFFFUL; ul_test[i].expected = "18446744073709551615";
i++; ul_test[i].num = 0xFFFFFFFF00000000UL; ul_test[i].expected = "18446744069414584320";
i++; ul_test[i].num = 0x00000000FFFFFFFFUL; ul_test[i].expected = "4294967295";
@@ -898,9 +898,9 @@ static int test_unsigned_long_formatting(void)
#endif
- for(i=1; i<=num_ulong_tests; i++) {
+ for(i = 1; i <= num_ulong_tests; i++) {
- for(j=0; j<BUFSZ; j++)
+ for(j = 0; j<BUFSZ; j++)
ul_test[i].result[j] = 'X';
ul_test[i].result[BUFSZ-1] = '\0';
@@ -931,9 +931,9 @@ static int test_signed_long_formatting(void)
int num_slong_tests;
int failed = 0;
-#if (CURL_SIZEOF_LONG == 2)
+#if (SIZEOF_LONG == 2)
- i=1; sl_test[i].num = 0x7FFFL; sl_test[i].expected = "32767";
+ i = 1; sl_test[i].num = 0x7FFFL; sl_test[i].expected = "32767";
i++; sl_test[i].num = 0x7FFEL; sl_test[i].expected = "32766";
i++; sl_test[i].num = 0x7FFDL; sl_test[i].expected = "32765";
i++; sl_test[i].num = 0x7F00L; sl_test[i].expected = "32512";
@@ -974,9 +974,9 @@ static int test_signed_long_formatting(void)
num_slong_tests = i;
-#elif (CURL_SIZEOF_LONG == 4)
+#elif (SIZEOF_LONG == 4)
- i=1; sl_test[i].num = 0x7FFFFFFFL; sl_test[i].expected = "2147483647";
+ i = 1; sl_test[i].num = 0x7FFFFFFFL; sl_test[i].expected = "2147483647";
i++; sl_test[i].num = 0x7FFFFFFEL; sl_test[i].expected = "2147483646";
i++; sl_test[i].num = 0x7FFFFFFDL; sl_test[i].expected = "2147483645";
i++; sl_test[i].num = 0x7FFF0000L; sl_test[i].expected = "2147418112";
@@ -1041,9 +1041,9 @@ static int test_signed_long_formatting(void)
num_slong_tests = i;
-#elif (CURL_SIZEOF_LONG == 8)
+#elif (SIZEOF_LONG == 8)
- i=1; sl_test[i].num = 0x7FFFFFFFFFFFFFFFL; sl_test[i].expected = "9223372036854775807";
+ i = 1; sl_test[i].num = 0x7FFFFFFFFFFFFFFFL; sl_test[i].expected = "9223372036854775807";
i++; sl_test[i].num = 0x7FFFFFFFFFFFFFFEL; sl_test[i].expected = "9223372036854775806";
i++; sl_test[i].num = 0x7FFFFFFFFFFFFFFDL; sl_test[i].expected = "9223372036854775805";
i++; sl_test[i].num = 0x7FFFFFFF00000000L; sl_test[i].expected = "9223372032559808512";
@@ -1126,9 +1126,9 @@ static int test_signed_long_formatting(void)
#endif
- for(i=1; i<=num_slong_tests; i++) {
+ for(i = 1; i <= num_slong_tests; i++) {
- for(j=0; j<BUFSZ; j++)
+ for(j = 0; j<BUFSZ; j++)
sl_test[i].result[j] = 'X';
sl_test[i].result[BUFSZ-1] = '\0';
@@ -1159,9 +1159,9 @@ static int test_curl_off_t_formatting(void)
int num_cofft_tests;
int failed = 0;
-#if (CURL_SIZEOF_CURL_OFF_T == 2)
+#if (SIZEOF_CURL_OFF_T == 2)
- i=1; co_test[i].num = MPRNT_OFF_T_C(0x7FFF); co_test[i].expected = "32767";
+ i = 1; co_test[i].num = MPRNT_OFF_T_C(0x7FFF); co_test[i].expected = "32767";
i++; co_test[i].num = MPRNT_OFF_T_C(0x7FFE); co_test[i].expected = "32766";
i++; co_test[i].num = MPRNT_OFF_T_C(0x7FFD); co_test[i].expected = "32765";
i++; co_test[i].num = MPRNT_OFF_T_C(0x7F00); co_test[i].expected = "32512";
@@ -1202,9 +1202,9 @@ static int test_curl_off_t_formatting(void)
num_cofft_tests = i;
-#elif (CURL_SIZEOF_CURL_OFF_T == 4)
+#elif (SIZEOF_CURL_OFF_T == 4)
- i=1; co_test[i].num = MPRNT_OFF_T_C(0x7FFFFFFF); co_test[i].expected = "2147483647";
+ i = 1; co_test[i].num = MPRNT_OFF_T_C(0x7FFFFFFF); co_test[i].expected = "2147483647";
i++; co_test[i].num = MPRNT_OFF_T_C(0x7FFFFFFE); co_test[i].expected = "2147483646";
i++; co_test[i].num = MPRNT_OFF_T_C(0x7FFFFFFD); co_test[i].expected = "2147483645";
i++; co_test[i].num = MPRNT_OFF_T_C(0x7FFF0000); co_test[i].expected = "2147418112";
@@ -1269,9 +1269,9 @@ static int test_curl_off_t_formatting(void)
num_cofft_tests = i;
-#elif (CURL_SIZEOF_CURL_OFF_T == 8)
+#elif (SIZEOF_CURL_OFF_T == 8)
- i=1; co_test[i].num = MPRNT_OFF_T_C(0x7FFFFFFFFFFFFFFF); co_test[i].expected = "9223372036854775807";
+ i = 1; co_test[i].num = MPRNT_OFF_T_C(0x7FFFFFFFFFFFFFFF); co_test[i].expected = "9223372036854775807";
i++; co_test[i].num = MPRNT_OFF_T_C(0x7FFFFFFFFFFFFFFE); co_test[i].expected = "9223372036854775806";
i++; co_test[i].num = MPRNT_OFF_T_C(0x7FFFFFFFFFFFFFFD); co_test[i].expected = "9223372036854775805";
i++; co_test[i].num = MPRNT_OFF_T_C(0x7FFFFFFF00000000); co_test[i].expected = "9223372032559808512";
@@ -1354,9 +1354,9 @@ static int test_curl_off_t_formatting(void)
#endif
- for(i=1; i<=num_cofft_tests; i++) {
+ for(i = 1; i <= num_cofft_tests; i++) {
- for(j=0; j<BUFSZ; j++)
+ for(j = 0; j<BUFSZ; j++)
co_test[i].result[j] = 'X';
co_test[i].result[BUFSZ-1] = '\0';
@@ -1546,6 +1546,7 @@ static int test_weird_arguments(void)
}
/* DBL_MAX value from Linux */
+/* !checksrc! disable PLUSNOSPACE 1 */
#define MAXIMIZE -1.7976931348623157081452E+308
static int test_float_formatting(void)
diff --git a/tests/libtest/lib560.c b/tests/libtest/lib560.c
index 8fa0c2d..0093ea1 100644
--- a/tests/libtest/lib560.c
+++ b/tests/libtest/lib560.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -91,7 +91,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
abort_on_test_timeout();
diff --git a/tests/libtest/lib564.c b/tests/libtest/lib564.c
index 1822931..f959f20 100644
--- a/tests/libtest/lib564.c
+++ b/tests/libtest/lib564.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2013, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -76,7 +76,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &rd, &wr, &exc, &interval);
+ select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib567.c b/tests/libtest/lib567.c
index f9f55e3..64fb29a 100644
--- a/tests/libtest/lib567.c
+++ b/tests/libtest/lib567.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,7 +30,7 @@ int test(char *URL)
{
CURLcode res;
CURL *curl;
- struct curl_slist *custom_headers=NULL;
+ struct curl_slist *custom_headers = NULL;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib568.c b/tests/libtest/lib568.c
index 0cdef81..3bb53f6 100644
--- a/tests/libtest/lib568.c
+++ b/tests/libtest/lib568.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,8 +47,8 @@ int test(char *URL)
FILE *sdpf = NULL;
struct_stat file_info;
char *stream_uri = NULL;
- int request=1;
- struct curl_slist *custom_headers=NULL;
+ int request = 1;
+ struct curl_slist *custom_headers = NULL;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib569.c b/tests/libtest/lib569.c
index d7381d9..c18c882 100644
--- a/tests/libtest/lib569.c
+++ b/tests/libtest/lib569.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,7 +37,7 @@ int test(char *URL)
CURL *curl;
char *stream_uri = NULL;
char *rtsp_session_id;
- int request=1;
+ int request = 1;
int i;
FILE *idfile = NULL;
diff --git a/tests/libtest/lib570.c b/tests/libtest/lib570.c
index 9d9b5a1..1756a86 100644
--- a/tests/libtest/lib570.c
+++ b/tests/libtest/lib570.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,7 +32,7 @@ int test(char *URL)
{
int res;
CURL *curl;
- int request=1;
+ int request = 1;
char *stream_uri = NULL;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
diff --git a/tests/libtest/lib571.c b/tests/libtest/lib571.c
index f19b643..70524f2 100644
--- a/tests/libtest/lib571.c
+++ b/tests/libtest/lib571.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -70,7 +70,7 @@ static size_t rtp_write(void *ptr, size_t size, size_t nmemb, void *stream)
}
data += 4;
- for(i = 0; i < message_size; i+= RTP_DATA_SIZE) {
+ for(i = 0; i < message_size; i += RTP_DATA_SIZE) {
if(message_size - i > RTP_DATA_SIZE) {
if(memcmp(RTP_DATA, data + i, RTP_DATA_SIZE) != 0) {
printf("RTP PAYLOAD CORRUPTED [%s]\n", data + i);
@@ -103,7 +103,7 @@ int test(char *URL)
int res;
CURL *curl;
char *stream_uri = NULL;
- int request=1;
+ int request = 1;
FILE *protofile = NULL;
protofile = fopen(libtest_arg2, "wb");
diff --git a/tests/libtest/lib572.c b/tests/libtest/lib572.c
index 47a9da5..a78c935 100644
--- a/tests/libtest/lib572.c
+++ b/tests/libtest/lib572.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,8 +47,8 @@ int test(char *URL)
FILE *paramsf = NULL;
struct_stat file_info;
char *stream_uri = NULL;
- int request=1;
- struct curl_slist *custom_headers=NULL;
+ int request = 1;
+ struct curl_slist *custom_headers = NULL;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib573.c b/tests/libtest/lib573.c
index dce198b..eb817b1 100644
--- a/tests/libtest/lib573.c
+++ b/tests/libtest/lib573.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -88,7 +88,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib575.c b/tests/libtest/lib575.c
index 186170c..6baa122 100644
--- a/tests/libtest/lib575.c
+++ b/tests/libtest/lib575.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -93,7 +93,7 @@ int test(char *URL)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
abort_on_test_timeout();
diff --git a/tests/libtest/lib578.c b/tests/libtest/lib578.c
index 41b23db..1b4ee52 100644
--- a/tests/libtest/lib578.c
+++ b/tests/libtest/lib578.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -51,7 +51,7 @@ static int progress_callback(void *clientp, double dltotal, double dlnow,
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib579.c b/tests/libtest/lib579.c
index 61aa4f5..cba4b1c 100644
--- a/tests/libtest/lib579.c
+++ b/tests/libtest/lib579.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -87,7 +87,7 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
struct curl_slist *slist = NULL;
struct WriteThis pooh;
pooh.counter = 0;
diff --git a/tests/libtest/lib586.c b/tests/libtest/lib586.c
index 859ef34..669f71c 100644
--- a/tests/libtest/lib586.c
+++ b/tests/libtest/lib586.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -99,7 +99,7 @@ static void *fire(void *ptr)
CURLcode code;
struct Tdata *tdata = (struct Tdata*)ptr;
CURL *curl;
- int i=0;
+ int i = 0;
curl = curl_easy_init();
if(!curl) {
@@ -185,7 +185,7 @@ int test(char *URL)
res = 0;
/* start treads */
- for(i=1; i<=THREADS; i++) {
+ for(i = 1; i <= THREADS; i++) {
/* set thread data */
tdata.url = URL;
@@ -218,7 +218,7 @@ int test(char *URL)
/* try to free share, expect to fail because share is in use*/
printf("try SHARE_CLEANUP...\n");
scode = curl_share_cleanup(share);
- if(scode==CURLSHE_OK) {
+ if(scode == CURLSHE_OK) {
fprintf(stderr, "curl_share_cleanup succeed but error expected\n");
share = NULL;
}
@@ -235,7 +235,7 @@ test_cleanup:
/* free share */
printf("SHARE_CLEANUP\n");
scode = curl_share_cleanup(share);
- if(scode!=CURLSHE_OK)
+ if(scode != CURLSHE_OK)
fprintf(stderr, "curl_share_cleanup failed, code errno %d\n",
(int)scode);
diff --git a/tests/libtest/lib589.c b/tests/libtest/lib589.c
new file mode 100644
index 0000000..667459d
--- /dev/null
+++ b/tests/libtest/lib589.c
@@ -0,0 +1,59 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+int test(char *URL)
+{
+ CURL *curl;
+ CURLcode res = CURLE_OK;
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ curl = curl_easy_init();
+ if(!curl) {
+ fprintf(stderr, "curl_easy_init() failed\n");
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ /* First set the URL that is about to receive our POST. */
+ test_setopt(curl, CURLOPT_URL, URL);
+ test_setopt(curl, CURLOPT_MIMEPOST, NULL);
+ test_setopt(curl, CURLOPT_VERBOSE, 1L); /* show verbose for debug */
+ test_setopt(curl, CURLOPT_HEADER, 1L); /* include header */
+
+ /* Now, we should be making a zero byte POST request */
+ res = curl_easy_perform(curl);
+
+test_cleanup:
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+
+ return (int)res;
+}
diff --git a/tests/libtest/lib591.c b/tests/libtest/lib591.c
index 53ede3f..f25cc4d 100644
--- a/tests/libtest/lib591.c
+++ b/tests/libtest/lib591.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2012, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -123,7 +123,7 @@ int test(char *URL)
interval.tv_usec = 100000L; /* 100 ms */
}
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &interval);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &interval);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib597.c b/tests/libtest/lib597.c
index 813af75..c852974 100644
--- a/tests/libtest/lib597.c
+++ b/tests/libtest/lib597.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -60,10 +60,7 @@ int test(char *URL)
start_test_timing();
- res_global_init(CURL_GLOBAL_ALL);
- if(res) {
- return res;
- }
+ global_init(CURL_GLOBAL_ALL);
easy_init(easy);
@@ -123,11 +120,11 @@ int test(char *URL)
interval.tv_usec = (itimeout%1000)*1000;
}
else {
- interval.tv_sec = TEST_HANG_TIMEOUT/1000+1;
+ interval.tv_sec = TEST_HANG_TIMEOUT/1000 + 1;
interval.tv_usec = 0;
}
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &interval);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &interval);
abort_on_test_timeout();
}
diff --git a/tests/libtest/lib599.c b/tests/libtest/lib599.c
index 843fb21..0e05977 100644
--- a/tests/libtest/lib599.c
+++ b/tests/libtest/lib599.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -42,7 +42,7 @@ static int progress_callback(void *clientp, double dltotal,
int test(char *URL)
{
CURL *curl;
- CURLcode res=CURLE_OK;
+ CURLcode res = CURLE_OK;
double content_length = 0.0;
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
diff --git a/tests/libtest/lib643.c b/tests/libtest/lib643.c
new file mode 100644
index 0000000..7432dfc
--- /dev/null
+++ b/tests/libtest/lib643.c
@@ -0,0 +1,297 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+static char data[]=
+#ifdef CURL_DOES_CONVERSIONS
+ /* ASCII representation with escape sequences for non-ASCII platforms */
+ "\x74\x68\x69\x73\x20\x69\x73\x20\x77\x68\x61\x74\x20\x77\x65\x20\x70"
+ "\x6f\x73\x74\x20\x74\x6f\x20\x74\x68\x65\x20\x73\x69\x6c\x6c\x79\x20"
+ "\x77\x65\x62\x20\x73\x65\x72\x76\x65\x72\x0a";
+#else
+ "this is what we post to the silly web server\n";
+#endif
+
+struct WriteThis {
+ char *readptr;
+ curl_off_t sizeleft;
+};
+
+static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
+{
+#ifdef LIB644
+ (void)ptr;
+ (void)size;
+ (void)nmemb;
+ (void)userp;
+ return CURL_READFUNC_ABORT;
+#else
+
+ struct WriteThis *pooh = (struct WriteThis *)userp;
+ int eof = !*pooh->readptr;
+
+ if(size*nmemb < 1)
+ return 0;
+
+#ifndef LIB645
+ eof = pooh->sizeleft <= 0;
+ if(!eof)
+ pooh->sizeleft--;
+#endif
+
+ if(!eof) {
+ *ptr = *pooh->readptr; /* copy one single byte */
+ pooh->readptr++; /* advance pointer */
+ return 1; /* we return 1 byte at a time! */
+ }
+
+ return 0; /* no more data left to deliver */
+#endif
+}
+
+static int once(char *URL, bool oldstyle)
+{
+ CURL *curl;
+ CURLcode res = CURLE_OK;
+
+ curl_mime *mime = NULL;
+ curl_mimepart *part = NULL;
+ struct WriteThis pooh;
+ struct WriteThis pooh2;
+ curl_off_t datasize = -1;
+
+ pooh.readptr = data;
+#ifndef LIB645
+ datasize = (curl_off_t)strlen(data);
+#endif
+ pooh.sizeleft = datasize;
+
+ curl = curl_easy_init();
+ if(!curl) {
+ fprintf(stderr, "curl_easy_init() failed\n");
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ mime = curl_mime_init(curl);
+ if(!mime) {
+ fprintf(stderr, "curl_mime_init() failed\n");
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ part = curl_mime_addpart(mime);
+ if(!part) {
+ fprintf(stderr, "curl_mime_addpart(1) failed\n");
+ curl_mime_free(mime);
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ /* Fill in the file upload part */
+ if(oldstyle) {
+ res = curl_mime_name(part, "sendfile");
+ if(!res)
+ res = curl_mime_data_cb(part, datasize, read_callback,
+ NULL, NULL, &pooh);
+ if(!res)
+ res = curl_mime_filename(part, "postit2.c");
+ }
+ else {
+ /* new style */
+ res = curl_mime_name(part, "sendfile alternative");
+ if(!res)
+ res = curl_mime_data_cb(part, datasize, read_callback,
+ NULL, NULL, &pooh);
+ if(!res)
+ res = curl_mime_filename(part, "file name 2");
+ }
+
+ if(res)
+ printf("curl_mime_xxx(1) = %s\n", curl_easy_strerror(res));
+
+ /* Now add the same data with another name and make it not look like
+ a file upload but still using the callback */
+
+ pooh2.readptr = data;
+#ifndef LIB645
+ datasize = (curl_off_t)strlen(data);
+#endif
+ pooh2.sizeleft = datasize;
+
+ part = curl_mime_addpart(mime);
+ if(!part) {
+ fprintf(stderr, "curl_mime_addpart(2) failed\n");
+ curl_mime_free(mime);
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+ /* Fill in the file upload part */
+ res = curl_mime_name(part, "callbackdata");
+ if(!res)
+ res = curl_mime_data_cb(part, datasize, read_callback,
+ NULL, NULL, &pooh2);
+
+ if(res)
+ printf("curl_mime_xxx(2) = %s\n", curl_easy_strerror(res));
+
+ part = curl_mime_addpart(mime);
+ if(!part) {
+ fprintf(stderr, "curl_mime_addpart(3) failed\n");
+ curl_mime_free(mime);
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ /* Fill in the filename field */
+ res = curl_mime_name(part, "filename");
+ if(!res)
+ res = curl_mime_data(part,
+#ifdef CURL_DOES_CONVERSIONS
+ /* ASCII representation with escape
+ sequences for non-ASCII platforms */
+ "\x70\x6f\x73\x74\x69\x74\x32\x2e\x63",
+#else
+ "postit2.c",
+#endif
+ CURL_ZERO_TERMINATED);
+
+ if(res)
+ printf("curl_mime_xxx(3) = %s\n", curl_easy_strerror(res));
+
+ /* Fill in a submit field too */
+ part = curl_mime_addpart(mime);
+ if(!part) {
+ fprintf(stderr, "curl_mime_addpart(4) failed\n");
+ curl_mime_free(mime);
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+ res = curl_mime_name(part, "submit");
+ if(!res)
+ res = curl_mime_data(part,
+#ifdef CURL_DOES_CONVERSIONS
+ /* ASCII representation with escape
+ sequences for non-ASCII platforms */
+ "\x73\x65\x6e\x64",
+#else
+ "send",
+#endif
+ CURL_ZERO_TERMINATED);
+
+ if(res)
+ printf("curl_mime_xxx(4) = %s\n", curl_easy_strerror(res));
+
+ part = curl_mime_addpart(mime);
+ if(!part) {
+ fprintf(stderr, "curl_mime_addpart(5) failed\n");
+ curl_mime_free(mime);
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+ res = curl_mime_name(part, "somename");
+ if(!res)
+ res = curl_mime_filename(part, "somefile.txt");
+ if(!res)
+ res = curl_mime_data(part, "blah blah", 9);
+
+ if(res)
+ printf("curl_mime_xxx(5) = %s\n", curl_easy_strerror(res));
+
+ /* First set the URL that is about to receive our POST. */
+ test_setopt(curl, CURLOPT_URL, URL);
+
+ /* send a multi-part mimepost */
+ test_setopt(curl, CURLOPT_MIMEPOST, mime);
+
+ /* get verbose debug output please */
+ test_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ /* include headers in the output */
+ test_setopt(curl, CURLOPT_HEADER, 1L);
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+
+test_cleanup:
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+
+ /* now cleanup the mimepost structure */
+ curl_mime_free(mime);
+
+ return res;
+}
+
+static int cyclic_add(void)
+{
+ CURL *easy = curl_easy_init();
+ curl_mime *mime = curl_mime_init(easy);
+ curl_mimepart *part = curl_mime_addpart(mime);
+ CURLcode a1 = curl_mime_subparts(part, mime);
+
+ if(a1 == CURLE_BAD_FUNCTION_ARGUMENT) {
+ curl_mime *submime = curl_mime_init(easy);
+ curl_mimepart *subpart = curl_mime_addpart(submime);
+
+ curl_mime_subparts(part, submime);
+ a1 = curl_mime_subparts(subpart, mime);
+ }
+
+ curl_mime_free(mime);
+ curl_easy_cleanup(easy);
+ if(a1 != CURLE_BAD_FUNCTION_ARGUMENT)
+ /* that should have failed */
+ return 1;
+
+ return 0;
+}
+
+int test(char *URL)
+{
+ int res;
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ res = once(URL, TRUE); /* old */
+ if(!res)
+ res = once(URL, FALSE); /* new */
+
+ if(!res)
+ res = cyclic_add();
+
+ curl_global_cleanup();
+
+ return res;
+}
diff --git a/tests/libtest/lib650.c b/tests/libtest/lib650.c
new file mode 100644
index 0000000..da1fd56
--- /dev/null
+++ b/tests/libtest/lib650.c
@@ -0,0 +1,211 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+static char data[] =
+#ifdef CURL_DOES_CONVERSIONS
+ /* ASCII representation with escape sequences for non-ASCII platforms */
+ "\x74\x68\x69\x73\x20\x69\x73\x20\x77\x68\x61\x74\x20\x77\x65\x20\x70"
+ "\x6f\x73\x74\x20\x74\x6f\x20\x74\x68\x65\x20\x73\x69\x6c\x6c\x79\x20"
+ "\x77\x65\x62\x20\x73\x65\x72\x76\x65\x72";
+#else
+ "this is what we post to the silly web server";
+#endif
+
+static const char name[] = "fieldname";
+
+
+/* This test attempts to use all form API features that are not
+ * used elsewhere.
+ */
+
+/* curl_formget callback to count characters. */
+static size_t count_chars(void *userp, const char *buf, size_t len)
+{
+ size_t *pcounter = (size_t *) userp;
+
+ (void) buf;
+ *pcounter += len;
+ return len;
+}
+
+
+int test(char *URL)
+{
+ CURL *curl = NULL;
+ CURLcode res = TEST_ERR_MAJOR_BAD;
+ CURLFORMcode formrc;
+ struct curl_slist *headers, *headers2 = NULL;
+ struct curl_httppost *formpost = NULL;
+ struct curl_httppost *lastptr = NULL;
+ struct curl_forms formarray[3];
+ size_t formlength = 0;
+ char flbuf[32];
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ /* Check proper name and data copying, as well as headers. */
+ headers = curl_slist_append(NULL, "X-customheader-1: Header 1 data");
+ if(!headers) {
+ goto test_cleanup;
+ }
+ headers2 = curl_slist_append(headers, "X-customheader-2: Header 2 data");
+ if(!headers2) {
+ goto test_cleanup;
+ }
+ headers = headers2;
+ headers2 = curl_slist_append(headers, "Content-Type: text/plain");
+ if(!headers2) {
+ goto test_cleanup;
+ }
+ headers = headers2;
+ formrc = curl_formadd(&formpost, &lastptr,
+ CURLFORM_COPYNAME, &name,
+ CURLFORM_COPYCONTENTS, &data,
+ CURLFORM_CONTENTHEADER, headers,
+ CURLFORM_END);
+
+ if(formrc) {
+ printf("curl_formadd(1) = %d\n", (int) formrc);
+ goto test_cleanup;
+ }
+
+ /* Use a form array for the non-copy test. */
+ formarray[0].option = CURLFORM_PTRCONTENTS;
+ formarray[0].value = data;
+ formarray[1].option = CURLFORM_CONTENTSLENGTH;
+ formarray[1].value = (char *) strlen(data) - 1;
+ formarray[2].option = CURLFORM_END;
+ formarray[2].value = NULL;
+ formrc = curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_PTRNAME, name,
+ CURLFORM_NAMELENGTH, strlen(name) - 1,
+ CURLFORM_ARRAY, formarray,
+ CURLFORM_FILENAME, "remotefile.txt",
+ CURLFORM_END);
+
+ if(formrc) {
+ printf("curl_formadd(2) = %d\n", (int) formrc);
+ goto test_cleanup;
+ }
+
+ /* Now change in-memory data to affect CURLOPT_PTRCONTENTS value.
+ Copied values (first field) must not be affected.
+ CURLOPT_PTRNAME actually copies the name thus we do not test this here. */
+ data[0]++;
+
+ /* Check multi-files and content type propagation. */
+ formrc = curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "multifile",
+ CURLFORM_FILE, libtest_arg2, /* Set in first.c. */
+ CURLFORM_FILE, libtest_arg2,
+ CURLFORM_CONTENTTYPE, "text/whatever",
+ CURLFORM_FILE, libtest_arg2,
+ CURLFORM_END);
+
+ if(formrc) {
+ printf("curl_formadd(3) = %d\n", (int) formrc);
+ goto test_cleanup;
+ }
+
+ /* Check data from file content. */
+ formrc = curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "filecontents",
+ CURLFORM_FILECONTENT, libtest_arg2,
+ CURLFORM_END);
+
+ if(formrc) {
+ printf("curl_formadd(4) = %d\n", (int) formrc);
+ goto test_cleanup;
+ }
+
+ /* Measure the current form length.
+ * This is done before including stdin data because we want to reuse it
+ * and stdin cannot be rewound.
+ */
+ curl_formget(formpost, (void *) &formlength, count_chars);
+
+ /* Include length in data for external check. */
+ curl_msnprintf(flbuf, sizeof flbuf, "%lu", (unsigned long) formlength);
+ formrc = curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "formlength",
+ CURLFORM_COPYCONTENTS, &flbuf,
+ CURLFORM_END);
+ if(formrc) {
+ printf("curl_formadd(5) = %d\n", (int) formrc);
+ goto test_cleanup;
+ }
+
+ /* Check stdin (may be problematic on some platforms). */
+ formrc = curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "standardinput",
+ CURLFORM_FILE, "-",
+ CURLFORM_END);
+ if(formrc) {
+ printf("curl_formadd(6) = %d\n", (int) formrc);
+ goto test_cleanup;
+ }
+
+ curl = curl_easy_init();
+ if(!curl) {
+ fprintf(stderr, "curl_easy_init() failed\n");
+ goto test_cleanup;
+ }
+
+ /* First set the URL that is about to receive our POST. */
+ test_setopt(curl, CURLOPT_URL, URL);
+
+ /* send a multi-part formpost */
+ test_setopt(curl, CURLOPT_HTTPPOST, formpost);
+
+ /* get verbose debug output please */
+ test_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ /* include headers in the output */
+ test_setopt(curl, CURLOPT_HEADER, 1L);
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+
+test_cleanup:
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+
+ /* now cleanup the formpost chain */
+ curl_formfree(formpost);
+ curl_slist_free_all(headers);
+
+ curl_global_cleanup();
+
+ return res;
+}
diff --git a/tests/libtest/lib651.c b/tests/libtest/lib651.c
new file mode 100644
index 0000000..18bcaae
--- /dev/null
+++ b/tests/libtest/lib651.c
@@ -0,0 +1,94 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+static char buffer[17000]; /* more than 16K */
+
+int test(char *URL)
+{
+ CURL *curl;
+ CURLcode res = CURLE_OK;
+ CURLFORMcode formrc;
+ struct curl_httppost *formpost = NULL;
+ struct curl_httppost *lastptr = NULL;
+
+ /* create a buffer with AAAA...BBBBB...CCCC...etc */
+ int i;
+ int size = (int)sizeof(buffer)/1000;
+
+ for(i = 0; i < size ; i++)
+ memset(&buffer[i * 1000], 65 + i, 1000);
+
+ buffer[ sizeof(buffer)-1] = 0; /* zero terminate */
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ /* Check proper name and data copying. */
+ formrc = curl_formadd(&formpost, &lastptr,
+ CURLFORM_COPYNAME, "hello",
+ CURLFORM_COPYCONTENTS, buffer,
+ CURLFORM_END);
+
+ if(formrc)
+ printf("curl_formadd(1) = %d\n", (int) formrc);
+
+
+ curl = curl_easy_init();
+ if(!curl) {
+ fprintf(stderr, "curl_easy_init() failed\n");
+ curl_formfree(formpost);
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ /* First set the URL that is about to receive our POST. */
+ test_setopt(curl, CURLOPT_URL, URL);
+
+ /* send a multi-part formpost */
+ test_setopt(curl, CURLOPT_HTTPPOST, formpost);
+
+ /* get verbose debug output please */
+ test_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ /* include headers in the output */
+ test_setopt(curl, CURLOPT_HEADER, 1L);
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+
+test_cleanup:
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+
+ /* now cleanup the formpost chain */
+ curl_formfree(formpost);
+
+ curl_global_cleanup();
+
+ return res;
+}
diff --git a/tests/libtest/lib652.c b/tests/libtest/lib652.c
new file mode 100644
index 0000000..d60390b
--- /dev/null
+++ b/tests/libtest/lib652.c
@@ -0,0 +1,128 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+static char buffer[17000]; /* more than 16K */
+
+int test(char *URL)
+{
+ CURL *curl = NULL;
+ CURLcode res = CURLE_OK;
+ curl_mime *mime = NULL;
+ curl_mimepart *part;
+ struct curl_slist *recipients = NULL;
+
+ /* create a buffer with AAAA...BBBBB...CCCC...etc */
+ int i;
+ int size = (int)sizeof(buffer) / 10;
+
+ for(i = 0; i < size ; i++)
+ memset(&buffer[i * 10], 65 + (i % 26), 10);
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ curl = curl_easy_init();
+ if(!curl) {
+ fprintf(stderr, "curl_easy_init() failed\n");
+ res = (CURLcode) TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ /* Build mime structure. */
+ mime = curl_mime_init(curl);
+ if(!mime) {
+ fprintf(stderr, "curl_mime_init() failed\n");
+ res = (CURLcode) TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+ part = curl_mime_addpart(mime);
+ if(!part) {
+ fprintf(stderr, "curl_mime_addpart() failed\n");
+ res = (CURLcode) TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+ res = curl_mime_filename(part, "myfile.jpg");
+ if(res) {
+ fprintf(stderr, "curl_mime_filename() failed\n");
+ goto test_cleanup;
+ }
+ res = curl_mime_type(part, "image/jpeg");
+ if(res) {
+ fprintf(stderr, "curl_mime_type() failed\n");
+ goto test_cleanup;
+ }
+ res = curl_mime_data(part, buffer, sizeof buffer);
+ if(res) {
+ fprintf(stderr, "curl_mime_data() failed\n");
+ goto test_cleanup;
+ }
+ res = curl_mime_encoder(part, "base64");
+ if(res) {
+ fprintf(stderr, "curl_mime_encoder() failed\n");
+ goto test_cleanup;
+ }
+
+ /* Prepare recipients. */
+ recipients = curl_slist_append(NULL, "someone@example.com");
+ if(!recipients) {
+ fprintf(stderr, "curl_slist_append() failed\n");
+ goto test_cleanup;
+ }
+
+ /* First set the URL that is about to receive our mime mail. */
+ test_setopt(curl, CURLOPT_URL, URL);
+
+ /* Set sender. */
+ test_setopt(curl, CURLOPT_MAIL_FROM, "somebody@example.com");
+
+ /* Set recipients. */
+ test_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+ /* send a multi-part mail */
+ test_setopt(curl, CURLOPT_MIMEPOST, mime);
+
+ /* get verbose debug output please */
+ test_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+
+test_cleanup:
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+
+ /* now cleanup the mime structure */
+ curl_mime_free(mime);
+
+ /* cleanup the recipients. */
+ curl_slist_free_all(recipients);
+
+ curl_global_cleanup();
+
+ return res;
+}
diff --git a/tests/libtest/lib653.c b/tests/libtest/lib653.c
new file mode 100644
index 0000000..6d78ee0
--- /dev/null
+++ b/tests/libtest/lib653.c
@@ -0,0 +1,63 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+
+int test(char *URL)
+{
+ CURL *curls = NULL;
+ int res = 0;
+ curl_mimepart *field = NULL;
+ curl_mime *mime = NULL;
+
+ global_init(CURL_GLOBAL_ALL);
+ easy_init(curls);
+
+ mime = curl_mime_init(curls);
+ field = curl_mime_addpart(mime);
+ curl_mime_name(field, "name");
+ curl_mime_data(field, "short value", CURL_ZERO_TERMINATED);
+
+ easy_setopt(curls, CURLOPT_URL, URL);
+ easy_setopt(curls, CURLOPT_HEADER, 1L);
+ easy_setopt(curls, CURLOPT_VERBOSE, 1L);
+ easy_setopt(curls, CURLOPT_MIMEPOST, mime);
+ easy_setopt(curls, CURLOPT_NOPROGRESS, 1L);
+
+ res = curl_easy_perform(curls);
+ if(res)
+ goto test_cleanup;
+
+ /* Alter form and resubmit. */
+ curl_mime_data(field, "long value for length change", CURL_ZERO_TERMINATED);
+ res = curl_easy_perform(curls);
+
+test_cleanup:
+ curl_mime_free(mime);
+ curl_easy_cleanup(curls);
+ curl_global_cleanup();
+ return (int) res; /* return the final return code */
+}
diff --git a/tests/libtest/libntlmconnect.c b/tests/libtest/libntlmconnect.c
index ad20e8b..0d527a7 100644
--- a/tests/libtest/libntlmconnect.c
+++ b/tests/libtest/libntlmconnect.c
@@ -196,7 +196,7 @@ int test(char *url)
interval.tv_usec = (itimeout%1000)*1000;
}
else {
- interval.tv_sec = TEST_HANG_TIMEOUT/1000+1;
+ interval.tv_sec = TEST_HANG_TIMEOUT/1000 + 1;
interval.tv_usec = 0;
/* if there's no timeout and we get here on the last handle, we may
@@ -207,7 +207,7 @@ int test(char *url)
}
}
- select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &interval);
+ select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &interval);
abort_on_test_timeout();
}
diff --git a/tests/libtest/mk-lib1521.pl b/tests/libtest/mk-lib1521.pl
index e60bce5..6ded472 100644
--- a/tests/libtest/mk-lib1521.pl
+++ b/tests/libtest/mk-lib1521.pl
@@ -143,9 +143,10 @@ int test(char *URL)
void *conv_to_network_cb = NULL;
void *conv_from_utf8_cb = NULL;
void *interleavecb = NULL;
- char *stringpointerextra=(char *)"moooo";
- struct curl_slist *slist=NULL;
- struct curl_httppost *httppost=NULL;
+ char *stringpointerextra = (char *)"moooo";
+ struct curl_slist *slist = NULL;
+ struct curl_httppost *httppost = NULL;
+ curl_mime *mimepost = NULL;
FILE *stream = stderr;
struct data object;
char *charp;
@@ -157,6 +158,7 @@ int test(char *URL)
struct curl_tlssessioninfo *tlssession;
CURLcode res = CURLE_OK;
(void)URL; /* not used */
+ global_init(CURL_GLOBAL_ALL);
easy_init(dep);
easy_init(curl);
share = curl_share_init();
@@ -215,6 +217,9 @@ while(<STDIN>) {
elsif($name eq "HTTPPOST") {
print "${pref} httppost);\n$check";
}
+ elsif($name eq "MIMEPOST") {
+ print "${pref} mimepost);\n$check";
+ }
elsif($name eq "STDERR") {
print "${pref} stream);\n$check";
}
@@ -296,6 +301,7 @@ test_cleanup:
curl_easy_cleanup(curl);
curl_easy_cleanup(dep);
curl_share_cleanup(share);
+ curl_global_cleanup();
return (int)res;
}
diff --git a/tests/libtest/stub_gssapi.c b/tests/libtest/stub_gssapi.c
new file mode 100644
index 0000000..168becf
--- /dev/null
+++ b/tests/libtest/stub_gssapi.c
@@ -0,0 +1,397 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* Only provides the bare minimum to link with libcurl */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "stub_gssapi.h"
+
+#define MAX_CREDS_LENGTH 250
+#define APPROX_TOKEN_LEN 250
+
+enum min_err_code {
+ GSS_OK = 0,
+ GSS_NO_MEMORY,
+ GSS_INVALID_ARGS,
+ GSS_INVALID_CREDS,
+ GSS_INVALID_CTX,
+ GSS_SERVER_ERR,
+ GSS_NO_MECH,
+ GSS_LAST
+};
+
+const char *min_err_table[] = {
+ "stub-gss: no error",
+ "stub-gss: no memory",
+ "stub-gss: invalid arguments",
+ "stub-gss: invalid credentials",
+ "stub-gss: invalid context",
+ "stub-gss: server returned error",
+ "stub-gss: cannot find a mechanism",
+ NULL
+};
+
+struct gss_ctx_id_t_desc_struct {
+ enum { NONE, KRB5, NTLM1, NTLM3 } sent;
+ int have_krb5;
+ int have_ntlm;
+ OM_uint32 flags;
+ char creds[MAX_CREDS_LENGTH];
+};
+
+OM_uint32 gss_init_sec_context(OM_uint32 *min,
+ gss_const_cred_id_t initiator_cred_handle,
+ gss_ctx_id_t *context_handle,
+ gss_const_name_t target_name,
+ const gss_OID mech_type,
+ OM_uint32 req_flags,
+ OM_uint32 time_req,
+ const gss_channel_bindings_t input_chan_bindings,
+ const gss_buffer_t input_token,
+ gss_OID *actual_mech_type,
+ gss_buffer_t output_token,
+ OM_uint32 *ret_flags,
+ OM_uint32 *time_rec)
+{
+ /* The token will be encoded in base64 */
+ int length = APPROX_TOKEN_LEN * 3 / 4;
+ int used = 0;
+ char *token = NULL;
+ const char *creds = NULL;
+ gss_ctx_id_t ctx = NULL;
+
+ if(!min)
+ return GSS_S_FAILURE;
+
+ *min = 0;
+
+ if(!context_handle || !target_name || !output_token) {
+ *min = GSS_INVALID_ARGS;
+ return GSS_S_FAILURE;
+ }
+
+ creds = getenv("CURL_STUB_GSS_CREDS");
+ if(!creds || strlen(creds) >= MAX_CREDS_LENGTH) {
+ *min = GSS_INVALID_CREDS;
+ return GSS_S_FAILURE;
+ }
+
+ ctx = *context_handle;
+ if(ctx && strcmp(ctx->creds, creds)) {
+ *min = GSS_INVALID_CREDS;
+ return GSS_S_FAILURE;
+ }
+
+ output_token->length = 0;
+ output_token->value = NULL;
+
+ if(input_token && input_token->length) {
+ if(!ctx) {
+ *min = GSS_INVALID_CTX;
+ return GSS_S_FAILURE;
+ }
+
+ /* Server response, either D (RA==) or C (Qw==) */
+ if(((char *) input_token->value)[0] == 'D') {
+ /* Done */
+ switch(ctx->sent) {
+ case KRB5:
+ case NTLM3:
+ if(ret_flags)
+ *ret_flags = ctx->flags;
+ if(time_rec)
+ *time_rec = GSS_C_INDEFINITE;
+ return GSS_S_COMPLETE;
+ default:
+ *min = GSS_SERVER_ERR;
+ return GSS_S_FAILURE;
+ }
+ }
+
+ if(((char *) input_token->value)[0] != 'C') {
+ /* We only support Done or Continue */
+ *min = GSS_SERVER_ERR;
+ return GSS_S_FAILURE;
+ }
+
+ /* Continue */
+ switch(ctx->sent) {
+ case KRB5:
+ /* We sent KRB5 and it failed, let's try NTLM */
+ if(ctx->have_ntlm) {
+ ctx->sent = NTLM1;
+ break;
+ }
+ else {
+ *min = GSS_SERVER_ERR;
+ return GSS_S_FAILURE;
+ }
+ case NTLM1:
+ ctx->sent = NTLM3;
+ break;
+ default:
+ *min = GSS_SERVER_ERR;
+ return GSS_S_FAILURE;
+ }
+ }
+ else {
+ if(ctx) {
+ *min = GSS_INVALID_CTX;
+ return GSS_S_FAILURE;
+ }
+
+ ctx = (gss_ctx_id_t) calloc(sizeof(*ctx), 1);
+ if(!ctx) {
+ *min = GSS_NO_MEMORY;
+ return GSS_S_FAILURE;
+ }
+
+ if(strstr(creds, "KRB5"))
+ ctx->have_krb5 = 1;
+
+ if(strstr(creds, "NTLM"))
+ ctx->have_ntlm = 1;
+
+ if(ctx->have_krb5)
+ ctx->sent = KRB5;
+ else if(ctx->have_ntlm)
+ ctx->sent = NTLM1;
+ else {
+ free(ctx);
+ *min = GSS_NO_MECH;
+ return GSS_S_FAILURE;
+ }
+
+ strcpy(ctx->creds, creds);
+ ctx->flags = req_flags;
+ }
+
+ token = malloc(length);
+ if(!token) {
+ free(ctx);
+ *min = GSS_NO_MEMORY;
+ return GSS_S_FAILURE;
+ }
+
+ /* Token format: creds:target:type:padding */
+ used = snprintf(token, length, "%s:%s:%d:", creds,
+ (char *) target_name, ctx->sent);
+
+ if(used >= length) {
+ free(token);
+ free(ctx);
+ *min = GSS_NO_MEMORY;
+ return GSS_S_FAILURE;
+ }
+
+ /* Overwrite null terminator */
+ memset(token + used, 'A', length - used);
+
+ *context_handle = ctx;
+
+ output_token->value = token;
+ output_token->length = length;
+
+ return GSS_S_CONTINUE_NEEDED;
+}
+
+OM_uint32 gss_delete_sec_context(OM_uint32 *min,
+ gss_ctx_id_t *context_handle,
+ gss_buffer_t output_token)
+{
+ if(!min)
+ return GSS_S_FAILURE;
+
+ if(!context_handle) {
+ *min = GSS_INVALID_CTX;
+ return GSS_S_FAILURE;
+ }
+
+ free(*context_handle);
+ *context_handle = NULL;
+ *min = 0;
+
+ return GSS_S_COMPLETE;
+}
+
+OM_uint32 gss_release_buffer(OM_uint32 *min,
+ gss_buffer_t buffer)
+{
+ if(min)
+ *min = 0;
+
+ if(buffer && buffer->length) {
+ free(buffer->value);
+ buffer->length = 0;
+ }
+
+ return GSS_S_COMPLETE;
+}
+
+OM_uint32 gss_import_name(OM_uint32 *min,
+ const gss_buffer_t input_name_buffer,
+ const gss_OID input_name_type,
+ gss_name_t *output_name)
+{
+ char *name = NULL;
+
+ if(!min)
+ return GSS_S_FAILURE;
+
+ if(!input_name_buffer || !output_name) {
+ *min = GSS_INVALID_ARGS;
+ return GSS_S_FAILURE;
+ }
+
+ name = strndup(input_name_buffer->value, input_name_buffer->length);
+ if(!name) {
+ *min = GSS_NO_MEMORY;
+ return GSS_S_FAILURE;
+ }
+
+ *output_name = (gss_name_t) name;
+ *min = 0;
+
+ return GSS_S_COMPLETE;
+}
+
+OM_uint32 gss_release_name(OM_uint32 *min,
+ gss_name_t *input_name)
+{
+ if(min)
+ *min = 0;
+
+ if(input_name)
+ free(*input_name);
+
+ return GSS_S_COMPLETE;
+}
+
+OM_uint32 gss_display_status(OM_uint32 *min,
+ OM_uint32 status_value,
+ int status_type,
+ const gss_OID mech_type,
+ OM_uint32 *message_context,
+ gss_buffer_t status_string)
+{
+ const char maj_str[] = "Stub GSS error";
+ if(min)
+ *min = 0;
+
+ if(message_context)
+ *message_context = 0;
+
+ if(status_string) {
+ status_string->value = NULL;
+ status_string->length = 0;
+
+ if(status_value >= GSS_LAST)
+ return GSS_S_FAILURE;
+
+ switch(status_type) {
+ case GSS_C_GSS_CODE:
+ status_string->value = strdup(maj_str);
+ break;
+ case GSS_C_MECH_CODE:
+ status_string->value = strdup(min_err_table[status_value]);
+ break;
+ default:
+ return GSS_S_FAILURE;
+ }
+
+ if(status_string->value)
+ status_string->length = strlen(status_string->value);
+ else
+ return GSS_S_FAILURE;
+ }
+
+ return GSS_S_COMPLETE;
+}
+
+/* Stubs returning error */
+
+OM_uint32 gss_display_name(OM_uint32 *min,
+ gss_const_name_t input_name,
+ gss_buffer_t output_name_buffer,
+ gss_OID *output_name_type)
+{
+ return GSS_S_FAILURE;
+}
+
+OM_uint32 gss_inquire_context(OM_uint32 *min,
+ gss_const_ctx_id_t context_handle,
+ gss_name_t *src_name,
+ gss_name_t *targ_name,
+ OM_uint32 *lifetime_rec,
+ gss_OID *mech_type,
+ OM_uint32 *ctx_flags,
+ int *locally_initiated,
+ int *open_context)
+{
+ return GSS_S_FAILURE;
+}
+
+OM_uint32 gss_wrap(OM_uint32 *min,
+ gss_const_ctx_id_t context_handle,
+ int conf_req_flag,
+ gss_qop_t qop_req,
+ const gss_buffer_t input_message_buffer,
+ int *conf_state,
+ gss_buffer_t output_message_buffer)
+{
+ return GSS_S_FAILURE;
+}
+
+OM_uint32 gss_unwrap(OM_uint32 *min,
+ gss_const_ctx_id_t context_handle,
+ const gss_buffer_t input_message_buffer,
+ gss_buffer_t output_message_buffer,
+ int *conf_state,
+ gss_qop_t *qop_state)
+{
+ return GSS_S_FAILURE;
+}
+
+OM_uint32 gss_seal(OM_uint32 *min,
+ gss_ctx_id_t context_handle,
+ int conf_req_flag,
+ int qop_req,
+ gss_buffer_t input_message_buffer,
+ int *conf_state,
+ gss_buffer_t output_message_buffer)
+{
+ return GSS_S_FAILURE;
+}
+
+OM_uint32 gss_unseal(OM_uint32 *min,
+ gss_ctx_id_t context_handle,
+ gss_buffer_t input_message_buffer,
+ gss_buffer_t output_message_buffer,
+ int *conf_state,
+ int *qop_state)
+{
+ return GSS_S_FAILURE;
+}
+
diff --git a/tests/libtest/stub_gssapi.h b/tests/libtest/stub_gssapi.h
new file mode 100644
index 0000000..9a302f0
--- /dev/null
+++ b/tests/libtest/stub_gssapi.h
@@ -0,0 +1,183 @@
+#ifndef HEADER_CURL_GSSAPI_STUBS_H
+#define HEADER_CURL_GSSAPI_STUBS_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* Roughly based on Heimdal's gssapi.h */
+
+#include <stdint.h>
+#include <stddef.h>
+
+#define GSS_ERROR(status) (status & 0x80000000)
+
+#define GSS_S_COMPLETE 0
+#define GSS_S_FAILURE (0x80000000)
+#define GSS_S_CONTINUE_NEEDED (1ul)
+
+#define GSS_C_QOP_DEFAULT 0
+#define GSS_C_NO_OID ((gss_OID) 0)
+#define GSS_C_NO_NAME ((gss_name_t) 0)
+#define GSS_C_NO_BUFFER ((gss_buffer_t) 0)
+#define GSS_C_NO_CONTEXT ((gss_ctx_id_t) 0)
+#define GSS_C_NO_CREDENTIAL ((gss_cred_id_t) 0)
+#define GSS_C_NO_CHANNEL_BINDINGS ((gss_channel_bindings_t) 0)
+
+#define GSS_C_NULL_OID GSS_C_NO_OID
+
+#define GSS_C_EMPTY_BUFFER {0, NULL}
+
+#define GSS_C_AF_INET 2
+
+#define GSS_C_GSS_CODE 1
+#define GSS_C_MECH_CODE 2
+
+#define GSS_C_DELEG_FLAG 1
+#define GSS_C_MUTUAL_FLAG 2
+#define GSS_C_REPLAY_FLAG 4
+#define GSS_C_CONF_FLAG 16
+#define GSS_C_INTEG_FLAG 32
+
+/*
+ * Expiration time of 2^32-1 seconds means infinite lifetime for a
+ * credential or security context
+ */
+#define GSS_C_INDEFINITE 0xfffffffful
+
+#define GSS_C_NT_HOSTBASED_SERVICE NULL
+
+typedef uint32_t OM_uint32;
+
+typedef OM_uint32 gss_qop_t;
+
+typedef struct gss_buffer_desc_struct {
+ size_t length;
+ void *value;
+} gss_buffer_desc, *gss_buffer_t;
+
+struct gss_cred_id_t_desc_struct;
+typedef struct gss_cred_id_t_desc_struct *gss_cred_id_t;
+typedef const struct gss_cred_id_t_desc_struct *gss_const_cred_id_t;
+
+struct gss_ctx_id_t_desc_struct;
+typedef struct gss_ctx_id_t_desc_struct *gss_ctx_id_t;
+typedef const struct gss_ctx_id_t_desc_struct *gss_const_ctx_id_t;
+
+struct gss_name_t_desc_struct;
+typedef struct gss_name_t_desc_struct *gss_name_t;
+typedef const struct gss_name_t_desc_struct *gss_const_name_t;
+
+typedef struct gss_OID_desc_struct {
+ OM_uint32 length;
+ void *elements;
+} gss_OID_desc, *gss_OID;
+
+typedef struct gss_channel_bindings_struct {
+ OM_uint32 initiator_addrtype;
+ gss_buffer_desc initiator_address;
+ OM_uint32 acceptor_addrtype;
+ gss_buffer_desc acceptor_address;
+ gss_buffer_desc application_data;
+} *gss_channel_bindings_t;
+
+OM_uint32 gss_release_buffer(OM_uint32 * /*minor_status*/,
+ gss_buffer_t /*buffer*/);
+
+OM_uint32 gss_init_sec_context(OM_uint32 * /*minor_status*/,
+ gss_const_cred_id_t /*initiator_cred_handle*/,
+ gss_ctx_id_t * /*context_handle*/,
+ gss_const_name_t /*target_name*/,
+ const gss_OID /*mech_type*/,
+ OM_uint32 /*req_flags*/,
+ OM_uint32 /*time_req*/,
+ const gss_channel_bindings_t /*input_chan_bindings*/,
+ const gss_buffer_t /*input_token*/,
+ gss_OID * /*actual_mech_type*/,
+ gss_buffer_t /*output_token*/,
+ OM_uint32 * /*ret_flags*/,
+ OM_uint32 * /*time_rec*/);
+
+OM_uint32 gss_delete_sec_context(OM_uint32 * /*minor_status*/,
+ gss_ctx_id_t * /*context_handle*/,
+ gss_buffer_t /*output_token*/);
+
+OM_uint32 gss_inquire_context(OM_uint32 * /*minor_status*/,
+ gss_const_ctx_id_t /*context_handle*/,
+ gss_name_t * /*src_name*/,
+ gss_name_t * /*targ_name*/,
+ OM_uint32 * /*lifetime_rec*/,
+ gss_OID * /*mech_type*/,
+ OM_uint32 * /*ctx_flags*/,
+ int * /*locally_initiated*/,
+ int * /*open_context*/);
+
+OM_uint32 gss_wrap(OM_uint32 * /*minor_status*/,
+ gss_const_ctx_id_t /*context_handle*/,
+ int /*conf_req_flag*/,
+ gss_qop_t /*qop_req*/,
+ const gss_buffer_t /*input_message_buffer*/,
+ int * /*conf_state*/,
+ gss_buffer_t /*output_message_buffer*/);
+
+OM_uint32 gss_unwrap(OM_uint32 * /*minor_status*/,
+ gss_const_ctx_id_t /*context_handle*/,
+ const gss_buffer_t /*input_message_buffer*/,
+ gss_buffer_t /*output_message_buffer*/,
+ int * /*conf_state*/,
+ gss_qop_t * /*qop_state*/);
+
+OM_uint32 gss_seal(OM_uint32 * /*minor_status*/,
+ gss_ctx_id_t /*context_handle*/,
+ int /*conf_req_flag*/,
+ int /*qop_req*/,
+ gss_buffer_t /*input_message_buffer*/,
+ int * /*conf_state*/,
+ gss_buffer_t /*output_message_buffer*/);
+
+OM_uint32 gss_unseal(OM_uint32 * /*minor_status*/,
+ gss_ctx_id_t /*context_handle*/,
+ gss_buffer_t /*input_message_buffer*/,
+ gss_buffer_t /*output_message_buffer*/,
+ int * /*conf_state*/,
+ int * /*qop_state*/);
+
+OM_uint32 gss_import_name(OM_uint32 * /*minor_status*/,
+ const gss_buffer_t /*input_name_buffer*/,
+ const gss_OID /*input_name_type*/,
+ gss_name_t * /*output_name*/);
+
+OM_uint32 gss_release_name(OM_uint32 * /*minor_status*/,
+ gss_name_t * /*input_name*/);
+
+OM_uint32 gss_display_name(OM_uint32 * /*minor_status*/,
+ gss_const_name_t /*input_name*/,
+ gss_buffer_t /*output_name_buffer*/,
+ gss_OID * /*output_name_type*/);
+
+OM_uint32 gss_display_status(OM_uint32 * /*minor_status*/,
+ OM_uint32 /*status_value*/,
+ int /*status_type*/,
+ const gss_OID /*mech_type*/,
+ OM_uint32 * /*message_context*/,
+ gss_buffer_t /*status_string*/);
+
+#endif /* HEADER_CURL_GSSAPI_STUBS_H */
+
diff --git a/tests/libtest/testtrace.c b/tests/libtest/testtrace.c
index 62641e1..5c68b3b 100644
--- a/tests/libtest/testtrace.c
+++ b/tests/libtest/testtrace.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -53,25 +53,27 @@ void libtest_debug_dump(const char *timebuf, const char *text, FILE *stream,
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
- if(i+c < size)
- fprintf(stream, "%02x ", ptr[i+c]);
+ if(i + c < size)
+ fprintf(stream, "%02x ", ptr[i + c]);
else
fputs(" ", stream);
}
- for(c = 0; (c < width) && (i+c < size); c++) {
+ for(c = 0; (c < width) && (i + c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
if(nohex &&
- (i+c+1 < size) && (ptr[i+c] == 0x0D) && (ptr[i+c+1] == 0x0A)) {
- i += (c+2-width);
+ (i + c + 1 < size) && (ptr[i + c] == 0x0D) &&
+ (ptr[i + c + 1] == 0x0A)) {
+ i += (c + 2 - width);
break;
}
- fprintf(stream, "%c", ((ptr[i+c] >= 0x20) && (ptr[i+c] < 0x80)) ?
- ptr[i+c] : '.');
+ fprintf(stream, "%c", ((ptr[i + c] >= 0x20) && (ptr[i + c] < 0x80)) ?
+ ptr[i + c] : '.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
if(nohex &&
- (i+c+2 < size) && (ptr[i+c+1] == 0x0D) && (ptr[i+c+2] == 0x0A)) {
- i += (c+3-width);
+ (i + c + 2 < size) && (ptr[i + c + 1] == 0x0D) &&
+ (ptr[i + c + 2] == 0x0A)) {
+ i += (c + 3 - width);
break;
}
}
diff --git a/tests/memanalyze.pl b/tests/memanalyze.pl
index 35d1c7e..8ba3f6d 100755
--- a/tests/memanalyze.pl
+++ b/tests/memanalyze.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -33,6 +33,9 @@ my $reallocs=0;
my $strdups=0;
my $wcsdups=0;
my $showlimit;
+my $sends=0;
+my $recvs=0;
+my $sockets=0;
while(1) {
if($ARGV[0] eq "-v") {
@@ -258,6 +261,7 @@ while(<FILE>) {
$filedes{$1}=1;
$getfile{$1}="$source:$linenum";
$openfile++;
+ $sockets++; # number of socket() calls
}
elsif($function =~ /socketpair\(\) = (\d*) (\d*)/) {
$filedes{$1}=1;
@@ -314,6 +318,14 @@ while(<FILE>) {
elsif($_ =~ /^GETNAME ([^ ]*):(\d*) (.*)/) {
# not much to do
}
+ # SEND url.c:1901 send(83) = 83
+ elsif($_ =~ /^SEND ([^ ]*):(\d*) (.*)/) {
+ $sends++;
+ }
+ # RECV url.c:1901 recv(102400) = 256
+ elsif($_ =~ /^RECV ([^ ]*):(\d*) (.*)/) {
+ $recvs++;
+ }
# ADDR url.c:1282 getaddrinfo() = 0x5ddd
elsif($_ =~ /^ADDR ([^ ]*):(\d*) (.*)/) {
@@ -398,12 +410,16 @@ if($addrinfos) {
if($verbose) {
print "Mallocs: $mallocs\n",
- "Reallocs: $reallocs\n",
- "Callocs: $callocs\n",
- "Strdups: $strdups\n",
- "Wcsdups: $wcsdups\n",
- "Frees: $frees\n",
- "Allocations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups)."\n";
+ "Reallocs: $reallocs\n",
+ "Callocs: $callocs\n",
+ "Strdups: $strdups\n",
+ "Wcsdups: $wcsdups\n",
+ "Frees: $frees\n",
+ "Sends: $sends\n",
+ "Recvs: $recvs\n",
+ "Sockets: $sockets\n",
+ "Allocations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups)."\n",
+ "Operations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups + $sends + $recvs + $sockets)."\n";
print "Maximum allocated: $maxmem\n";
}
diff --git a/tests/runtests.1 b/tests/runtests.1
index 844e9cb..08c2d06 100644
--- a/tests/runtests.1
+++ b/tests/runtests.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH runtests.pl 1 "May 05, 2017" "Curl 7.55.1" "runtests"
+.TH runtests.pl 1 "May 05, 2017" "Curl 7.57.0" "runtests"
.SH NAME
runtests.pl \- run one or more test cases
diff --git a/tests/runtests.pl b/tests/runtests.pl
index 065df7c..dcd9f84 100755
--- a/tests/runtests.pl
+++ b/tests/runtests.pl
@@ -217,6 +217,7 @@ my $gopher_ipv6; # set if Gopher server has IPv6 support
my $has_ipv6; # set if libcurl is built with IPv6 support
my $has_unix; # set if libcurl is built with Unix sockets support
my $has_libz; # set if libcurl is built with libz support
+my $has_brotli; # set if libcurl is built with brotli support
my $has_getrlimit; # set if system has getrlimit()
my $has_ntlm; # set if libcurl is built with NTLM support
my $has_ntlm_wb; # set if libcurl is built with NTLM delegation to winbind
@@ -232,6 +233,8 @@ my $has_crypto; # set if libcurl is built with cryptographic support
my $has_cares; # set if built with c-ares
my $has_threadedres;# set if built with threaded resolver
my $has_psl; # set if libcurl is built with PSL support
+my $has_ldpreload; # set if curl is built for systems supporting LD_PRELOAD
+my $has_multissl; # set if curl is build with MultiSSL support
# this version is decided by the particular nghttp2 library that is being used
my $h2cver = "h2c";
@@ -560,8 +563,7 @@ sub runclientoutput {
# Memory allocation test and failure torture testing.
#
sub torture {
- my $testcmd = shift;
- my $gdbline = shift;
+ my ($testcmd, $testnum, $gdbline) = @_;
# remove memdump first to be sure we get a new nice and clean one
unlink($memdump);
@@ -575,17 +577,17 @@ sub torture {
my $count=0;
my @out = `$memanalyze -v $memdump`;
for(@out) {
- if(/^Allocations: (\d+)/) {
+ if(/^Operations: (\d+)/) {
$count = $1;
last;
}
}
if(!$count) {
- logmsg " found no allocs to make fail\n";
+ logmsg " found no functions to make fail\n";
return 0;
}
- logmsg " $count allocations to make fail\n";
+ logmsg " $count functions to make fail\n";
for ( 1 .. $count ) {
my $limit = $_;
@@ -600,7 +602,7 @@ sub torture {
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time());
my $now = sprintf("%02d:%02d:%02d ", $hour, $min, $sec);
- logmsg "Fail alloc no: $limit at $now\r";
+ logmsg "Fail function no: $limit at $now\r";
}
# make the memory allocation function number $limit return failure
@@ -609,14 +611,28 @@ sub torture {
# remove memdump first to be sure we get a new nice and clean one
unlink($memdump);
- logmsg "*** Alloc number $limit is now set to fail ***\n" if($gdbthis);
+ my $cmd = $testcmd;
+ if($valgrind && !$gdbthis) {
+ my @valgrindoption = getpart("verify", "valgrind");
+ if((!@valgrindoption) || ($valgrindoption[0] !~ /disable/)) {
+ my $valgrindcmd = "$valgrind ";
+ $valgrindcmd .= "$valgrind_tool " if($valgrind_tool);
+ $valgrindcmd .= "--quiet --leak-check=yes ";
+ $valgrindcmd .= "--suppressions=$srcdir/valgrind.supp ";
+ # $valgrindcmd .= "--gen-suppressions=all ";
+ $valgrindcmd .= "--num-callers=16 ";
+ $valgrindcmd .= "${valgrind_logfile}=$LOGDIR/valgrind$testnum";
+ $cmd = "$valgrindcmd $testcmd";
+ }
+ }
+ logmsg "*** Function number $limit is now set to fail ***\n" if($gdbthis);
my $ret = 0;
if($gdbthis) {
runclient($gdbline);
}
else {
- $ret = runclient($testcmd);
+ $ret = runclient($cmd);
}
#logmsg "$_ Returned " . ($ret >> 8) . "\n";
@@ -630,6 +646,20 @@ sub torture {
$fail = 2;
}
+ if($valgrind) {
+ my @e = valgrindparse("$LOGDIR/valgrind$testnum");
+ if(@e && $e[0]) {
+ if($automakestyle) {
+ logmsg "FAIL: torture $testnum - valgrind\n";
+ }
+ else {
+ logmsg " valgrind ERROR ";
+ logmsg @e;
+ }
+ $fail = 1;
+ }
+ }
+
# verify that it returns a proper error code, doesn't leak memory
# and doesn't core dump
if(($ret & 255) || ($ret >> 8) >= 128) {
@@ -654,7 +684,7 @@ sub torture {
}
}
if($fail) {
- logmsg " Failed on alloc number $limit in test.\n",
+ logmsg " Failed on function number $limit in test.\n",
" invoke with \"-t$limit\" to repeat this single case.\n";
stopservers($verbose);
return 1;
@@ -2731,6 +2761,9 @@ sub checksystem {
$curl =~ s/^(.*)(libcurl.*)/$1/g;
$libcurl = $2;
+ if($curl =~ /linux|bsd|solaris|darwin/) {
+ $has_ldpreload = 1;
+ }
if($curl =~ /win32|mingw(32|64)/) {
# This is a Windows MinGW build or native build, we need to use
# Win32-style path.
@@ -2827,6 +2860,10 @@ sub checksystem {
# ssl enabled
$has_ssl=1;
}
+ if($feat =~ /MultiSSL/i) {
+ # multiple ssl backends available.
+ $has_multissl=1;
+ }
if($feat =~ /Largefile/i) {
# large file support
$has_largefile=1;
@@ -2844,6 +2881,9 @@ sub checksystem {
if($feat =~ /libz/i) {
$has_libz = 1;
}
+ if($feat =~ /brotli/i) {
+ $has_brotli = 1;
+ }
if($feat =~ /NTLM/i) {
# NTLM enabled
$has_ntlm=1;
@@ -3169,7 +3209,7 @@ sub fixarray {
my @in = @_;
for(@in) {
- subVariables \$_;
+ subVariables(\$_);
}
return @in;
}
@@ -3280,6 +3320,11 @@ sub singletest {
next;
}
}
+ elsif($1 eq "MultiSSL") {
+ if($has_multissl) {
+ next;
+ }
+ }
elsif($1 eq "SSLpinning") {
if($has_sslpinning) {
next;
@@ -3315,6 +3360,11 @@ sub singletest {
next;
}
}
+ elsif($1 eq "ld_preload") {
+ if($has_ldpreload && !$debug_build) {
+ next;
+ }
+ }
elsif($1 eq "unittest") {
if($debug_build) {
next;
@@ -3350,6 +3400,11 @@ sub singletest {
next;
}
}
+ elsif($1 eq "brotli") {
+ if($has_brotli) {
+ next;
+ }
+ }
elsif($1 eq "NTLM") {
if($has_ntlm) {
next;
@@ -3443,6 +3498,11 @@ sub singletest {
next;
}
}
+ elsif($1 eq "MultiSSL") {
+ if(!$has_multissl) {
+ next;
+ }
+ }
elsif($1 eq "OpenSSL") {
if(!$has_openssl) {
next;
@@ -3501,6 +3561,11 @@ sub singletest {
next;
}
}
+ elsif($1 eq "brotli") {
+ if(!$has_brotli) {
+ next;
+ }
+ }
elsif($1 eq "NTLM") {
if(!$has_ntlm) {
next;
@@ -3585,9 +3650,9 @@ sub singletest {
for $k (@keywords) {
chomp $k;
- if ($disabled_keywords{$k}) {
+ if ($disabled_keywords{lc($k)}) {
$why = "disabled by keyword";
- } elsif ($enabled_keywords{$k}) {
+ } elsif ($enabled_keywords{lc($k)}) {
$match = 1;
}
}
@@ -3629,7 +3694,7 @@ sub singletest {
if(@setenv) {
foreach my $s (@setenv) {
chomp $s;
- subVariables \$s;
+ subVariables(\$s);
if($s =~ /([^=]*)=(.*)/) {
my ($var, $content) = ($1, $2);
# remember current setting, to restore it once test runs
@@ -3755,6 +3820,13 @@ sub singletest {
# if this section exists, we verify upload
my @upload = getpart("verify", "upload");
+ if(@upload) {
+ my %hash = getpartattr("verify", "upload");
+ if($hash{'nonewline'}) {
+ # cut off the final newline from the final line of the upload data
+ chomp($upload[$#upload]);
+ }
+ }
# if this section exists, it might be FTP server instructions:
my @ftpservercmd = getpart("reply", "servercmd");
@@ -3808,23 +3880,25 @@ sub singletest {
unlink($memdump);
}
- # create a (possibly-empty) file before starting the test
- my @inputfile=getpart("client", "file");
- my %fileattr = getpartattr("client", "file");
- my $filename=$fileattr{'name'};
- if(@inputfile || $filename) {
- if(!$filename) {
- logmsg "ERROR: section client=>file has no name attribute\n";
- timestampskippedevents($testnum);
- return -1;
+ # create (possibly-empty) files before starting the test
+ for my $partsuffix (('', '1', '2', '3', '4')) {
+ my @inputfile=getpart("client", "file".$partsuffix);
+ my %fileattr = getpartattr("client", "file".$partsuffix);
+ my $filename=$fileattr{'name'};
+ if(@inputfile || $filename) {
+ if(!$filename) {
+ logmsg "ERROR: section client=>file has no name attribute\n";
+ timestampskippedevents($testnum);
+ return -1;
+ }
+ my $fileContent = join('', @inputfile);
+ subVariables \$fileContent;
+# logmsg "DEBUG: writing file " . $filename . "\n";
+ open(OUTFILE, ">$filename");
+ binmode OUTFILE; # for crapage systems, use binary
+ print OUTFILE $fileContent;
+ close(OUTFILE);
}
- my $fileContent = join('', @inputfile);
- subVariables \$fileContent;
-# logmsg "DEBUG: writing file " . $filename . "\n";
- open(OUTFILE, ">$filename");
- binmode OUTFILE; # for crapage systems, use binary
- print OUTFILE $fileContent;
- close(OUTFILE);
}
my %cmdhash = getpartattr("client", "command");
@@ -3985,7 +4059,8 @@ sub singletest {
# run the command line we built
if ($torture) {
$cmdres = torture($CMDLINE,
- "$gdb --directory libtest $DBGCURL -x $LOGDIR/gdbcmd");
+ $testnum,
+ "$gdb --directory libtest $DBGCURL -x $LOGDIR/gdbcmd");
}
elsif($gdbthis) {
my $GDBW = ($gdbxwin) ? "-w" : "";
@@ -4289,6 +4364,17 @@ sub singletest {
if(@upload) {
# verify uploaded data
my @out = loadarray("$LOGDIR/upload.$testnum");
+
+ # what parts to cut off from the upload
+ my @strippart = getpart("verify", "strippart");
+ my $strip;
+ for $strip (@strippart) {
+ chomp $strip;
+ for(@out) {
+ eval $strip;
+ }
+ }
+
$res = compare($testnum, $testname, "upload", \@out, \@upload);
if ($res) {
return 1;
@@ -5281,8 +5367,6 @@ while(@ARGV) {
if($xtra =~ s/(\d+)$//) {
$tortalloc = $1;
}
- # we undef valgrind to make this fly in comparison
- undef $valgrind;
}
elsif($ARGV[0] eq "-a") {
# continue anyway, even if a test fail
@@ -5348,7 +5432,7 @@ Usage: runtests.pl [options] [test selection(s)]
-rf full run time statistics
-s short output
-am automake style output PASS/FAIL: [number] [name]
- -t[N] torture (simulate memory alloc failures); N means fail Nth alloc
+ -t[N] torture (simulate function failures); N means fail Nth function
-v verbose output
-vc path use this curl only to verify the existing servers
[num] like "5 6 9" or " 5 to 22 " to run those tests only
@@ -5379,10 +5463,10 @@ EOHELP
$disabled{$1}=$1;
}
elsif($ARGV[0] =~ /^!(.+)/) {
- $disabled_keywords{$1}=$1;
+ $disabled_keywords{lc($1)}=$1;
}
elsif($ARGV[0] =~ /^([-[{a-zA-Z].*)/) {
- $enabled_keywords{$1}=$1;
+ $enabled_keywords{lc($1)}=$1;
}
else {
print "Unknown option: $ARGV[0]\n";
diff --git a/tests/server/Makefile.inc b/tests/server/Makefile.inc
index c3ea664..208aa0f 100644
--- a/tests/server/Makefile.inc
+++ b/tests/server/Makefile.inc
@@ -4,14 +4,12 @@ CURLX_SRCS = \
../../lib/mprintf.c \
../../lib/nonblock.c \
../../lib/strtoofft.c \
- ../../lib/timeval.c \
../../lib/warnless.c
CURLX_HDRS = \
../../lib/curlx.h \
../../lib/nonblock.h \
../../lib/strtoofft.h \
- ../../lib/timeval.h \
../../lib/warnless.h
USEFUL = \
diff --git a/tests/server/fake_ntlm.c b/tests/server/fake_ntlm.c
index 0d1b3e1..ca2b438 100644
--- a/tests/server/fake_ntlm.c
+++ b/tests/server/fake_ntlm.c
@@ -63,7 +63,8 @@ static char *printable(char *inbuf, size_t inlength)
inlength = strlen(inbuf);
if(inlength) {
- outincr = ((inlength/2) < (HEX_STR_LEN+1)) ? HEX_STR_LEN+1 : inlength/2;
+ outincr = ((inlength/2) < (HEX_STR_LEN + 1)) ?
+ HEX_STR_LEN + 1 : inlength/2;
outsize = inlength + outincr;
}
else
@@ -78,7 +79,7 @@ static char *printable(char *inbuf, size_t inlength)
return outbuf;
}
- for(i=0; i<inlength; i++) {
+ for(i = 0; i<inlength; i++) {
if(o > outsize - (HEX_STR_LEN + 1)) {
newsize = outsize + outincr;
@@ -186,7 +187,7 @@ int main(int argc, char *argv[])
}
filename = test2file(testnum);
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -204,7 +205,7 @@ int main(int argc, char *argv[])
}
}
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -224,7 +225,7 @@ int main(int argc, char *argv[])
while(fgets(buf, sizeof(buf), stdin)) {
if(strcmp(buf, type1_input) == 0) {
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -246,7 +247,7 @@ int main(int argc, char *argv[])
fflush(stdout);
}
else if(strncmp(buf, type3_input, strlen(type3_input)) == 0) {
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
diff --git a/tests/server/getpart.c b/tests/server/getpart.c
index bb8351b..d434ba2 100644
--- a/tests/server/getpart.c
+++ b/tests/server/getpart.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -66,6 +66,35 @@ curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)_wcsdup;
# pragma warning(default:4232) /* MSVC extension, dllimport identity */
#endif
+
+/*
+ * Curl_convert_clone() returns a malloced copy of the source string (if
+ * returning CURLE_OK), with the data converted to network format. This
+ * function is used by base64 code in libcurl built to support data
+ * conversion. This is a DUMMY VERSION that returns data unmodified - for
+ * use by the test server only.
+ */
+CURLcode Curl_convert_clone(struct Curl_easy *data,
+ const char *indata,
+ size_t insize,
+ char **outbuf);
+CURLcode Curl_convert_clone(struct Curl_easy *data,
+ const char *indata,
+ size_t insize,
+ char **outbuf)
+{
+ char *convbuf;
+ (void)data;
+
+ convbuf = malloc(insize);
+ if(!convbuf)
+ return CURLE_OUT_OF_MEMORY;
+
+ memcpy(convbuf, indata, insize);
+ *outbuf = convbuf;
+ return CURLE_OK;
+}
+
/*
* readline()
*
@@ -250,11 +279,11 @@ int getpart(char **outbuf, size_t *outlen,
const char *main, const char *sub, FILE *stream)
{
# define MAX_TAG_LEN 79
- char couter[MAX_TAG_LEN+1]; /* current outermost section */
- char cmain[MAX_TAG_LEN+1]; /* current main section */
- char csub[MAX_TAG_LEN+1]; /* current sub section */
- char ptag[MAX_TAG_LEN+1]; /* potential tag */
- char patt[MAX_TAG_LEN+1]; /* potential attributes */
+ char couter[MAX_TAG_LEN + 1]; /* current outermost section */
+ char cmain[MAX_TAG_LEN + 1]; /* current main section */
+ char csub[MAX_TAG_LEN + 1]; /* current sub section */
+ char ptag[MAX_TAG_LEN + 1]; /* potential tag */
+ char patt[MAX_TAG_LEN + 1]; /* potential attributes */
char *buffer = NULL;
char *ptr;
char *end;
@@ -451,4 +480,3 @@ int getpart(char **outbuf, size_t *outlen,
return error;
}
-
diff --git a/tests/server/resolve.c b/tests/server/resolve.c
index 34f14e0..4cbdba6 100644
--- a/tests/server/resolve.c
+++ b/tests/server/resolve.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -57,11 +57,11 @@
static bool use_ipv6 = FALSE;
static const char *ipv_inuse = "IPv4";
-const char *serverlogfile=""; /* for a util.c function we don't use */
+const char *serverlogfile = ""; /* for a util.c function we don't use */
int main(int argc, char *argv[])
{
- int arg=1;
+ int arg = 1;
const char *host = NULL;
int rc = 0;
diff --git a/tests/server/rtspd.c b/tests/server/rtspd.c
index 120d65d..53ffeb6 100644
--- a/tests/server/rtspd.c
+++ b/tests/server/rtspd.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -70,11 +70,11 @@ static int serverlogslocked = 0;
#define REQBUFSIZ 150000
#define REQBUFSIZ_TXT "149999"
-static long prevtestno=-1; /* previous test number we served */
-static long prevpartno=-1; /* previous part number we served */
-static bool prevbounce=FALSE; /* instructs the server to increase the part
- number for a test in case the identical
- testno+partno request shows up again */
+static long prevtestno = -1; /* previous test number we served */
+static long prevpartno = -1; /* previous part number we served */
+static bool prevbounce = FALSE; /* instructs the server to increase the part
+ number for a test in case the identical
+ testno+partno request shows up again */
#define RCMD_NORMALREQ 0 /* default request, use the tests file normally */
#define RCMD_IDLE 1 /* told to sit idle */
@@ -156,7 +156,7 @@ enum {
DOCNUMBER_NOTHING = -7,
DOCNUMBER_QUIT = -6,
DOCNUMBER_BADCONNECT = -5,
- DOCNUMBER_INTERNAL= -4,
+ DOCNUMBER_INTERNAL = -4,
DOCNUMBER_CONNECT = -3,
DOCNUMBER_WERULEZ = -2,
DOCNUMBER_404 = -1
@@ -332,7 +332,7 @@ static void restore_signal_handlers(void)
static int ProcessRequest(struct httprequest *req)
{
- char *line=&req->reqbuf[req->checkindex];
+ char *line = &req->reqbuf[req->checkindex];
bool chunked = FALSE;
static char request[REQUEST_KEYWORD_SIZE];
static char doc[MAXDOCNAMELEN];
@@ -421,7 +421,7 @@ static int ProcessRequest(struct httprequest *req)
filename = test2file(req->testno);
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -433,7 +433,7 @@ static int ProcessRequest(struct httprequest *req)
else {
char *cmd = NULL;
size_t cmdsize = 0;
- int num=0;
+ int num = 0;
int rtp_channel = 0;
int rtp_size = 0;
@@ -500,7 +500,7 @@ static int ProcessRequest(struct httprequest *req)
SET_RTP_PKT_LEN(rtp_scratch, rtp_size);
/* Fill it with junk data */
- for(i = 0; i < rtp_size; i+= RTP_DATA_SIZE) {
+ for(i = 0; i < rtp_size; i += RTP_DATA_SIZE) {
memcpy(rtp_scratch + 4 + i, RTP_DATA, RTP_DATA_SIZE);
}
@@ -554,8 +554,8 @@ static int ProcessRequest(struct httprequest *req)
/* if the host name starts with test, the port number used in the
CONNECT line will be used as test number! */
char *portp = strchr(doc, ':');
- if(portp && (*(portp+1) != '\0') && ISDIGIT(*(portp+1)))
- req->testno = strtol(portp+1, NULL, 10);
+ if(portp && (*(portp + 1) != '\0') && ISDIGIT(*(portp + 1)))
+ req->testno = strtol(portp + 1, NULL, 10);
else
req->testno = DOCNUMBER_CONNECT;
}
@@ -596,7 +596,7 @@ static int ProcessRequest(struct httprequest *req)
if(got_exit_signal)
return 1; /* done */
- if((req->cl==0) && strncasecompare("Content-Length:", line, 15)) {
+ if((req->cl == 0) && strncasecompare("Content-Length:", line, 15)) {
/* If we don't ignore content-length, we read it and we read the whole
request including the body before we return. If we've been told to
ignore the content-length, we will return as soon as all headers
@@ -896,10 +896,10 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
ssize_t written;
size_t count;
const char *buffer;
- char *ptr=NULL;
+ char *ptr = NULL;
FILE *stream;
- char *cmd=NULL;
- size_t cmdsize=0;
+ char *cmd = NULL;
+ size_t cmdsize = 0;
FILE *dump;
bool persistant = TRUE;
bool sendfailure = FALSE;
@@ -988,7 +988,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
if(0 != req->partno)
snprintf(partbuf, sizeof(partbuf), "data%ld", req->partno);
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -1012,7 +1012,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
}
/* re-open the same file again */
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -1140,7 +1140,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
char command[32];
int quarters;
int num;
- ptr=cmd;
+ ptr = cmd;
do {
if(2 == sscanf(ptr, "%31s %d", command, &num)) {
if(!strcmp("wait", command)) {
@@ -1194,7 +1194,7 @@ int main(int argc, char *argv[])
struct httprequest req;
int rc;
int error;
- int arg=1;
+ int arg = 1;
long pid;
memset(&req, 0, sizeof(req));
diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c
index 6695d84..f13ef20 100644
--- a/tests/server/sockfilt.c
+++ b/tests/server/sockfilt.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -478,26 +478,26 @@ static void lograw(unsigned char *buffer, ssize_t len)
ssize_t i;
unsigned char *ptr = buffer;
char *optr = data;
- ssize_t width=0;
+ ssize_t width = 0;
int left = sizeof(data);
- for(i=0; i<len; i++) {
+ for(i = 0; i<len; i++) {
switch(ptr[i]) {
case '\n':
snprintf(optr, left, "\\n");
width += 2;
optr += 2;
- left-=2;
+ left -= 2;
break;
case '\r':
snprintf(optr, left, "\\r");
width += 2;
optr += 2;
- left-=2;
+ left -= 2;
break;
default:
snprintf(optr, left, "%c", (ISGRAPH(ptr[i]) ||
- ptr[i]==0x20) ?ptr[i]:'.');
+ ptr[i] == 0x20) ?ptr[i]:'.');
width++;
optr++;
left--;
@@ -1200,7 +1200,7 @@ static curl_socket_t sockdaemon(curl_socket_t sock,
int rc;
int totdelay = 0;
int maxretr = 10;
- int delay= 20;
+ int delay = 20;
int attempt = 0;
int error = 0;
@@ -1343,7 +1343,7 @@ int main(int argc, char *argv[])
bool juggle_again;
int rc;
int error;
- int arg=1;
+ int arg = 1;
enum sockmode mode = PASSIVE_LISTEN; /* default */
const char *addr = NULL;
diff --git a/tests/server/sws.c b/tests/server/sws.c
index bff30f2..8214970 100644
--- a/tests/server/sws.c
+++ b/tests/server/sws.c
@@ -81,11 +81,11 @@ static bool is_proxy = FALSE;
#define REQBUFSIZ 150000
#define REQBUFSIZ_TXT "149999"
-static long prevtestno=-1; /* previous test number we served */
-static long prevpartno=-1; /* previous part number we served */
-static bool prevbounce=FALSE; /* instructs the server to increase the part
- number for a test in case the identical
- testno+partno request shows up again */
+static long prevtestno = -1; /* previous test number we served */
+static long prevpartno = -1; /* previous part number we served */
+static bool prevbounce = FALSE; /* instructs the server to increase the part
+ number for a test in case the identical
+ testno+partno request shows up again */
#define RCMD_NORMALREQ 0 /* default request, use the tests file normally */
#define RCMD_IDLE 1 /* told to sit idle */
@@ -359,7 +359,7 @@ static int parse_servercmd(struct httprequest *req)
filename = test2file(req->testno);
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -372,7 +372,7 @@ static int parse_servercmd(struct httprequest *req)
char *orgcmd = NULL;
char *cmd = NULL;
size_t cmdsize = 0;
- int num=0;
+ int num = 0;
/* get the custom server control "commands" */
error = getpart(&orgcmd, &cmdsize, "reply", "servercmd", stream);
@@ -456,7 +456,7 @@ static int parse_servercmd(struct httprequest *req)
static int ProcessRequest(struct httprequest *req)
{
- char *line=&req->reqbuf[req->checkindex];
+ char *line = &req->reqbuf[req->checkindex];
bool chunked = FALSE;
static char request[REQUEST_KEYWORD_SIZE];
static char doc[MAXDOCNAMELEN];
@@ -552,7 +552,7 @@ static int ProcessRequest(struct httprequest *req)
if(sscanf(req->reqbuf, "CONNECT %" MAXDOCNAMELEN_TXT "s HTTP/%d.%d",
doc, &prot_major, &prot_minor) == 3) {
char *portp = NULL;
- unsigned long part=0;
+ unsigned long part = 0;
snprintf(logbuf, sizeof(logbuf),
"Received a CONNECT %s HTTP/%d.%d request",
@@ -578,18 +578,18 @@ static int ProcessRequest(struct httprequest *req)
}
if(*p != ']')
logmsg("Invalid CONNECT IPv6 address format");
- else if(*(p+1) != ':')
+ else if(*(p + 1) != ':')
logmsg("Invalid CONNECT IPv6 port format");
else
- portp = p+1;
+ portp = p + 1;
req->testno = part;
}
else
portp = strchr(doc, ':');
- if(portp && (*(portp+1) != '\0') && ISDIGIT(*(portp+1))) {
- unsigned long ulnum = strtoul(portp+1, NULL, 10);
+ if(portp && (*(portp + 1) != '\0') && ISDIGIT(*(portp + 1))) {
+ unsigned long ulnum = strtoul(portp + 1, NULL, 10);
if(!ulnum || (ulnum > 65535UL))
logmsg("Invalid CONNECT port received");
else
@@ -711,7 +711,7 @@ static int ProcessRequest(struct httprequest *req)
if(got_exit_signal)
return 1; /* done */
- if((req->cl==0) && strncasecompare("Content-Length:", line, 15)) {
+ if((req->cl == 0) && strncasecompare("Content-Length:", line, 15)) {
/* If we don't ignore content-length, we read it and we read the whole
request including the body before we return. If we've been told to
ignore the content-length, we will return as soon as all headers
@@ -763,7 +763,20 @@ static int ProcessRequest(struct httprequest *req)
logmsg("Authorization header found, as required");
}
- if(!req->digest && strstr(req->reqbuf, "Authorization: Digest")) {
+ if(strstr(req->reqbuf, "Authorization: Negotiate")) {
+ /* Negotiate iterations */
+ static long prev_testno = -1;
+ static long prev_partno = -1;
+ logmsg("Negotiate: prev_testno: %d, prev_partno: %d",
+ prev_testno, prev_partno);
+ if(req->testno != prev_testno) {
+ prev_testno = req->testno;
+ prev_partno = req->partno;
+ }
+ prev_partno += 1;
+ req->partno = prev_partno;
+ }
+ else if(!req->digest && strstr(req->reqbuf, "Authorization: Digest")) {
/* If the client is passing this Digest-header, we set the part number
to 1000. Not only to spice up the complexity of this, but to make
Digest stuff to work in the test suite. */
@@ -858,7 +871,7 @@ static void storerequest(const char *reqbuf, size_t totalsize)
size_t written;
size_t writeleft;
FILE *dump;
- const char *dumpfile=is_proxy?REQUEST_PROXY_DUMP:REQUEST_DUMP;
+ const char *dumpfile = is_proxy?REQUEST_PROXY_DUMP:REQUEST_DUMP;
if(reqbuf == NULL)
return;
@@ -1044,10 +1057,10 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
ssize_t written;
size_t count;
const char *buffer;
- char *ptr=NULL;
+ char *ptr = NULL;
FILE *stream;
- char *cmd=NULL;
- size_t cmdsize=0;
+ char *cmd = NULL;
+ size_t cmdsize = 0;
FILE *dump;
bool persistant = TRUE;
bool sendfailure = FALSE;
@@ -1118,7 +1131,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
/* select the <data> tag for "normal" requests and the <connect> one
for CONNECT requests (within the <reply> section) */
- const char *section= req->connect_request?"connect":"data";
+ const char *section = req->connect_request?"connect":"data";
if(req->partno)
snprintf(partbuf, sizeof(partbuf), "%s%ld", section, req->partno);
@@ -1127,7 +1140,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
logmsg("Send response test%ld section <%s>", req->testno, partbuf);
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -1150,7 +1163,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
}
/* re-open the same file again */
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -1266,7 +1279,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
char command[32];
int quarters;
int num;
- ptr=cmd;
+ ptr = cmd;
do {
if(2 == sscanf(ptr, "%31s %d", command, &num)) {
if(!strcmp("wait", command)) {
@@ -1436,7 +1449,7 @@ static void http_connect(curl_socket_t *infdp,
int max_tunnel_idx; /* CTRL or DATA */
int loop;
int i;
- int timeout_count=0;
+ int timeout_count = 0;
/* primary tunnel client endpoint already connected */
clientfd[CTRL] = *infdp;
@@ -1526,7 +1539,7 @@ static void http_connect(curl_socket_t *infdp,
if(rc > 0) {
/* socket action */
bool tcp_fin_wr;
- timeout_count=0;
+ timeout_count = 0;
if(got_exit_signal)
break;
@@ -1974,7 +1987,7 @@ int main(int argc, char *argv[])
struct httprequest req;
int rc = 0;
int error;
- int arg=1;
+ int arg = 1;
long pid;
const char *connecthost = "127.0.0.1";
const char *socket_type = "IPv4";
@@ -2319,7 +2332,7 @@ int main(int argc, char *argv[])
logmsg("====> Client disconnect %d", req.connmon);
if(req.connmon) {
- const char *keepopen="[DISCONNECT]\n";
+ const char *keepopen = "[DISCONNECT]\n";
storerequest(keepopen, strlen(keepopen));
}
diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c
index df01eb7..a8b5651 100644
--- a/tests/server/tftpd.c
+++ b/tests/server/tftpd.c
@@ -515,7 +515,7 @@ static void read_ahead(struct testcase *test,
}
else {
if(test->rcount) {
- c=test->rptr[0];
+ c = test->rptr[0];
test->rptr++;
test->rcount--;
}
@@ -571,9 +571,9 @@ static ssize_t write_behind(struct testcase *test, int convert)
char outfile[256];
snprintf(outfile, sizeof(outfile), "log/upload.%ld", test->testno);
#ifdef WIN32
- test->ofile=open(outfile, O_CREAT|O_RDWR|O_BINARY, 0777);
+ test->ofile = open(outfile, O_CREAT|O_RDWR|O_BINARY, 0777);
#else
- test->ofile=open(outfile, O_CREAT|O_RDWR, 0777);
+ test->ofile = open(outfile, O_CREAT|O_RDWR, 0777);
#endif
if(test->ofile == -1) {
logmsg("Couldn't create and/or open file %s for upload!", outfile);
@@ -992,7 +992,7 @@ static int do_tftp(struct testcase *test, struct tftphdr *tp, ssize_t size)
/* before increasing pointer, make sure it is still within the legal
space */
- if((cp+1) < &buf.storage[size]) {
+ if((cp + 1) < &buf.storage[size]) {
++cp;
if(first) {
/* store the mode since we need it later */
@@ -1074,7 +1074,7 @@ static int parse_servercmd(struct testcase *req)
filename = test2file(req->testno);
- stream=fopen(filename, "rb");
+ stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
@@ -1086,7 +1086,7 @@ static int parse_servercmd(struct testcase *req)
char *orgcmd = NULL;
char *cmd = NULL;
size_t cmdsize = 0;
- int num=0;
+ int num = 0;
/* get the custom server control "commands" */
error = getpart(&orgcmd, &cmdsize, "reply", "servercmd", stream);
@@ -1192,7 +1192,7 @@ static int validate_access(struct testcase *test,
snprintf(partbuf, sizeof(partbuf), "data%ld", partno);
if(file) {
- FILE *stream=fopen(file, "rb");
+ FILE *stream = fopen(file, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
diff --git a/tests/server/util.c b/tests/server/util.c
index 42e5853..fdbd71f 100644
--- a/tests/server/util.c
+++ b/tests/server/util.c
@@ -67,6 +67,8 @@ const struct in6_addr in6addr_any = {{ IN6ADDR_ANY_INIT }};
#endif /* w32api < 3.6 */
#endif /* ENABLE_IPV6 && __MINGW32__*/
+static struct timeval tvnow(void);
+
/* This function returns a pointer to STATIC memory. It converts the given
* binary lump to a hex formatted string usable for output in logs or
* whatever.
@@ -81,15 +83,15 @@ char *data_to_hex(char *data, size_t len)
if(len > 255)
len = 255;
- for(i=0; i < len; i++) {
+ for(i = 0; i < len; i++) {
if((data[i] >= 0x20) && (data[i] < 0x7f))
*optr++ = *iptr++;
else {
snprintf(optr, 4, "%%%02x", *iptr++);
- optr+=3;
+ optr += 3;
}
}
- *optr=0; /* in case no sprintf was used */
+ *optr = 0; /* in case no sprintf was used */
return buf;
}
@@ -100,7 +102,7 @@ void logmsg(const char *msg, ...)
char buffer[2048 + 1];
FILE *logfp;
int error;
- struct curltime tv;
+ struct timeval tv;
time_t sec;
struct tm *now;
char timebuf[20];
@@ -112,7 +114,7 @@ void logmsg(const char *msg, ...)
return;
}
- tv = curlx_tvnow();
+ tv = tvnow();
if(!known_offset) {
epoch_offset = time(NULL) - tv.tv_sec;
known_offset = 1;
@@ -189,7 +191,7 @@ void win32_cleanup(void)
#endif /* USE_WINSOCK */
/* set by the main code to point to where the test dir is */
-const char *path=".";
+const char *path = ".";
char *test2file(long testno)
{
@@ -213,7 +215,7 @@ int wait_ms(int timeout_ms)
#ifndef HAVE_POLL_FINE
struct timeval pending_tv;
#endif
- struct curltime initial_tv;
+ struct timeval initial_tv;
int pending_ms;
int error;
#endif
@@ -231,7 +233,7 @@ int wait_ms(int timeout_ms)
Sleep(timeout_ms);
#else
pending_ms = timeout_ms;
- initial_tv = curlx_tvnow();
+ initial_tv = tvnow();
do {
#if defined(HAVE_POLL_FINE)
r = poll(NULL, 0, pending_ms);
@@ -245,7 +247,7 @@ int wait_ms(int timeout_ms)
error = errno;
if(error && (error != EINTR))
break;
- pending_ms = timeout_ms - (int)curlx_tvdiff(curlx_tvnow(), initial_tv);
+ pending_ms = timeout_ms - (int)timediff(tvnow(), initial_tv);
if(pending_ms <= 0)
break;
} while(r == -1);
@@ -397,3 +399,102 @@ int strncasecompare(const char *first, const char *second, size_t max)
return raw_toupper(*first) == raw_toupper(*second);
}
+
+#if defined(WIN32) && !defined(MSDOS)
+
+static struct timeval tvnow(void)
+{
+ /*
+ ** GetTickCount() is available on _all_ Windows versions from W95 up
+ ** to nowadays. Returns milliseconds elapsed since last system boot,
+ ** increases monotonically and wraps once 49.7 days have elapsed.
+ **
+ ** GetTickCount64() is available on Windows version from Windows Vista
+ ** and Windows Server 2008 up to nowadays. The resolution of the
+ ** function is limited to the resolution of the system timer, which
+ ** is typically in the range of 10 milliseconds to 16 milliseconds.
+ */
+ struct timeval now;
+#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ ULONGLONG milliseconds = GetTickCount64();
+#else
+ DWORD milliseconds = GetTickCount();
+#endif
+ now.tv_sec = (long)(milliseconds / 1000);
+ now.tv_usec = (milliseconds % 1000) * 1000;
+ return now;
+}
+
+#elif defined(HAVE_CLOCK_GETTIME_MONOTONIC)
+
+static struct timeval tvnow(void)
+{
+ /*
+ ** clock_gettime() is granted to be increased monotonically when the
+ ** monotonic clock is queried. Time starting point is unspecified, it
+ ** could be the system start-up time, the Epoch, or something else,
+ ** in any case the time starting point does not change once that the
+ ** system has started up.
+ */
+ struct timeval now;
+ struct timespec tsnow;
+ if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
+ now.tv_sec = tsnow.tv_sec;
+ now.tv_usec = tsnow.tv_nsec / 1000;
+ }
+ /*
+ ** Even when the configure process has truly detected monotonic clock
+ ** availability, it might happen that it is not actually available at
+ ** run-time. When this occurs simply fallback to other time source.
+ */
+#ifdef HAVE_GETTIMEOFDAY
+ else
+ (void)gettimeofday(&now, NULL);
+#else
+ else {
+ now.tv_sec = (long)time(NULL);
+ now.tv_usec = 0;
+ }
+#endif
+ return now;
+}
+
+#elif defined(HAVE_GETTIMEOFDAY)
+
+static struct timeval tvnow(void)
+{
+ /*
+ ** gettimeofday() is not granted to be increased monotonically, due to
+ ** clock drifting and external source time synchronization it can jump
+ ** forward or backward in time.
+ */
+ struct timeval now;
+ (void)gettimeofday(&now, NULL);
+ return now;
+}
+
+#else
+
+static struct timeval tvnow(void)
+{
+ /*
+ ** time() returns the value of time in seconds since the Epoch.
+ */
+ struct timeval now;
+ now.tv_sec = (long)time(NULL);
+ now.tv_usec = 0;
+ return now;
+}
+
+#endif
+
+long timediff(struct timeval newer, struct timeval older)
+{
+ timediff_t diff = newer.tv_sec-older.tv_sec;
+ if(diff >= (LONG_MAX/1000))
+ return LONG_MAX;
+ else if(diff <= (LONG_MIN/1000))
+ return LONG_MIN;
+ return (long)(newer.tv_sec-older.tv_sec)*1000+
+ (long)(newer.tv_usec-older.tv_usec)/1000;
+}
diff --git a/tests/server/util.h b/tests/server/util.h
index a2a56ba..7b4ec16 100644
--- a/tests/server/util.h
+++ b/tests/server/util.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,6 +25,7 @@
char *data_to_hex(char *data, size_t len);
void logmsg(const char *msg, ...);
+long timediff(struct timeval newer, struct timeval older);
#define TEST_DATA_PATH "%s/data/test%ld"
diff --git a/tests/testcurl.1 b/tests/testcurl.1
index 618ff51..5f4cac5 100644
--- a/tests/testcurl.1
+++ b/tests/testcurl.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH testcurl.pl 1 "October 22, 2016" "Curl 7.55.1" "testcurl"
+.TH testcurl.pl 1 "October 22, 2016" "Curl 7.57.0" "testcurl"
.SH NAME
testcurl.pl \- (automatically) test curl
diff --git a/tests/unit/unit1300.c b/tests/unit/unit1300.c
index 8ec32a8..c64fade 100644
--- a/tests/unit/unit1300.c
+++ b/tests/unit/unit1300.c
@@ -145,7 +145,7 @@ UNITTEST_START
* 3: "new" head's previous will be NULL
*/
- head=llist.head;
+ head = llist.head;
abort_unless(head, "llist.head is NULL");
element_next = head->next;
llist_size = Curl_llist_count(&llist);
diff --git a/tests/unit/unit1301.c b/tests/unit/unit1301.c
index aa86101..2af60be 100644
--- a/tests/unit/unit1301.c
+++ b/tests/unit/unit1301.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,7 +31,7 @@ UNITTEST_START
int rc;
rc = curl_strequal("iii", "III");
-fail_unless(rc != 0, "return code should be zero");
+fail_unless(rc != 0, "return code should be non-zero");
rc = curl_strequal("iiia", "III");
fail_unless(rc == 0, "return code should be zero");
diff --git a/tests/unit/unit1302.c b/tests/unit/unit1302.c
index 8dae5aa..e6f94b2 100644
--- a/tests/unit/unit1302.c
+++ b/tests/unit/unit1302.c
@@ -30,15 +30,19 @@ static struct Curl_easy *data;
static CURLcode unit_setup(void)
{
+ int res = CURLE_OK;
+
+ global_init(CURL_GLOBAL_ALL);
data = curl_easy_init();
if(!data)
return CURLE_OUT_OF_MEMORY;
- return CURLE_OK;
+ return res;
}
static void unit_stop(void)
{
curl_easy_cleanup(data);
+ curl_global_cleanup();
}
UNITTEST_START
diff --git a/tests/unit/unit1303.c b/tests/unit/unit1303.c
index 143ccd0..75a8e59 100644
--- a/tests/unit/unit1303.c
+++ b/tests/unit/unit1303.c
@@ -29,15 +29,19 @@ static struct Curl_easy *data;
static CURLcode unit_setup(void)
{
+ int res = CURLE_OK;
+
+ global_init(CURL_GLOBAL_ALL);
data = curl_easy_init();
if(!data)
return CURLE_OUT_OF_MEMORY;
- return CURLE_OK;
+ return res;
}
static void unit_stop(void)
{
curl_easy_cleanup(data);
+ curl_global_cleanup();
}
/* BASE is just a define to make us fool around with decently large number so
@@ -134,7 +138,7 @@ UNITTEST_START
data->progress.t_startop.tv_sec = BASE;
data->progress.t_startop.tv_usec = 0;
- for(i=0; i < sizeof(run)/sizeof(run[0]); i++) {
+ for(i = 0; i < sizeof(run)/sizeof(run[0]); i++) {
NOW(run[i].now_s, run[i].now_us);
TIMEOUTS(run[i].timeout_ms, run[i].connecttimeout_ms);
timeout = Curl_timeleft(data, &now, run[i].connecting);
diff --git a/tests/unit/unit1305.c b/tests/unit/unit1305.c
index b958d04..6e4bbb8 100644
--- a/tests/unit/unit1305.c
+++ b/tests/unit/unit1305.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -130,7 +130,7 @@ UNITTEST_START
key_len = strlen(data_key);
data_node->inuse = 1; /* hash will hold the reference */
- nodep = Curl_hash_add(&hp, data_key, key_len+1, data_node);
+ nodep = Curl_hash_add(&hp, data_key, key_len + 1, data_node);
abort_unless(nodep, "insertion into hash failed");
/* Freeing will now be done by Curl_hash_destroy */
data_node = NULL;
diff --git a/tests/unit/unit1308.c b/tests/unit/unit1308.c
index 5c1a008..ac41c9d 100644
--- a/tests/unit/unit1308.c
+++ b/tests/unit/unit1308.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -71,7 +71,7 @@ UNITTEST_START
fail_unless(rc == 0, "curl_formget returned error");
- fail_unless(total_size == 486, "curl_formget got wrong size back");
+ fail_unless(total_size == 488, "curl_formget got wrong size back");
curl_formfree(post);
@@ -88,7 +88,7 @@ UNITTEST_START
rc = curl_formget(post, &total_size, print_httppost_callback);
fail_unless(rc == 0, "curl_formget returned error");
- fail_unless(total_size == 847, "curl_formget got wrong size back");
+ fail_unless(total_size == 851, "curl_formget got wrong size back");
curl_formfree(post);
diff --git a/tests/unit/unit1309.c b/tests/unit/unit1309.c
index 9d1e70d..c53cbcb 100644
--- a/tests/unit/unit1309.c
+++ b/tests/unit/unit1309.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -42,8 +42,8 @@ static void splayprint(struct Curl_tree * t, int d, char output)
if(t == NULL)
return;
- splayprint(t->larger, d+1, output);
- for(i=0; i<d; i++)
+ splayprint(t->larger, d + 1, output);
+ for(i = 0; i<d; i++)
if(output)
printf(" ");
@@ -52,7 +52,7 @@ static void splayprint(struct Curl_tree * t, int d, char output)
(long)t->key.tv_usec, i);
}
- for(count=0, node = t->samen; node != t; node = node->samen, count++)
+ for(count = 0, node = t->samen; node != t; node = node->samen, count++)
;
if(output) {
@@ -62,7 +62,7 @@ static void splayprint(struct Curl_tree * t, int d, char output)
printf("\n");
}
- splayprint(t->smaller, d+1, output);
+ splayprint(t->smaller, d + 1, output);
}
UNITTEST_START
@@ -94,7 +94,7 @@ UNITTEST_START
splayprint(root, 0, 1);
for(i = 0; i < NUM_NODES; i++) {
- int rem = (i+7)%NUM_NODES;
+ int rem = (i + 7)%NUM_NODES;
printf("Tree look:\n");
splayprint(root, 0, 1);
printf("remove pointer %d, payload %ld\n", rem,
@@ -119,13 +119,13 @@ UNITTEST_START
/* add some nodes with the same key */
for(j = 0; j <= i % 3; j++) {
size_t payload = key.tv_usec*10 + j;
- nodes[i*3+j].payload = (void *)payload; /* for simplicity */
- root = Curl_splayinsert(key, root, &nodes[i*3+j]);
+ nodes[i * 3 + j].payload = (void *)payload; /* for simplicity */
+ root = Curl_splayinsert(key, root, &nodes[i * 3 + j]);
}
}
removed = NULL;
- for(i = 0; i <= 1100; i+= 100) {
+ for(i = 0; i <= 1100; i += 100) {
printf("Removing nodes not larger than %d\n", i);
tv_now.tv_usec = i;
root = Curl_splaygetbest(tv_now, root, &removed);
diff --git a/tests/unit/unit1323.c b/tests/unit/unit1323.c
index 65dd3d2..1adb274 100644
--- a/tests/unit/unit1323.c
+++ b/tests/unit/unit1323.c
@@ -49,8 +49,8 @@ UNITTEST_START
};
size_t i;
- for(i=0; i < sizeof(tests)/sizeof(tests[0]); i++) {
- time_t result = curlx_tvdiff(tests[i].first, tests[i].second);
+ for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
+ timediff_t result = Curl_timediff(tests[i].first, tests[i].second);
if(result != tests[i].result) {
printf("%d.%06u to %d.%06u got %d, but expected %d\n",
tests[i].first.tv_sec,
diff --git a/tests/unit/unit1395.c b/tests/unit/unit1395.c
index 13ea97b..527f281 100644
--- a/tests/unit/unit1395.c
+++ b/tests/unit/unit1395.c
@@ -43,7 +43,7 @@ struct dotdot {
UNITTEST_START
unsigned int i;
- int fails=0;
+ int fails = 0;
const struct dotdot pairs[] = {
{ "/a/b/c/./../../g", "/a/g" },
{ "mid/content=5/../6", "mid/6" },
@@ -74,7 +74,7 @@ UNITTEST_START
{ ".", "" },
};
- for(i=0; i < sizeof(pairs)/sizeof(pairs[0]); i++) {
+ for(i = 0; i < sizeof(pairs)/sizeof(pairs[0]); i++) {
char *out = Curl_dedotdotify(pairs[i].input);
abort_unless(out != NULL, "returned NULL!");
diff --git a/tests/unit/unit1396.c b/tests/unit/unit1396.c
index f3275fd..4dd25b4 100644
--- a/tests/unit/unit1396.c
+++ b/tests/unit/unit1396.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,13 +25,17 @@ static CURL *hnd;
static CURLcode unit_setup(void)
{
- return CURLE_OK;
+ int res = CURLE_OK;
+
+ global_init(CURL_GLOBAL_ALL);
+ return res;
}
static void unit_stop(void)
{
if(hnd)
curl_easy_cleanup(hnd);
+ curl_global_cleanup();
}
struct test {
@@ -77,7 +81,7 @@ UNITTEST_START
hnd = curl_easy_init();
abort_unless(hnd != NULL, "returned NULL!");
- for(i=0; list1[i].in; i++) {
+ for(i = 0; list1[i].in; i++) {
int outlen;
char *out = curl_easy_unescape(hnd,
list1[i].in, list1[i].inlen,
@@ -93,7 +97,7 @@ UNITTEST_START
curl_free(out);
}
- for(i=0; list2[i].in; i++) {
+ for(i = 0; list2[i].in; i++) {
int outlen;
char *out = curl_easy_escape(hnd, list2[i].in, list2[i].inlen);
abort_unless(out != NULL, "returned NULL!");
diff --git a/tests/unit/unit1398.c b/tests/unit/unit1398.c
index 9491c46..b726019 100644
--- a/tests/unit/unit1398.c
+++ b/tests/unit/unit1398.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,7 +30,7 @@ UNITTEST_START
int rc;
char buf[3] = {'b', 'u', 'g'};
-const char *str="bug";
+const char *str = "bug";
int width = 3;
char output[24];
diff --git a/tests/unit/unit1399.c b/tests/unit/unit1399.c
index 82e0dc2..897a343 100644
--- a/tests/unit/unit1399.c
+++ b/tests/unit/unit1399.c
@@ -36,6 +36,20 @@ static void unit_stop(void)
}
+/*
+ * Invoke Curl_pgrsTime for TIMER_STARTSINGLE to trigger the behavior that
+ * manages is_t_startransfer_set, but fake the t_startsingle time for purposes
+ * of the test.
+ */
+static void fake_t_startsingle_time(struct Curl_easy *data,
+ struct curltime fake_now,
+ int seconds_offset)
+{
+ Curl_pgrsTime(data, TIMER_STARTSINGLE);
+ data->progress.t_startsingle.tv_sec = fake_now.tv_sec + seconds_offset;
+ data->progress.t_startsingle.tv_usec = fake_now.tv_usec;
+}
+
static bool usec_matches_seconds(time_t time_usec, int expected_seconds)
{
int time_sec = (int)(time_usec / usec_magnitude);
@@ -46,55 +60,58 @@ static bool usec_matches_seconds(time_t time_usec, int expected_seconds)
return same;
}
+static void expect_timer_seconds(struct Curl_easy *data, int seconds)
+{
+ char msg[64];
+ snprintf(msg, sizeof(msg), "about %d seconds should have passed", seconds);
+ fail_unless(usec_matches_seconds(data->progress.t_nslookup, seconds), msg);
+ fail_unless(usec_matches_seconds(data->progress.t_connect, seconds), msg);
+ fail_unless(usec_matches_seconds(data->progress.t_appconnect, seconds), msg);
+ fail_unless(usec_matches_seconds(data->progress.t_pretransfer, seconds),
+ msg);
+ fail_unless(usec_matches_seconds(data->progress.t_starttransfer, seconds),
+ msg);
+}
+
+/* Scenario: simulate a redirect. When a redirect occurs, t_nslookup,
+ * t_connect, t_appconnect, t_pretransfer, and t_starttransfer are addative.
+ * E.g., if t_starttransfer took 2 seconds initially and took another 1
+ * second for the redirect request, then the resulting t_starttransfer should
+ * be 3 seconds. */
UNITTEST_START
struct Curl_easy data;
- struct curltime now = Curl_tvnow();
+ struct curltime now = Curl_now();
+ data.progress.t_nslookup = 0;
+ data.progress.t_connect = 0;
+ data.progress.t_appconnect = 0;
+ data.progress.t_pretransfer = 0;
data.progress.t_starttransfer = 0;
data.progress.t_redirect = 0;
-
- /*
- * Set the startsingle time to a second ago. This time is used by
- * Curl_pgrsTime to calculate how much time the events takes.
- * t_starttransfer should be updated to reflect the difference from this time
- * when `Curl_pgrsTime is invoked.
- */
- data.progress.t_startsingle.tv_sec = now.tv_sec - 1;
- data.progress.t_startsingle.tv_usec = now.tv_usec;
-
+ data.progress.start.tv_sec = now.tv_sec - 2;
+ data.progress.start.tv_usec = now.tv_usec;
+ fake_t_startsingle_time(&data, now, -2);
+
+ Curl_pgrsTime(&data, TIMER_NAMELOOKUP);
+ Curl_pgrsTime(&data, TIMER_CONNECT);
+ Curl_pgrsTime(&data, TIMER_APPCONNECT);
+ Curl_pgrsTime(&data, TIMER_PRETRANSFER);
Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
- fail_unless(usec_matches_seconds(data.progress.t_starttransfer, 1),
- "about 1 second should have passed");
-
- /*
- * Update the startsingle time to a second ago to simulate another second has
- * passed.
- * Now t_starttransfer should not be changed, as t_starttransfer has already
- * occurred and another invocation of `Curl_pgrsTime` for TIMER_STARTTRANSFER
- * is superfluous.
- */
- data.progress.t_startsingle.tv_sec = now.tv_sec - 2;
- data.progress.t_startsingle.tv_usec = now.tv_usec;
-
- Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
+ expect_timer_seconds(&data, 2);
- fail_unless(usec_matches_seconds(data.progress.t_starttransfer, 1),
- "about 1 second should have passed");
-
- /*
- * Simulate what happens after a redirect has occurred.
- *
- * Since the value of t_starttransfer is set to the value from the first
- * request, it should be updated when a transfer occurs such that
- * t_starttransfer is the starttransfer time of the redirect request.
- */
- data.progress.t_startsingle.tv_sec = now.tv_sec - 3;
- data.progress.t_startsingle.tv_usec = now.tv_usec;
+ /* now simulate the redirect */
data.progress.t_redirect = data.progress.t_starttransfer + 1;
-
+ fake_t_startsingle_time(&data, now, -1);
+
+ Curl_pgrsTime(&data, TIMER_NAMELOOKUP);
+ Curl_pgrsTime(&data, TIMER_CONNECT);
+ Curl_pgrsTime(&data, TIMER_APPCONNECT);
+ Curl_pgrsTime(&data, TIMER_PRETRANSFER);
+ /* ensure t_starttransfer is only set on the first invocation by attempting
+ * to set it twice */
+ Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
- fail_unless(usec_matches_seconds(data.progress.t_starttransfer, 3),
- "about 3 second should have passed");
+ expect_timer_seconds(&data, 3);
UNITTEST_STOP
diff --git a/tests/unit/unit1600.c b/tests/unit/unit1600.c
index 11d718d..190cf0f 100644
--- a/tests/unit/unit1600.c
+++ b/tests/unit/unit1600.c
@@ -28,13 +28,19 @@ static CURL *easy;
static CURLcode unit_setup(void)
{
+ int res = CURLE_OK;
+
+ global_init(CURL_GLOBAL_ALL);
easy = curl_easy_init();
- return easy ? CURLE_OK : CURLE_OUT_OF_MEMORY;
+ if(!easy)
+ return CURLE_OUT_OF_MEMORY;
+ return res;
}
static void unit_stop(void)
{
curl_easy_cleanup(easy);
+ curl_global_cleanup();
}
UNITTEST_START
diff --git a/tests/unit/unit1605.c b/tests/unit/unit1605.c
index 2fe3a5a..57a9199 100644
--- a/tests/unit/unit1605.c
+++ b/tests/unit/unit1605.c
@@ -23,21 +23,28 @@
#include "llist.h"
+static CURL *easy;
+
static CURLcode unit_setup(void)
{
- return CURLE_OK;
+ int res = CURLE_OK;
+
+ global_init(CURL_GLOBAL_ALL);
+ easy = curl_easy_init();
+ if(!easy)
+ return CURLE_OUT_OF_MEMORY;
+ return res;
}
static void unit_stop(void)
{
-
+ curl_easy_cleanup(easy);
+ curl_global_cleanup();
}
UNITTEST_START
int len;
char *esc;
- CURL *easy = curl_easy_init();
- abort_unless(easy, "out of memory");
esc = curl_easy_escape(easy, "", -1);
fail_unless(esc == NULL, "negative string length can't work");
@@ -45,6 +52,4 @@ UNITTEST_START
esc = curl_easy_unescape(easy, "%41%41%41%41", -1, &len);
fail_unless(esc == NULL, "negative string length can't work");
- curl_easy_cleanup(easy);
-
UNITTEST_STOP
diff --git a/tests/unit/unit1606.c b/tests/unit/unit1606.c
index eca8f3c..9da0b70 100644
--- a/tests/unit/unit1606.c
+++ b/tests/unit/unit1606.c
@@ -24,18 +24,26 @@
#include "speedcheck.h"
#include "urldata.h"
+static CURL *easy;
+
static CURLcode unit_setup(void)
{
- return CURLE_OK;
+ int res = CURLE_OK;
+
+ global_init(CURL_GLOBAL_ALL);
+ easy = curl_easy_init();
+ if(!easy)
+ return CURLE_OUT_OF_MEMORY;
+ return res;
}
static void unit_stop(void)
{
-
+ curl_easy_cleanup(easy);
+ curl_global_cleanup();
}
-static int runawhile(struct Curl_easy *easy,
- long time_limit,
+static int runawhile(long time_limit,
long speed_limit,
curl_off_t speed,
int dec)
@@ -66,25 +74,16 @@ static int runawhile(struct Curl_easy *easy,
}
UNITTEST_START
-{
- struct Curl_easy *easy = curl_easy_init();
- abort_unless(easy, "out of memory");
-
- fail_unless(runawhile(easy, 41, 41, 40, 0) == 41,
+ fail_unless(runawhile(41, 41, 40, 0) == 41,
"wrong low speed timeout");
- fail_unless(runawhile(easy, 21, 21, 20, 0) == 21,
+ fail_unless(runawhile(21, 21, 20, 0) == 21,
"wrong low speed timeout");
- fail_unless(runawhile(easy, 60, 60, 40, 0) == 60,
+ fail_unless(runawhile(60, 60, 40, 0) == 60,
"wrong log speed timeout");
- fail_unless(runawhile(easy, 50, 50, 40, 0) == 50,
+ fail_unless(runawhile(50, 50, 40, 0) == 50,
"wrong log speed timeout");
- fail_unless(runawhile(easy, 40, 40, 40, 0) == 99,
+ fail_unless(runawhile(40, 40, 40, 0) == 99,
"should not time out");
- fail_unless(runawhile(easy, 10, 50, 100, 2) == 36,
+ fail_unless(runawhile(10, 50, 100, 2) == 36,
"bad timeout");
-
- curl_easy_cleanup(easy);
-
- return 0;
-}
UNITTEST_STOP
diff --git a/winbuild/BUILD.WINDOWS.txt b/winbuild/BUILD.WINDOWS.txt
index 7b0d5ba..1840991 100644
--- a/winbuild/BUILD.WINDOWS.txt
+++ b/winbuild/BUILD.WINDOWS.txt
@@ -71,6 +71,7 @@ where <options> is one or many of:
Libraries can be fetched at http://windows.php.net/downloads/php-sdk/deps/
Uncompress them into the deps folder.
WITH_SSL=<dll or static> - Enable OpenSSL support, DLL or static
+ WITH_NGHTTP2=<dll or static> - Enable HTTP/2 support, DLL or static
WITH_MBEDTLS=<dll or static> - Enable mbedTLS support, DLL or static
WITH_CARES=<dll or static> - Enable c-ares support, DLL or static
WITH_ZLIB=<dll or static> - Enable zlib support, DLL or static
diff --git a/winbuild/MakefileBuild.vc b/winbuild/MakefileBuild.vc
index 36ad468..524926a 100644
--- a/winbuild/MakefileBuild.vc
+++ b/winbuild/MakefileBuild.vc
@@ -267,7 +267,7 @@ GEN_PDB = true
!IFDEF EMBED_MANIFEST
-MANIFESTTOOL = mt -manifest $(DIRDIST)\$(PROGRAM_NAME).manifest -outputresource:$(DIRDIST)\$(PROGRAM_NAME);1
+MANIFESTTOOL = mt -manifest $(DIRDIST)\bin\$(PROGRAM_NAME).manifest -outputresource:$(DIRDIST)\bin\$(PROGRAM_NAME);1
!ENDIF
# Runtime library configuration