diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..28424da2
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,6 @@
+# Auto detect text files and perform LF normalization
+# * text=auto
+*.c eol=crlf
+*.h eol=crlf
+Makefile.* eol=crlf
+wsock_trace eol=crlf
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..6b066eca
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,55 @@
+t
+*.map
+*.a
+*.tmp
+*.exe
+*.pdb
+*.dll
+*.exp
+*.lib
+*.mak
+*.obj
+*.BIN
+*.xz
+src/enum_proto.*
+src/.depend.*
+src/CLANG_obj/*
+src/Cygwin_obj/*
+src/Debug/*
+src/MSVC_obj/*
+src/MSVC_obj_x64/*
+src/MinGW_obj/*
+src/MingW-utils/*
+src/UpgradeLog.htm
+src/VC6_obj/*
+src/Watcom_obj/*
+src/rcp/*
+src/wsock_trace_mw.def
+src/wsock_trace_mw_x64.def
+src/wsock_trace_x64.def
+src/test/*
+src/geoip-gen*.c
+src/misc-stuff/*
+src/.vs/*
+src/Wsock-trace.VC.db
+src/Wsock-trace.vcxproj.user
+src/get_caller-notes.txt
+src/*.i
+src/Release/*
+src/Debug/*
+src/compile_lua_*bit.bat
+src/cyg-ver.c
+src/init.lua
+src/luac.out
+src/iso3166-countrycodes.txt
+src/libbacktrace/*
+cpp_filter.py
+asndrop.txt
+backup/*
+hosts
+wsock_trace.appveyor
+ws_trace.lck
+ws_trace.hnd
+ws_trace.hnd-journal
+doc/doxygen.log
+doc/output/
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..ebc0fb43
--- /dev/null
+++ b/README.md
@@ -0,0 +1,406 @@
+## Wsock-trace v. 0.3.5:
+
+[](https://ci.appveyor.com/project/gvanem/wsock-trace)
+
+A drop-in tracing library / DLL for most normal Winsock calls.
+It sits between your program and the Winsock library (`ws2_32.dll`).
+It works best for MSVC since the stack-walking code requires the program's
+**PDB** symbol-file to be present. And unfortunately MinGW/CygWin doesn't produce
+PDB-symbols (GNU-debugger instead relies on the archaic **BFD** library). So currently,
+the MinGW, CygWin and OpenWatcom targets will only show raw addresses for the traced
+functions.
+
+A MSVC example output from `c:\> ahost msdn.com` showing all the addresses of `msdn.com`
+(`ahost` is part of the DNS library **[C-ares](http://c-ares.haxx.se/)**):
+
+[]
+
+### Features
+
+* *Colourised trace* of the Winsock calls with function parameters and return
+ values. The colours are configurable.
+
+* *Runtime caller information*: Using Microsoft's *dbghelp* (or *psapi*) APIs
+ together with the programs *PDB*-file, the filename, line-number of the calling
+ function-name is shown. In the above example, [`WSAStartup()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms742213(v=vs.85).aspx)
+ is called from `ahost.c`, line 67. Which should be 59 bytes into the `main()` function.
+ This should be **[here](https://github.com/c-ares/c-ares/blob/master/ahost.c#L67)**.
+
+* *Precise Timestamps*: All trace-lines starts with a precise timestamp obtained
+ from [`QueryPerformanceCounter()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx).
+ The timestamp is controlled by `trace_time` in the
+ [`wsock_trace`](https://github.com/gvanem/wsock-trace/blob/master/wsock_trace#L31)
+ config-file.
+
+* *Extension functions*: Winsock has several Microsoft-specific extension functions
+ (like [`AcceptEx()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms737524.aspx)
+ and [`ConnectEx()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms737606.aspx)).
+ Wsock-trace is able to trace these too.
+
+* *IP-Country* information thanks to the **[MaxMind](http://www.maxmind.com)** Lite databases.
+ Thanks to the **[Tor-project](https://gitweb.torproject.org/tor.git/plain/src/config/)**
+ for a simplified CSV version of these MaxMind GeoIP-databases.
+ (using the CSV files [`geoip`](https://github.com/gvanem/wsock-trace/blob/master/wsock_trace#L161)
+ and [`geoip6`](https://github.com/gvanem/wsock-trace/blob/master/wsock_trace#L162)
+ are always enabled).
+
+* *IP-Location* information (City and Region) from **[IP2Location](https://github.com/chrislim2888/IP2Location-C-Library)**.
+ The above `Mountain View/California` is Google's well-known location. Many thanks to IP2Location
+ [**[3]**](#footnotes) for their data-bases.
+
+* *Domain Name System-based Blackhole List*
+ (**[DNSBL](https://en.wikipedia.org/wiki/DNSBL)**) support: with the help of
+ DROP-files from the **[Spamhaus](http://www.spamhaus.org/drop/)** project,
+ it can detect IPv4 / IPv6-addresses uses by spammers and cyber-criminals.
+ The more potent Spamhaus **[BGPf / BCL](https://www.spamhaus.org/bgpf/)** is on the *to-do* list.
+
+* *Slowdown*; For testing *too fast programs*, all receive, transmit, `select()` and `WSAPoll()`
+ calls can be delayed a number of milli-seconds. E.g. slowing down a `recv()` call is
+ controlled by `recv_delay = 0` in [`wsock_trace`](https://github.com/gvanem/wsock-trace/blob/master/wsock_trace#L66)
+ config-file.
+
+* *Firewall* activity; report activity causing events from the *Window Filtering Platform* (the *Internet Connection Firewall*; ICF). See below.
+
+* **[LuaJIT](https://github.com/LuaJIT/LuaJIT.git)** script support is very
+ preliminary at the moment. The idea is that `.lua` scripts could change the
+ behaviour of Wsock-trace at runtime without rebuilding it.
+ Only the absolute minimum of the needed files are in
+ **[./LuaJit](https://github.com/gvanem/wsock-trace/tree/master/LuaJIT)**.
+ Goto **[here](https://github.com/LuaJIT/LuaJIT.git)** for the complete LuaJIT.
+
+
+### Installation
+
+The following assumes you will install this package in `c:\prog\wsock_trace`.
+To clone this repository, do this in an **empty** `c:\prog\wsock_trace` directory:
+* `c:\prog\wsock_trace> git clone https://github.com/gvanem/wsock-trace.git .`
+
+To be able to get more precise Geo-IP information for addresses (city and region), Wsock-trace
+will use a IP2Location LITE [**database**](http://lite.ip2location.com). To make best use of it,
+do this:
+ * Sign-up for an [**account**](https://lite.ip2location.com/sign-up) and download a free
+ IP2Location LITE [**database**](https://lite.ip2location.com/database/ip-country-region-city).
+ Or in case you have an account, go [**here**](https://lite.ip2location.com/file-download).
+ * Download and use a file named like `IP2LOCATION-LITE-DBx.IPV6.BIN`.
+ Such a file contains both IPv4 and IPv6 records.
+ * Copy `IP2LOCATION-LITE-DBx.IPV6.BIN` into your `%APPDATA%` directory and edit the keyword in
+ the `[geoip]` section to read:
+ `ip2location_bin_file = %APPDATA%\IP2LOCATION-LITE-DBx.IPV6.BIN`
+
+*Note*: [**IP2Location-C-Library**](https://github.com/chrislim2888/IP2Location-C-Library.git)
+ is no longer used as a submodule (since I've made several local changes to it). It has been
+ merged into `src/ip2loc.c` and simplified.
+
+### Building
+
+Enter the `src` sub-directory and do the respective *make* `all`command.
+If the `all` command succeeded, you can do the respective *make* `install` command:
+
+| Builder | *make* `all`command | *make* `install` result |
+| :--------- | :--- | :--- |
+| CygWin | make -f Makefile.CygWin | `cp wsock_trace_cyg.dll` to `/usr/bin` and
`cp libwsock_trace_cyg.a` to `/usr/lib` |
+| MinGW32 | make -f Makefile.MinGW | `cp wsock_trace_mw.dll` to `$(MINGW32)/bin` and
`cp libwsock_trace_mw.a` to `$(MINGW32)/lib`|
+| MSVC | nmake -f makefile.vc6 | `copy wsock_trace.dll` to `%VCINSTALLDIR%\bin` and
`copy wsock_trace.lib` to `%VCINSTALLDIR%\lib` |
+| OpenWatcom | wmake -f Makefile.Watcom | `copy wsock_trace_ow.dll` to `%WATCOM\binnt` and
`copy wsock_trace_ow.lib` to `%WATCOM\lib386\nt`|
+
+
+### Usage
+
+Link with one of these libraries (instead of the default `libws32_2.a` or `ws2_32.lib`):
+
+| Builder | Library |
+| :--------- | :------ |
+| CygWin | `libwsock_trace.a` |
+| MinGW | `libwsock_trace.a` |
+| MSVC | `wsock_trace.lib` |
+| OpenWatcom | `wsock_trace_ow.lib` |
+
+Thus most normal Winsock calls are traced on entry and exit.
+
+Example screen-shot above or details in **[Running samples](#running-samples)** below.
+
+**MSVC**: Remember to compile using [`-Zi`](https://docs.microsoft.com/en-gb/cpp/build/reference/z7-zi-zi-debug-information-format)
+ to produce debug-symbols. For MSVC-2015 (or newer) it is recomended to use option
+ [`-Zo`](https://docs.microsoft.com/en-gb/cpp/build/reference/zo-enhance-optimized-debugging)
+ too (which will eases the debug of optimised code. And remember to use `-debug` when linking your program.
+ See [`src/Makefile.vc6`](https://github.com/gvanem/wsock-trace/blob/master/src/Makefile.vc6) for an example.
+ It is not adviced to use option [`-Oy`](https://docs.microsoft.com/en-gb/cpp/build/reference/oy-frame-pointer-omission)
+ (*enable frame pointer omission*) since that will make it difficult for [`StackWalk64()`](http://msdn.microsoft.com/library/en-us/debug/base/stackwalk64.asp)
+ to figure out the filename and line of the calling function.
+
+
+### Configuration
+
+The trace-level and other settings are controlled by a config-file
+`wsock_trace`. This file is searched along these places until found:
+ * The file pointed to by `%WSOCK_TRACE`.
+ * The current directory.
+ * The `%HOME` directory.
+ * Then finally the `%APPDATA` directory.
+
+`wsock_trace` is read in **[init.c](https://github.com/gvanem/wsock-trace/blob/master/src/init.c)**
+at startup. Read it's contents; the comments therein should be self-explanatory.
+If `wsock_trace` is not found in one of the above directories, the default
+`trace_level` is set to 1.
+
+There is currently no `install.bat` file for Wsock-trace. So you should copy the following files (here at GitHub) to your
+`%HOME` or `%APPDATA` directory:
+```
+ wsock_trace
+ geoip
+ geoip6
+ drop.txt
+ edrop.txt
+ dropv6.txt
+```
+
+These environment variables are on the form:
+ * `:\Documents and Settings\\ProgramData`. (Win-XP)
+ * `:\Users\\AppData\Roaming`. (Win-Vista+)
+
+Since it's a confusing subject what a program's configuration directory should be,
+it's best to define a `%HOME%` to point to the excact place for such config-files.
+
+### Running samples
+
+Example output from `src/test.exe` (built with MSVC):
+ ```c
+ * ws_trace/test.c(45) (main+50): WSAStartup (2.2) --> No error.
+ * ws_trace/test.c(24) (do_wsock_tests+125): gethostbyaddr (127.0.0.1, 4, AF_INET) --> 0x003C8780.
+ * ws_trace/test.c(27) (do_wsock_tests+150): gethostbyaddr (0.0.0.0, 4, AF_INET) --> 0x003C8780.
+ * ws_trace/test.c(29) (do_wsock_tests+164): gethostbyaddr (::1, 16, AF_INET6) --> 0x003C8780.
+ * ws_trace/test.c(31) (do_wsock_tests+175): gethostbyname (localhost) --> 0x003C8780.
+ * ws_trace/test.c(31) (do_wsock_tests+187): socket (AF_INET, SOCK_STREAM, 0) --> 1724.
+ * ws_trace/test.c(33) (do_wsock_tests+196): WSAGetLastError() --> No error.
+ * ws_trace/test.c(36) (do_wsock_tests+343): select (n=0-1724, rd, NULL, NULL, {tv=1.000001s}) --> No error.
+ * ws_trace/test.c(37) (do_wsock_tests+358): FD_ISSET (1724, fd) --> 0.
+ * ws_trace/test.c(47) (main+61): WSACleanup() --> No error.
+ ^ ^ ^ ^
+ | | | |___ The traced Winsock function and the result.
+ | | |
+ | | |____ The calling function with displacement (i.e. offset from
+ | | (nearest public symbol).
+ | |_____ Line number in src-file.
+ |
+ |____ Source-file relative of the application.
+
+ ```
+
+Here is a more realistic and useful example with `wsock_trace.lib` linked to
+Nmap [**[1]**](#footnotes):
+```c
+ c:\> nmap -sT -P0 -p23,80 10.0.0.1
+ * mswin32/winfix.cc(134) (win_pre_init+68): WSAStartup (2.2) --> No error.
+
+ Starting Nmap 6.02 ( http://nmap.org ) at 2012-07-24 12:48 CET
+ * g:/vc_2010/sdk/include/wspiapi.h(1011) (WspiapiGetAddrInfo+79): WSASetLastError (0).
+ * g:/vc_2010/sdk/include/wspiapi.h(1011) (WspiapiGetAddrInfo+79): WSASetLastError (0).
+ * g:/vc_2010/sdk/include/wspiapi.h(1011) (WspiapiGetAddrInfo+79): WSASetLastError (0).
+ * g:/vc_2010/sdk/include/wspiapi.h(1011) (WspiapiGetAddrInfo+79): WSASetLastError (0).
+ * g:/vc_2010/sdk/include/wspiapi.h(1011) (WspiapiGetAddrInfo+79): WSASetLastError (0).
+ * g:/vc_2010/sdk/include/wspiapi.h(1011) (WspiapiGetAddrInfo+79): WSASetLastError (0).
+ * scan_engine.cc(3002) (sendConnectScanProbe+266): socket (AF_INET, SOCK_STREAM, 6) --> 1780.
+ * nbase/nbase_misc.c(261) (unblock_socket+65): ioctlsocket (1780, FIONBIO, 1) --> No error.
+ * scan_engine.cc(2964) (init_socket+82): setsockopt (1780, SOL_SOCKET, SO_LINGER, 1, 4) --> No error.
+ * libnetutil/netutil.cc(856) (set_ttl+34): setsockopt (1780, IPPROTO_IP, IP_TTL, ULONG_MAX, 4) --> WSAEINVAL: Invalid arguments (10022).
+ * scan_engine.cc(3021) (sendConnectScanProbe+599): connect (1780, 10.0.0.1:23) --> WSAEWOULDBLOCK: Call would block (10035).
+ * nbase/nbase_misc.c(133) (socket_errno+12): WSAGetLastError() --> WSAEWOULDBLOCK: Call would block (10035).
+ * scan_engine.cc(922) (ConnectScanInfo::watchSD+82): FD_ISSET (1780, fd) --> 0.
+ * scan_engine.cc(3002) (sendConnectScanProbe+266): socket (AF_INET, SOCK_STREAM, 6) --> 1720.
+ * nbase/nbase_misc.c(261) (unblock_socket+65): ioctlsocket (1720, FIONBIO, 1) --> No error.
+ * scan_engine.cc(2964) (init_socket+82): setsockopt (1720, SOL_SOCKET, SO_LINGER, 1, 4) --> No error.
+ * libnetutil/netutil.cc(856) (set_ttl+34): setsockopt (1720, IPPROTO_IP, IP_TTL, ULONG_MAX, 4) --> WSAEINVAL: Invalid arguments (10022).
+ * scan_engine.cc(3021) (sendConnectScanProbe+599): connect (1720, 10.0.0.1:80) --> WSAEWOULDBLOCK: Call would block (10035).
+ * nbase/nbase_misc.c(133) (socket_errno+12): WSAGetLastError() --> WSAEWOULDBLOCK: Call would block (10035).
+ * scan_engine.cc(922) (ConnectScanInfo::watchSD+82): FD_ISSET (1720, fd) --> 0.
+ * scan_engine.cc(3964) (do_one_select_round+473): select (n=0-1780, rd, wr, ex, {tv=0.985000s}) --> 3.
+ * nbase/nbase_misc.c(133) (socket_errno+12): WSAGetLastError() --> WSAEWOULDBLOCK: Call would block (10035).
+ * scan_engine.cc(4015) (do_one_select_round+1894): FD_ISSET (1720, fd) --> 0.
+ * scan_engine.cc(4015) (do_one_select_round+1917): FD_ISSET (1720, fd) --> 1.
+ * scan_engine.cc(4019) (do_one_select_round+2012): getsockopt (1720, SOL_SOCKET, SO_ERROR, 0, 4) --> No error.
+ * scan_engine.cc(938) (ConnectScanInfo::clearSD+82): FD_ISSET (1720, fd) --> 1.
+ * scan_engine.cc(789) (ConnectProbe::~ConnectProbe+37): closesocket (1720) --> No error.
+ * scan_engine.cc(4015) (do_one_select_round+1894): FD_ISSET (1780, fd) --> 1.
+ * scan_engine.cc(4019) (do_one_select_round+2012): getsockopt (1780, SOL_SOCKET, SO_ERROR, 0, 4) --> No error.
+ * scan_engine.cc(938) (ConnectScanInfo::clearSD+82): FD_ISSET (1780, fd) --> 1.
+ * scan_engine.cc(789) (ConnectProbe::~ConnectProbe+37): closesocket (1780) --> No error.
+ Nmap scan report for router (10.0.0.1)
+ Host is up (0.0019s latency).
+ PORT STATE SERVICE
+ 23/tcp open telnet
+ 80/tcp open http
+
+ Nmap done: 1 IP address (1 host up) scanned in 7.61 seconds
+ * mswin32/winfix.cc(290) (win_cleanup+12): WSACleanup() --> No error.
+```
+
+Notes:
+* Nmap uses wrong arguments to [`setsockopt()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms740476(v=vs.85).aspx);
+ a *TTL* of *ULONG_MAX*.
+* Nmap also calls [`WSAStartup()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms742213(v=vs.85).aspx)
+ before the startup message.
+* Last but not least, notice how Wsock-trace handles (demangles) C++ symbols just
+ fine thanks to `dbghelp.dll` and [`UnDecorateSymbolName()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms681400(v=vs.85).aspx).
+ I.e. the destructor `ConnectProbe::~ConnectProbe` above is calling [`closesocket()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms737582(v=vs.85).aspx)
+ at offset 37. (you can turn off C++ demangling by `cpp_demangle = 0` in the `wsock_trace` config-file).
+
+
+And another example from [**C-ares**](https://github.com/c-ares/c-ares)'s
+**[adig.c](https://github.com/c-ares/c-ares/blob/master/adig.c)**:
+```c
+ c:\> adig -t PTR 89.42.216.144
+ * adig.c(216) (main+105): WSAStartup (2.2) --> No error.
+ * ares_process.c(1065) (open_udp_socket+248): socket (AF_INET, SOCK_DGRAM, 0) --> 1604.
+ * ares_process.c(857) (setsocknonblock+61): ioctlsocket (1604, FIONBIO, 1) --> No error.
+ * ares_process.c(1077) (open_udp_socket+345): connect (1604, 8.8.8.8:53) --> No error.
+ * ares_process.c(791) (ares__send_query+484): send (1604, 0x00034BDA, 31, 0) --> 31 bytes tx.
+ * adig.c(397) (main+1780): select (n=0-1604, rd, wr, NULL, {tv=3.109000s}) --> 1.
+ * ares_process.c(456) (read_udp_packets+146): FD_ISSET (1604, fd) --> 1.
+ * ares_process.c(485) (read_udp_packets+413): recvfrom (1604, 0x0013F894, 513, 0, 8.8.8.8:53) --> 106 bytes rx.
+ Domain name not found
+ id: 58187
+ flags: qr rd ra
+ opcode: QUERY
+ rcode: NXDOMAIN
+ Questions:
+ 89.42.216.144 . PTR
+ Answers:
+ NS records:
+ . 1413 SOA a.root-servers.net.
+ nstld.verisign-grs.com.
+ ( 2012072400 1800 900 604800 86400 )
+ Additional records:
+ * ares__close_sockets.c(63) (ares__close_sockets+408): closesocket (1604) --> No error.
+ * adig.c(411) (main+1894): WSACleanup() --> No error.
+```
+
+By default, the tracing of `htons()`,`htonl()`, `ntohs()` and `ntohl()` are
+excluded from the trace.
+You can edit the `%HOME/wsock_trace` config-file and exclude whatever calls you like.
+And the 2 traces above is showing the effect of the config-value `compact = 1`.
+
+A more eleborated example from 2 **[OpenVPN](https://openvpn.net/)** programs; a client and a
+server running a simple test (in OpenVPN's root-dir). Started with the `vpn.bat` snippet:
+```
+cd sample
+start /pos=200,50,1000,800 ..\openvpn.exe --config sample-config-files/loopback-server
+start /pos=800,150,1000,1000 ..\openvpn.exe --config sample-config-files/loopback-client
+```
+[](screenshot-openvpn-tmb.jpg?raw=true):
+
+A **[Larger](http://www.watt-32.net/misc/screenshot-openvpn.png)** version.
+
+### Firewall Monitor
+
+The `firewall_test.exe` program show a screen like:
+[](screenshot_firewall_test_DNSBL.png?raw=true)
+
+Together with `[DNSBL], enable = 1` it shows remote addresses in **[SpamHaus](https://www.spamhaus.org/sbl/)** DROP-lists.
+In this case the **[address](https://blackhat.directory/ip/176.119.4.53)** `176.119.4.56`
+in *Ukraine / Donetsk* is *very* active giving a Firewall event approximately every 5 minutes.
+
+A good test of the `firewall.c` features is to open your WiFi FireWall and start a remote
+**[port-scan](http://www.whatsmyip.org/port-scanner/server/)** while `firewall_test.exe`
+is running. You'll see a lot of **DROP**-events like:
+```
+6.700 sec: FWPM_NET_EVENT_TYPE_CLASSIFY_DROP, IN, IPPROTO_TCP
+ layer: (13) Inbound Transport v4 Discard-layer
+ filter: (277599) Filter to prevent port-scanning
+ addr: 204.11.35.98 -> 10.0.0.10, ports: 21 (ftp) / 52115
+ country: United States, Troy/Michigan
+```
+
+### Implementation notes
+
+The names of the import libraries and the names of the 32-bit .DLLs are:
+ * For MSVC: `wsock_trace.lib` and `wsock_trace.dll` .
+ * For MinGW: `libwsock_trace.a` and `wsock_trace_mw.dll` .
+ * For CygWin32: `libwsock_trace.a` and `wsock_trace_cyg.dll`.
+ * For OpenWatcom: `wsock_trace_ow.lib` and `wsock_trace_ow.dll`.
+
+And the 64-bit equivalents:
+ * For MSVC: `wsock_trace_x64.lib` and `wsock_trace_x64.dll` .
+ * For MinGW: `libwsock_trace_x64.a` and `wsock_trace_mw_x64.dll` .
+ * For CygWin64: `libwsock_trace_x64.a` and `wsock_trace_cyg_x64.dll`.
+ * For OpenWatcom: not possible (AFAIK there is no way to create `x64` programs on OpenWatcom).
+
+These DLLs off-course needs to be in current directory or on `%PATH`. The reason
+I've chosen to make it a DLL and not a static-lib is that applications
+using `wsock_trace.lib` needs not to be re-linked when I do change the inner
+workings of the Wsock-trace source code.
+As long as the ABI is stable (e.g. not adding new functions to the
+[`wsock_trace.def`](https://github.com/gvanem/wsock-trace/blob/master/src/wsock_trace.def)
+file), the application using `wsock_trace.dll` should work the same.
+
+Note that some virus scanners may find the behaviour of programs linked to
+`wsock_trace.lib` suspicious.
+
+### Future plans:
+
+ 1. Get the decoding of calling function, file-name and lines in the MinGW/CygWin
+ ports working.
+
+ 2. Lua-script integration; use a `*.lua` file to exclude/include processes and/or
+ functions to trace.
+
+ 3. Injecting `wsock_trace.dll` into a remote process. Ref:
+ [**http://www.viksoe.dk/code/wepmetering.htm**](http://www.viksoe.dk/code/wepmetering.htm).
+
+ 4. Optionally load [**Wireshark's**](https://www.wireshark.org) `libwireshark.dll` to dissect
+ transport and application protocols.
+ Do it for selected processes only.
+
+ 5. Deny certain applications to use `AF_INET6` protocols (return `-1` on
+ `socket(AF_INET6,...)`).
+
+ 6. Make it possible to switch network stacks at run-time:
+ select amongst Winsock2, **[lwIP](http://savannah.nongnu.org/projects/lwip/)**,
+ **[SwsSock](http://www.softsystem.co.uk/products/swssock.htm)** and/or
+ **[Cyclone TCP](http://www.oryx-embedded.com/cyclone_tcp.html)**.
+
+ 7. Make a GUI trace viewer for it. Ref:
+ [**http://www.viksoe.dk/code/windowless1.htm**](http://www.viksoe.dk/code/windowless1.htm)
+
+ 8. Add a Json type config feature to support the above features. E.g.:
+ ```
+ wireshark_dissect {
+ wget.exe : 1 # Wireshark dissection in wget and curl only.
+ curl.exe : 1
+ }
+
+ exclude_trace {
+ select: [curl.exe, wget.exe] # Exclude trace of `select()` and `inet_ntoa()` in curl/wget.
+ inet_ntoa: [curl.exe, wget.exe]
+ htons: [ * ] # Exclude trace of `htons` globally.
+ }
+
+ deny_ipv6 {
+ pycurl.pyd : 1 # Deny AF_INET6 sockets in scripts using the PyCurl module.
+ python27.dll : 1 # And in other Python scripts too.
+
+ }
+
+ stack_mux {
+ use_lwip: [wget.2exe, curl.exe] # Force wget2.exe and curl.exe to use lwIP.dll
+ }
+ ```
+
+-------------
+
+G. Vanem ```` 2013 - 2020.
+
+### Footnotes:
+
+ * [1] Nmap; "*Network Mapper*" is a free and open source (license) utility for
+ network discovery and security auditing.
+ Ref. [**http://nmap.org/download.html**](http://nmap.org/download.html)
+
+ * [2] A C library for asynchronous DNS requests (including name resolves)
+ Ref. [**http://c-ares.haxx.se/**](http://c-ares.haxx.se/)
+
+ * [3] This product includes IP2Location LITE data available from
+ [**http://lite.ip2location.com**](http://lite.ip2location.com).
+
+*PS*. This file is written with the aid of the **[Atom](https://atom.io/)**
+ editor and it's **[Markdown-Preview](https://atom.io/packages/markdown-preview)**.
+ A real time-saver.
diff --git a/appveyor-script.bat b/appveyor-script.bat
new file mode 100644
index 00000000..68962b1d
--- /dev/null
+++ b/appveyor-script.bat
@@ -0,0 +1,112 @@
+::
+:: This .bat is currently called from 'appveyor.yml' at the
+:: 'build_script:' stage and then with the 'init' argument.
+:: The 'clean' argument is only meant to be used when running
+:: this .bat file locally.
+
+@echo off
+
+if %1. == init. goto init
+if %1. == clean. goto clean
+
+echo Usage: %0 "init / clean"
+exit /b 1
+
+:init
+::
+:: The "CPU" and "BUILDER" agnostic init-stage.
+::
+echo Generating %CD%\wsock_trace.appveyor...
+echo # > wsock_trace.appveyor
+echo # This file was generated from %0. >> wsock_trace.appveyor
+echo # >> wsock_trace.appveyor
+echo [core] >> wsock_trace.appveyor
+echo trace_level = %%WSOCK_TRACE_LEVEL%% >> wsock_trace.appveyor
+echo trace_indent = 2 >> wsock_trace.appveyor
+echo trace_caller = 1 >> wsock_trace.appveyor
+echo trace_report = %%WSOCK_TRACE_LEVEL%% >> wsock_trace.appveyor
+echo trace_time = relative >> wsock_trace.appveyor
+echo trace_max_len = %%COLUMNS%% >> wsock_trace.appveyor
+echo callee_level = 1 >> wsock_trace.appveyor
+echo cpp_demangle = 1 >> wsock_trace.appveyor
+echo short_errors = 1 >> wsock_trace.appveyor
+echo use_full_path = 1 >> wsock_trace.appveyor
+echo use_toolhlp32 = 1 >> wsock_trace.appveyor
+echo dump_modules = 0 >> wsock_trace.appveyor
+echo dump_select = 1 >> wsock_trace.appveyor
+echo dump_hostent = 1 >> wsock_trace.appveyor
+echo dump_protoent = 1 >> wsock_trace.appveyor
+echo dump_servent = 1 >> wsock_trace.appveyor
+echo dump_nameinfo = 1 >> wsock_trace.appveyor
+echo dump_wsaprotocol_info = 1 >> wsock_trace.appveyor
+echo dump_wsanetwork_events = 1 >> wsock_trace.appveyor
+echo dump_data = 1 >> wsock_trace.appveyor
+echo max_data = 5000 >> wsock_trace.appveyor
+echo max_displacement = 1000 >> wsock_trace.appveyor
+echo exclude = htons,htonl,inet_addr >> wsock_trace.appveyor
+echo hosts_file = %CD%\appveyor-hosts >> wsock_trace.appveyor
+echo use_winhttp = 0 >> wsock_trace.appveyor
+echo [geoip] >> wsock_trace.appveyor
+echo enable = 1 >> wsock_trace.appveyor
+echo use_generated = 0 >> wsock_trace.appveyor
+echo max_days = 10 >> wsock_trace.appveyor
+echo geoip4_file = %CD%\geoip >> wsock_trace.appveyor
+echo geoip6_file = %CD%\geoip6 >> wsock_trace.appveyor
+echo ip2location_bin_file = %CD%\IP46-COUNTRY.BIN >> wsock_trace.appveyor
+echo [idna] >> wsock_trace.appveyor
+echo enable = 1 >> wsock_trace.appveyor
+echo [lua] >> wsock_trace.appveyor
+echo enable = %%WSOCK_LUA_ENABLE%% >> wsock_trace.appveyor
+echo trace_level = 1 >> wsock_trace.appveyor
+echo lua_init = %CD%\src\wsock_trace_init.lua >> wsock_trace.appveyor
+echo lua_exit = %CD%\src\wsock_trace_exit.lua >> wsock_trace.appveyor
+echo [dnsbl] >> wsock_trace.appveyor
+echo enable = 1 >> wsock_trace.appveyor
+echo test = %%WSOCK_DNSBL_TEST%% >> wsock_trace.appveyor
+echo max_days = 1 >> wsock_trace.appveyor
+echo drop_file = %CD%\drop.txt >> wsock_trace.appveyor
+echo edrop_file = %CD%\edrop.txt >> wsock_trace.appveyor
+echo dropv6_file = %CD%\dropv6.txt >> wsock_trace.appveyor
+echo drop_url = http://www.spamhaus.org/drop/drop.txt >> wsock_trace.appveyor
+echo edrop_url = http://www.spamhaus.org/drop/edrop.txt >> wsock_trace.appveyor
+echo dropv6_url = http://www.spamhaus.org/drop/dropv6.txt >> wsock_trace.appveyor
+echo [firewall] >> wsock_trace.appveyor
+echo enable = 0 >> wsock_trace.appveyor
+echo show_ipv4 = 1 >> wsock_trace.appveyor
+echo show_ipv6 = 0 >> wsock_trace.appveyor
+echo show_all = 0 >> wsock_trace.appveyor
+echo api_level = 3 >> wsock_trace.appveyor
+
+::
+:: Windows-Defender thinks generating a 'hosts' file is suspicious.
+:: Even generating 'appveyor-hosts' triggers Windows-Defender.
+:: Therefore generate it by the 'type' command below.
+::
+:: Ref:
+:: https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?name=Trojan%3aBAT%2fQhost!gen&threatid=2147649092
+::
+echo Generating appveyor-hosts file...
+type appveyor_hosts_content.txt > appveyor-hosts
+
+::
+:: These should survive until 'build_script' for 'msvc', 'mingw', 'cygwin', or 'watcom' get to run.
+::
+set WSOCK_TRACE=%CD%\wsock_trace.appveyor
+set WSOCK_TRACE_LEVEL=2
+set COLUMNS=120
+
+::
+:: Some issue with the Cygwin builds forces me to put the generated
+:: 'wsock_trace.appveyor' in AppVeyor's %APPDATA% directory.
+::
+copy wsock_trace.appveyor c:\Users\appveyor\AppData\Roaming\wsock_trace > NUL
+exit /b 0
+
+::
+:: Cleanup after a local 'appveyor-script '.
+:: This is not used by AppVeyor itself (not refered in appveyor.yml).
+::
+:clean
+del /Q IP46-COUNTRY.BIN xz.exe wsock_trace.appveyor appveyor-hosts watcom20.zip 2> NUL
+echo Cleaning done.
+exit /b 0
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 00000000..44945496
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,160 @@
+version: 1.0.{build}
+
+#
+# Skipping commits affecting these files.
+#
+skip_commits:
+ files:
+ - '**/*.md'
+ - '**/*.png'
+ - '**/*.jpg'
+
+environment:
+ global:
+ CL: -nologo -MP
+ matrix:
+ - BUILDER: msvc
+ CPU: x86
+ - BUILDER: msvc
+ CPU: x64
+ - BUILDER: mingw
+ CPU: x86
+ - BUILDER: mingw
+ CPU: x64
+ - BUILDER: cygwin
+ CPU: x86
+ - BUILDER: cygwin
+ CPU: x64
+ - BUILDER: watcom
+ CPU: x86
+
+matrix:
+ #
+ # Immediately finish build if one of the above jobs fails.
+ #
+ fast_finish: true
+ allow_failures:
+ - BUILDER: watcom
+ - BUILDER: cygwin
+
+#
+# todo: Get better version string.
+#
+cache:
+ - wsock-trace-%APPVEYOR_BUILD_NUMBER%
+
+before_build:
+ #
+ # clone the submodules.
+ #
+ - cmd: git submodule update --init --recursive
+
+ #
+ # Download IP2Location Database (with IPv4+IP6 addresses) and decompress using '7z'.
+ #
+ - cmd: curl -O -# http://www.watt-32.net/CI/IP46-COUNTRY.BIN.xz
+ - cmd: 7z x IP46-COUNTRY.BIN.xz > NUL
+
+install:
+ #
+ # Add a few locations to our PATH.
+ # And setup the compiler environment for Watcom
+ # (it seems it cannot be done in 'appveyor-script.bat init')
+ #
+ - cmd: set WATCOM=%APPVEYOR_BUILD_FOLDER%\watcom
+ - cmd: set PATH=%APPVEYOR_BUILD_FOLDER%\src;%WATCOM%\binnt;%PATH%
+ - cmd: set NT_INCLUDE=%WATCOM%\h;%WATCOM%\h\nt
+ - cmd: set DISABLEDELAYEDEXPANSION=0
+ - cmd: set CYGWIN_OPT=-qgnNdOA -l c:\cygwin\var\cache\setup -R c:\cygwin -s http://cygwin.mirror.constant.com
+
+ #
+ # Set compiler environment for MSVC first.
+ #
+ - cmd: if %BUILDER%-%CPU%. == msvc-x86. call "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86
+ - cmd: if %BUILDER%-%CPU%. == msvc-x64. call "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
+ - cmd: if %BUILDER%-%CPU%. == mingw-x86. set PATH=c:\msys64\MinGW32\bin;c:\msys64\usr\bin;%PATH%
+ - cmd: if %BUILDER%-%CPU%. == mingw-x64. set PATH=c:\msys64\MinGW64\bin;c:\msys64\usr\bin;%PATH%
+ - cmd: if %BUILDER%-%CPU%. == cygwin-x86. c:\cygwin\setup-x86.exe %CYGWIN_OPT% & set PATH=c:\cygwin\bin;c:\msys64\usr\bin;%PATH%
+ - cmd: if %BUILDER%-%CPU%. == cygwin-x64. set PATH=c:\msys64\usr\bin;%PATH%
+
+build_script:
+ - cmd: appveyor-script.bat init
+
+ #
+ # Download and extract OpenWatcom 2.0 using 'curl'
+ #
+ - cmd: if %BUILDER%. == watcom. (
+ curl -O -# http://www.watt-32.net/CI/watcom20.zip &
+ 7z x -o%WATCOM% watcom20.zip > NUL)
+
+ - cmd: cd %APPVEYOR_BUILD_FOLDER%\src
+ - cmd: set USE_LUA=1
+ - cmd: set USE_IP2LOCATION=1
+ - cmd: set PLATFORM=%CPU%
+ - cmd: set CYGWIN=nodosfilewarning
+
+ - cmd: if %BUILDER%. == msvc. nmake -nologo -f Makefile.vc6
+ - cmd: if %BUILDER%. == mingw. make -f Makefile.MinGW CPU=%CPU% USE_CRT_DEBUG=0
+ - cmd: if %BUILDER%. == cygwin. make -f Makefile.CygWin CPU=%CPU% USE_CRT_DEBUG=0
+ - cmd: if %BUILDER%. == watcom. wmake -h -f Makefile.Watcom CPU=%CPU%
+
+test_script:
+ - cmd: set WSOCK_TRACE_LEVEL=1 & test.exe
+ - cmd: set WSOCK_TRACE_LEVEL=0 & chcp 865 & idna.exe www.seoghør.no
+ - cmd: set WSOCK_TRACE_LEVEL=0 & idna.exe -c1252 -w www.seoghør.no
+ - cmd: set WSOCK_TRACE_LEVEL=0 & geoip-test.bat --ip2loc_4
+ - cmd: set WSOCK_TRACE_LEVEL=0 & geoip-test.bat --ip2loc_6
+ - cmd: set WSOCK_TRACE_LEVEL=1 & set WSOCK_LUA_ENABLE=1 & test.exe WSAStartup WSACleanup
+ - cmd: set WSOCK_TRACE_LEVEL=1 & set WSOCK_LUA_ENABLE=0 & set WSOCK_DNSBL_TEST=1 & test.exe WSAStartup WSACleanup
+
+#
+# Create a %ZIP_FILE% of the files needed to run the produced .exe-files (no source-files).
+# Prevent the 'watcom' directory to end up in 'artifacts'.
+#
+after_test:
+ - cmd: set ZIP_FILE=wsock_trace-%BUILDER%-%CPU%-%APPVEYOR_BUILD_NUMBER%.zip
+ - cmd: cd %APPVEYOR_BUILD_FOLDER%
+ - cmd: if %BUILDER%. == watcom. (echo Removing Watcom tree & rm -fR watcom/* & rmdir watcom)
+ - cmd: 7z a %ZIP_FILE% .\README.md .\wsock_trace .\geoip .\geoip6 .\drop.txt .\dropv6.txt .\edrop.txt src\*.dll src\*.pdb src\*.lib src\*.a src\*.exe src\*.lua > NUL
+
+#
+# Push %ZIP_FILE% as an artifact.
+# (cannot use the ZIP_FILE env-var here!)
+#
+artifacts:
+ - path: wsock_trace-%BUILDER%-%CPU%-%APPVEYOR_BUILD_NUMBER%.zip
+ name: Wsock-Trace
+
+#
+# Run build only if one of the following files is modified on commit
+#
+only_commits:
+ files:
+ - appveyor*
+ - src/*.c
+ - src/*.h
+ - src/Makefile.*
+
+#
+# todo: One day...
+#
+# deploy:
+# Deploying to NuGet feed
+# - provider: NuGet
+# server: https://my.nuget.server/feed
+# api_key:
+# secure: FYWX6NfjZIVw==
+# skip_symbols: false
+# symbol_server: https://your.symbol.server/feed
+# artifact: MyPackage.nupkg
+
+#
+# Deploy to GitHub Releases
+#
+# - provider: GitHub
+# artifact: /.*\.nupkg/ # upload all NuGet packages to release assets
+# draft: false
+# prerelease: false
+# on:
+# branch: master # release from master branch only
+# appveyor_repo_tag: true # deploy on tag push only
diff --git a/appveyor_hosts_content.txt b/appveyor_hosts_content.txt
new file mode 100644
index 00000000..4a7f2d66
--- /dev/null
+++ b/appveyor_hosts_content.txt
@@ -0,0 +1,13 @@
+#
+# This text will generate a 'appveyor-hosts' file.
+# This file was generated from %0.
+#
+127.0.0.1 localhost
+::1 localhost
+127.0.0.1 mpa.one.microsoft.com
+8.8.8.8 google-public-dns-a.google.com
+#
+# This hostname is used in test.exe
+# check that it prints "from 'hosts' file".
+#
+10.0.0.20 www.no-such-host.com
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 00000000..001c6b40
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,24 @@
+#
+# This is a GNU-make Makefile for Wsock-Trace's './doc/wsock_trace.chm'
+#
+LOG_FILE = doxygen.log
+
+DOC_GENERATED = wsock_trace.chm wsock_trace.chw doxygen.log
+OUTPUT_GENERATED = $(addprefix ./output/, \
+ *.css *.html *.js *.png *.map *.md5 index.{hhc,hhk,hhp} )
+
+all: wsock_trace.chm
+
+wsock_trace.chm: Makefile wsock_trace.Doxyfile main_page.dox wsock_trace.css ../src/*.[ch]
+ rm -f output/msc*.png ; \
+ doxygen wsock_trace.Doxyfile > $(LOG_FILE) ; \
+ cd output ; \
+ hhc index.hhp ; \
+ mv -f wsock_trace.chm ..
+ @echo 'Doxygen done. Look in "$(LOG_FILE)" for messages.'
+
+clean:
+ rm -f $(OUTPUT_GENERATED)
+ rm -f $(DOC_GENERATED)
+ - rmdir output
+ @echo '"clean" done.'
diff --git a/doc/README.md b/doc/README.md
new file mode 100644
index 00000000..0130290b
--- /dev/null
+++ b/doc/README.md
@@ -0,0 +1,28 @@
+## Generating documentation
+
+The documentation is generated by **[Doxygen](http://www.doxygen.nl/)**
+via the `Wsock-Trace.Doxyfile` config-file.
+
+Running the command `doxygen Wsock-Trace.Doxyfile`, requires `hhc.exe`.
+This is part of the **[Microsoft HTML Workshop](https://www.microsoft.com/en-us/download/details.aspx?id=21138)**.
+This will generate the compressed HTML-file `wsock_trace.chm` of the generated documentation.
+
+`wsock_trace.chm` can be view by the command `start wsock_trace.chm` (which is normally
+pointing to `"%WINDIR%\hh.exe"`). Or loaded in the excellent
+**[KchmViewer](http://www.ulduzsoft.com/linux/kchmviewer/getting-kchmviewer/)**.
+
+But it's much easier using the GNU `Makefile` directly. Enter this directory
+and issue `make` or `mingw32-make` with one if these targets:
+```
+make all - should produce wsock_trace.chm in this directory.
+make clean - should delete all generated files.
+```
+
+*PS1*. When using the `Index` menu in `"%WINDIR%\hh.exe"`, it will crash!
+ Some issue with how I or Doxygen creates the `output/index.hhk` file?
+ **[KchmViewer](http://www.ulduzsoft.com/linux/kchmviewer/getting-kchmviewer/)** does
+ not exhibit this bug.
+
+*PS2*. This file is written with the aid of the **[Atom](https://atom.io/)**
+ editor and it's **[Markdown-Preview](https://atom.io/packages/markdown-preview)**.
+ A real time-saver.
diff --git a/doc/main_page.dox b/doc/main_page.dox
new file mode 100644
index 00000000..a6afe6f4
--- /dev/null
+++ b/doc/main_page.dox
@@ -0,0 +1,74 @@
+/* Define all the groups here: */
+
+/**
+ *\addtogroup BFD BFD Library
+ *\addtogroup DNSBL Domain Name System Black Lists
+ *\addtogroup Geoip IP-address to location support
+ *\addtogroup inet_util IP-address utilities
+ *\addtogroup Lua Lua script support
+ *\addtogroup Main Wsock-trace core functions
+ *\addtogroup Misc Various support functions
+ */
+
+/**
+
+\mainpage Wsock-trace
+\ingroup Main
+
+\image html screenshot_ahost-msdn-com-win10.png
+
+Introduction
+
+A drop-in tracing library / DLL for most normal Winsock calls.
+It sits between your program and the Winsock library (`ws2_32.dll`).
+It works best for MSVC since the stack-walking code requires the program's
+PDB symbol-file to be present. And unfortunately MinGW/CygWin doesn't produce
+PDB-symbols (GNU-debugger instead relies on the archaic BFD library). So currently,
+the MinGW, CygWin and OpenWatcom targets will only show raw addresses for the traced
+functions.
+
+Options & Features
+
+\li *Colourised trace* of the Winsock calls with function parameters and return
+ values. The colours are configurable.
+
+\li *Runtime caller information*: Using Microsoft's *dbghelp* (or *psapi*) APIs
+ together with the programs *PDB*-file, the filename, line-number of the calling
+ function-name is shown. In the above example, [`WSAStartup()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms742213(v=vs.85).aspx)
+ is called from `ahost.c`, line 67. Which should be 59 bytes into the `main()` function.
+ This should be **[here](https://github.com/c-ares/c-ares/blob/master/ahost.c#L67)**.
+
+\li *Precise Timestamps*: All trace-lines starts with a precise timestamp obtained
+ from [`QueryPerformanceCounter()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx).
+ The timestamp is controlled by `trace_time` in the
+ [`wsock_trace`](https://github.com/gvanem/wsock-trace/blob/master/wsock_trace#L32)
+ config-file.
+
+\li *Extension functions*: Winsock has several Microsoft-specific extension functions
+ (like [`AcceptEx()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms737524.aspx)
+ and [`ConnectEx()`](https://msdn.microsoft.com/en-us/library/windows/desktop/ms737606.aspx)).
+ Wsock-trace is able to trace these too.
+
+\li *IP-Country* information thanks to the **[MaxMind](http://www.maxmind.com)** Lite databases.
+ Thanks to the **[Tor-project](https://gitweb.torproject.org/tor.git/plain/src/config/)**
+ for a simplified CSV version of these MaxMind GeoIP-databases.
+ (using the CSV files [`geoip`](https://github.com/gvanem/wsock-trace/blob/master/wsock_trace#L157)
+ and [`geoip6`](https://github.com/gvanem/wsock-trace/blob/master/wsock_trace#L158)
+ are always enabled).
+
+\li *IP-Location* information from **[IP2Location](https://github.com/chrislim2888/IP2Location-C-Library)**.
+ (this is contolled by `USE_IP2LOCATION = 1` in the makefiles).
+ The above `Mountain View/California` is Google's well-known location.
+ Many thanks to IP2Location [**[3]**](#footnotes) for their data-bases.
+
+\li *Domain Name System-based Blackhole List*
+ (**[DNSBL](https://en.wikipedia.org/wiki/DNSBL)**) support: with the help of
+ DROP-files from the **[Spamhaus](http://www.spamhaus.org/drop/)** project,
+ it can detect IPv4 / IPv6-addresses uses by spammers and cyber-criminals.
+ The more potent Spamhaus **[BGPCC](https://www.spamhaus.org/bgpf/)** is on the *to-do* list.
+
+\li **[LuaJIT]( https://github.com/LuaJIT/LuaJIT.git)** script support is very
+ preliminary at the moment. The idea is that `.lua` scripts could change the
+ behaviour of Wsock-trace at runtime without rebuilding it.
+
+*/
diff --git a/doc/wsock_trace.Doxyfile b/doc/wsock_trace.Doxyfile
new file mode 100644
index 00000000..06b8715d
--- /dev/null
+++ b/doc/wsock_trace.Doxyfile
@@ -0,0 +1,1715 @@
+# Doxyfile 1.8.11
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "Wsock-Trace"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = "0.3.5 - A tracing library for Winsock calls."
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = # "A tracing library for Winsock calls."
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = output
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class " \
+ "The $name widget " \
+ "The $name file " \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH = ../src
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES = eg{1}="\b E.g \b \1: "
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = YES
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = YES
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = YES
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = YES
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if ... \endif and \cond
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text "
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = main_page.dox \
+ ../src/bfd.h \
+ ../src/bfd_gcc.h \
+ ../src/bfd_gcc.c \
+ ../src/common.c \
+ ../src/cpu.c \
+ ../src/dnsbl.c \
+ ../src/dump.c \
+ ../src/firewall.c \
+ ../src/geoip.c \
+ ../src/geoip-gen4.c \
+ ../src/geoip-gen6.c \
+ ../src/geoip-null.c \
+ ../src/hosts.c \
+ ../src/idna.c \
+ ../src/inet_util.c \
+ ../src/init.c \
+ ../src/in_addr.c \
+ ../src/ip2loc.c \
+ ../src/miniz.c \
+ ../src/non-export.c \
+ ../src/overlap.c \
+ ../src/smartlist.c \
+ ../src/stkwalk.c \
+ ../src/test.c \
+ ../src/vm_dump.c \
+ ../src/wsock_trace.c \
+ ../src/wsock_trace_lua.c \
+ ../src/wsock_trace_lwip.c \
+ ../src/common.h \
+ ../src/cpu.h \
+ ../src/dnsbl.h \
+ ../src/dump.h \
+ ../src/firewall.h \
+ ../src/geoip.h \
+ ../src/hosts.h \
+ ../src/idna.h \
+ ../src/inet_util.h \
+ ../src/init.h \
+ ../src/in_addr.h \
+ ../src/overlap.h \
+ ../src/smartlist.h \
+ ../src/stkwalk.h \
+ ../src/vm_dump.h \
+ ../src/wsock_defs.h \
+ ../src/wsock_trace.h \
+ ../src/wsock_trace_lua.h
+
+#
+# This is for including ../README.md and ../screenshot-*.png
+# into wsock_trace.c
+#
+EXAMPLE_PATH = ..
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
+# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
+
+FILE_PATTERNS = *.c *.h *.dox *.md *.png
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE = win_glob2.c win_glob2.h
+
+EXCLUDE_SYMLINKS = YES
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH = ..
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+#
+#
+# where is the value of the INPUT_FILTER tag, and is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE = main_page.dox # README.md
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = .
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET = # ../doc/wsock_trace.css
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET = ../doc/wsock_trace.css
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = YES
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = YES
+SEARCHENGINE = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE = wsock_trace.chm
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH = ../src ../doc
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS = *.h
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED = __DOXYGEN__:=1 NOT_USED:=1 _Printf_format_string_=1 _MSC_VER:=1900 _DEBUG:=1 \
+ WIN32:=1 _WIN32:=1 USE_IP2LOCATION=1 TEST_GEOIP=1 USE_DEF_FILE:=1
+
+SKIP_FUNCTION_MACROS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO # !! YES
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 1000
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = YES
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
+
+# GENERATE_XML = YES
diff --git a/doc/wsock_trace.css b/doc/wsock_trace.css
new file mode 100644
index 00000000..4e9da92f
--- /dev/null
+++ b/doc/wsock_trace.css
@@ -0,0 +1,42 @@
+body {
+ margin-top:1ex; margin-bottom:1ex; margin-left:4ex; color:black;
+ background:white;
+ font-family:"Trebuchet MS",Tahoma,Arial,Verdana,Helvetica,sans-serif;
+}
+
+table ul { margin-bottom:0pt }
+table { border="0" cellspacing="0" cellpadding="0" }
+
+h1, h2, h3, h4, h5, h6, th { color = darkblue }
+
+h1 { border-top:solid 5pt; font-size:200% }
+h2 { margin-top:20pt; margin-left:0ex; font-style:italic; border-top:solid 1pt }
+h3 { margin-top:20pt; font-style:italic; font-size:120% }
+h4 { margin-top:20pt; font-style:italic; font-size:160% }
+code { color: #4665A2; }
+
+td { background:#fffff3 }
+th { text-align:right; font-weight:bold; font-style:italic;
+ vertical-align:top; white-space:nowrap; border-top: solid 1pt
+ }
+
+a:hover { color:black; background:yellow }
+
+.name { text-align: left }
+.pfooter { margin-top:4ex; border-top:thin solid; margin-left=-3ex }
+.pheader { font-style:normal; margin-top:0; margin-left:-3ex; margin-bottom:1pt }
+.stdhead { background:#804080; color:#FFFFBF }
+.sbemu th { border-left:solid 1pt; border-right:solid 1pt; text-align:left }
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FFFF;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 100%;
+}
diff --git a/drop.txt b/drop.txt
new file mode 100644
index 00000000..f3c83e55
--- /dev/null
+++ b/drop.txt
@@ -0,0 +1,944 @@
+; Spamhaus DROP List 2020/09/14 - (c) 2020 The Spamhaus Project
+; https://www.spamhaus.org/drop/drop.txt
+; Last-Modified: Mon, 14 Sep 2020 04:09:51 GMT
+; Expires: Mon, 14 Sep 2020 05:36:45 GMT
+1.10.16.0/20 ; SBL256894
+1.19.0.0/16 ; SBL434604
+1.32.128.0/18 ; SBL286275
+2.58.176.0/23 ; SBL494020
+2.58.178.0/23 ; SBL494021
+2.59.200.0/22 ; SBL463003
+5.134.128.0/19 ; SBL270738
+5.180.4.0/22 ; SBL494577
+5.183.60.0/22 ; SBL463004
+5.188.10.0/23 ; SBL402741
+23.92.80.0/20 ; SBL372561
+24.233.0.0/19 ; SBL210084
+27.126.160.0/20 ; SBL257064
+27.146.0.0/16 ; SBL326434
+31.14.65.0/24 ; SBL493554
+31.14.66.0/23 ; SBL493555
+31.40.164.0/22 ; SBL475938
+36.0.8.0/21 ; SBL225949
+36.37.48.0/20 ; SBL258006
+36.116.0.0/16 ; SBL303895
+36.119.0.0/16 ; SBL303894
+37.156.64.0/23 ; SBL493556
+37.156.173.0/24 ; SBL493557
+37.252.220.0/22 ; SBL461634
+41.77.240.0/21 ; SBL478585
+41.93.128.0/17 ; SBL464277
+42.0.32.0/19 ; SBL265729
+42.1.128.0/17 ; SBL204231
+42.96.0.0/18 ; SBL253878
+42.128.0.0/12 ; SBL262062
+42.160.0.0/12 ; SBL262364
+42.194.128.0/17 ; SBL234290
+42.208.0.0/12 ; SBL283229
+43.229.52.0/22 ; SBL256092
+43.236.0.0/16 ; SBL240624
+43.250.116.0/22 ; SBL240942
+43.252.80.0/22 ; SBL225581
+45.4.128.0/22 ; SBL336186
+45.4.136.0/22 ; SBL336185
+45.6.48.0/22 ; SBL389130
+45.9.156.0/22 ; SBL448779
+45.11.184.0/22 ; SBL475953
+45.11.188.0/22 ; SBL475954
+45.41.0.0/18 ; SBL447379
+45.41.192.0/18 ; SBL447382
+45.43.128.0/18 ; SBL325536
+45.59.128.0/18 ; SBL447383
+45.65.32.0/22 ; SBL462997
+45.65.112.0/22 ; SBL475955
+45.65.120.0/22 ; SBL494578
+45.65.188.0/22 ; SBL389129
+45.80.216.0/22 ; SBL492801
+45.80.248.0/23 ; SBL494022
+45.80.250.0/23 ; SBL494023
+45.86.20.0/22 ; SBL494579
+45.95.40.0/22 ; SBL475957
+45.114.240.0/22 ; SBL456723
+45.117.52.0/22 ; SBL449963
+45.117.208.0/22 ; SBL263886
+45.117.232.0/22 ; SBL456873
+45.121.204.0/22 ; SBL283285
+45.130.100.0/22 ; SBL475958
+45.135.193.0/24 ; SBL482095
+45.147.148.0/22 ; SBL492804
+45.150.108.0/22 ; SBL492809
+45.159.56.0/22 ; SBL475956
+45.220.64.0/18 ; SBL476286
+46.102.177.0/24 ; SBL493558
+46.102.178.0/23 ; SBL493559
+46.102.180.0/24 ; SBL493560
+46.102.182.0/23 ; SBL493561
+46.102.190.0/24 ; SBL493880
+46.174.204.0/22 ; SBL463014
+46.232.192.0/21 ; SBL259017
+49.156.160.0/19 ; SBL169202
+49.238.64.0/18 ; SBL286276
+58.14.0.0/15 ; SBL201384
+58.145.176.0/21 ; SBL135368
+59.153.60.0/22 ; SBL475959
+60.233.0.0/16 ; SBL266791
+61.11.224.0/19 ; SBL221384
+61.45.251.0/24 ; SBL209995
+63.141.34.0/23 ; SBL476632
+63.141.36.0/23 ; SBL476644
+67.213.112.0/20 ; SBL287739
+74.114.148.0/22 ; SBL288405
+77.36.62.0/24 ; SBL493703
+77.81.84.0/23 ; SBL493562
+77.81.86.0/24 ; SBL493581
+77.81.89.0/24 ; SBL493582
+77.81.90.0/23 ; SBL493583
+80.243.128.0/20 ; SBL492816
+83.175.0.0/18 ; SBL241020
+84.238.160.0/22 ; SBL339089
+85.121.39.0/24 ; SBL111502
+85.153.47.0/24 ; SBL493039
+85.209.4.0/22 ; SBL463005
+86.55.40.0/23 ; SBL195122
+86.55.42.0/23 ; SBL195132
+86.104.0.0/23 ; SBL493584
+86.104.2.0/24 ; SBL493585
+86.104.212.0/23 ; SBL493586
+86.104.222.0/23 ; SBL461195
+86.104.224.0/23 ; SBL461196
+86.105.2.0/24 ; SBL493587
+86.105.6.0/24 ; SBL493588
+86.105.176.0/24 ; SBL493589
+86.105.178.0/24 ; SBL493590
+86.105.184.0/23 ; SBL493591
+86.105.186.0/24 ; SBL493881
+86.105.229.0/24 ; SBL493592
+86.105.230.0/24 ; SBL493593
+86.105.242.0/23 ; SBL493594
+86.106.10.0/24 ; SBL493595
+86.106.13.0/24 ; SBL493596
+86.106.14.0/23 ; SBL493597
+86.106.94.0/23 ; SBL493599
+86.106.105.0/24 ; SBL493600
+86.106.106.0/23 ; SBL493601
+86.106.109.0/24 ; SBL493602
+86.106.110.0/23 ; SBL493605
+86.106.114.0/23 ; SBL493606
+86.106.116.0/23 ; SBL493625
+86.106.118.0/24 ; SBL493626
+86.106.138.0/23 ; SBL461197
+86.106.140.0/23 ; SBL461198
+86.106.174.0/23 ; SBL493627
+86.107.72.0/24 ; SBL493628
+86.107.193.0/24 ; SBL493629
+86.107.194.0/23 ; SBL493630
+88.218.40.0/22 ; SBL494580
+88.218.148.0/22 ; SBL463006
+89.32.43.0/24 ; SBL493631
+89.32.170.0/24 ; SBL493632
+89.32.202.0/24 ; SBL493882
+89.33.46.0/23 ; SBL493633
+89.33.116.0/24 ; SBL493634
+89.33.134.0/24 ; SBL493635
+89.33.198.0/23 ; SBL493636
+89.33.200.0/23 ; SBL493637
+89.33.206.0/24 ; SBL493638
+89.33.250.0/23 ; SBL493639
+89.33.254.0/23 ; SBL493640
+89.34.0.0/24 ; SBL493883
+89.34.4.0/24 ; SBL493884
+89.34.102.0/24 ; SBL493641
+89.34.104.0/23 ; SBL493642
+89.35.54.0/24 ; SBL493643
+89.35.89.0/24 ; SBL493647
+89.35.90.0/24 ; SBL461199
+89.36.38.0/23 ; SBL493648
+89.36.136.0/24 ; SBL493649
+89.36.138.0/23 ; SBL493650
+89.36.141.0/24 ; SBL493651
+89.37.92.0/23 ; SBL493652
+89.37.94.0/24 ; SBL493653
+89.37.96.0/24 ; SBL493654
+89.37.129.0/24 ; SBL493655
+89.37.130.0/23 ; SBL493656
+89.37.132.0/23 ; SBL493657
+89.37.134.0/24 ; SBL493659
+89.38.240.0/24 ; SBL493660
+89.39.69.0/24 ; SBL461209
+89.39.212.0/24 ; SBL493662
+89.39.215.0/24 ; SBL493663
+89.39.241.0/24 ; SBL493665
+89.40.138.0/24 ; SBL493885
+89.40.140.0/23 ; SBL493666
+89.40.207.0/24 ; SBL461200
+89.40.209.0/24 ; SBL493667
+89.41.27.0/24 ; SBL493668
+89.41.28.0/23 ; SBL493669
+89.41.49.0/24 ; SBL493670
+89.41.50.0/23 ; SBL463471
+89.41.189.0/24 ; SBL493671
+89.41.190.0/23 ; SBL493672
+89.42.10.0/24 ; SBL493673
+89.42.152.0/23 ; SBL493674
+89.42.154.0/24 ; SBL493675
+89.45.82.0/24 ; SBL493676
+89.46.47.0/24 ; SBL493677
+91.132.164.0/22 ; SBL494323
+91.197.196.0/22 ; SBL406133
+91.200.12.0/22 ; SBL190623
+91.200.133.0/24 ; SBL494045
+91.200.248.0/22 ; SBL83326
+91.218.236.0/22 ; SBL461201
+91.220.163.0/24 ; SBL179440
+91.232.18.0/24 ; SBL494046
+91.235.130.0/23 ; SBL493678
+91.246.176.0/21 ; SBL493704
+91.246.200.0/24 ; SBL493706
+93.114.51.0/24 ; SBL461206
+93.114.52.0/23 ; SBL461207
+93.114.54.0/24 ; SBL461208
+93.114.58.0/23 ; SBL493679
+93.115.59.0/24 ; SBL493680
+93.119.118.0/23 ; SBL493681
+93.119.120.0/23 ; SBL493682
+93.119.124.0/23 ; SBL493683
+93.120.34.0/24 ; SBL493739
+93.120.46.0/24 ; SBL493740
+94.154.32.0/22 ; SBL492822
+101.42.0.0/16 ; SBL434606
+101.134.0.0/15 ; SBL434605
+101.192.0.0/14 ; SBL201382
+101.203.128.0/19 ; SBL257142
+101.248.0.0/15 ; SBL204948
+102.13.240.0/20 ; SBL439868
+102.18.224.0/19 ; SBL440649
+102.28.224.0/19 ; SBL440650
+102.29.224.0/19 ; SBL440651
+102.196.96.0/19 ; SBL441689
+102.211.224.0/19 ; SBL440772
+102.212.224.0/19 ; SBL441843
+102.228.0.0/16 ; SBL434607
+102.232.0.0/16 ; SBL434608
+102.240.0.0/16 ; SBL434609
+103.14.208.0/22 ; SBL320737
+103.16.76.0/24 ; SBL209988
+103.23.8.0/22 ; SBL235784
+103.23.124.0/22 ; SBL402303
+103.24.232.0/22 ; SBL320053
+103.30.12.0/22 ; SBL295418
+103.32.0.0/16 ; SBL434611
+103.32.132.0/22 ; SBL389071
+103.34.0.0/16 ; SBL434612
+103.35.160.0/22 ; SBL327238
+103.36.64.0/22 ; SBL247953
+103.73.172.0/22 ; SBL327240
+103.75.36.0/22 ; SBL322513
+103.76.96.0/22 ; SBL326989
+103.76.128.0/22 ; SBL326990
+103.77.32.0/22 ; SBL327001
+103.99.0.0/22 ; SBL427003
+103.100.168.0/22 ; SBL456874
+103.134.144.0/23 ; SBL475960
+103.135.144.0/24 ; SBL475961
+103.155.224.0/19 ; SBL440654
+103.158.224.0/19 ; SBL441974
+103.167.224.0/19 ; SBL440688
+103.171.224.0/19 ; SBL441977
+103.174.224.0/19 ; SBL440774
+103.180.224.0/19 ; SBL440775
+103.189.224.0/19 ; SBL442337
+103.197.8.0/22 ; SBL332288
+103.197.240.0/22 ; SBL456875
+103.199.88.0/22 ; SBL456876
+103.205.84.0/22 ; SBL282275
+103.207.160.0/22 ; SBL287233
+103.210.244.0/22 ; SBL463000
+103.215.80.0/22 ; SBL337302
+103.223.4.0/22 ; SBL493022
+103.225.72.0/22 ; SBL215767
+103.225.128.0/22 ; SBL215764
+103.226.192.0/22 ; SBL453359
+103.228.60.0/22 ; SBL261012
+103.229.36.0/22 ; SBL221511
+103.230.144.0/22 ; SBL221501
+103.232.136.0/22 ; SBL224778
+103.232.172.0/22 ; SBL226519
+103.236.32.0/22 ; SBL270821
+103.239.28.0/22 ; SBL302348
+103.239.56.0/22 ; SBL456877
+103.243.8.0/22 ; SBL384551
+103.243.124.0/22 ; SBL456879
+104.143.16.0/20 ; SBL463283
+104.153.244.0/22 ; SBL252074
+104.166.96.0/19 ; SBL447336
+104.207.64.0/19 ; SBL447330
+104.233.0.0/18 ; SBL325520
+104.239.0.0/17 ; SBL325523
+104.243.192.0/20 ; SBL325525
+104.247.96.0/19 ; SBL447376
+104.250.192.0/19 ; SBL325529
+104.250.224.0/19 ; SBL447331
+106.95.0.0/16 ; SBL434614
+107.182.112.0/20 ; SBL447332
+107.182.240.0/20 ; SBL390277
+107.190.160.0/20 ; SBL447333
+110.41.0.0/16 ; SBL434615
+111.223.192.0/19 ; SBL78432
+113.212.128.0/19 ; SBL78429
+116.119.0.0/17 ; SBL215707
+116.144.0.0/15 ; SBL178615
+116.146.0.0/15 ; SBL178616
+117.58.0.0/17 ; SBL279124
+117.120.64.0/18 ; SBL303509
+119.58.0.0/16 ; SBL286278
+119.232.0.0/16 ; SBL230571
+120.48.0.0/15 ; SBL262363
+121.46.124.0/22 ; SBL287428
+122.8.0.0/16 ; SBL458178
+122.129.0.0/18 ; SBL221386
+123.136.80.0/20 ; SBL225929
+124.20.0.0/16 ; SBL201390
+124.68.0.0/15 ; SBL211387
+124.157.0.0/18 ; SBL221387
+124.242.0.0/16 ; SBL262407
+125.31.192.0/18 ; SBL233458
+125.58.0.0/18 ; SBL221388
+125.169.0.0/16 ; SBL242253
+128.24.0.0/16 ; SBL388093
+128.85.0.0/16 ; SBL210373
+130.21.0.0/16 ; SBL323571
+130.148.0.0/16 ; SBL257919
+130.196.0.0/16 ; SBL257914
+130.222.0.0/16 ; SBL101196
+131.108.16.0/22 ; SBL276764
+131.143.0.0/16 ; SBL101198
+131.200.0.0/16 ; SBL312492
+132.255.132.0/22 ; SBL249352
+134.18.0.0/16 ; SBL221372
+134.22.0.0/16 ; SBL214750
+134.23.0.0/16 ; SBL101571
+134.33.0.0/16 ; SBL7097
+134.127.0.0/16 ; SBL101572
+134.172.0.0/16 ; SBL101573
+137.19.0.0/16 ; SBL312493
+137.31.0.0/16 ; SBL101324
+137.33.0.0/16 ; SBL303513
+137.55.0.0/16 ; SBL302504
+137.72.0.0/16 ; SBL101329
+137.76.0.0/16 ; SBL205801
+137.105.0.0/16 ; SBL268209
+137.114.0.0/16 ; SBL101325
+137.218.0.0/16 ; SBL278657
+138.31.0.0/16 ; SBL307104
+138.36.92.0/22 ; SBL249351
+138.36.136.0/22 ; SBL296343
+138.52.0.0/16 ; SBL307426
+138.59.4.0/22 ; SBL291137
+138.59.204.0/22 ; SBL286073
+138.94.144.0/22 ; SBL276751
+138.94.216.0/22 ; SBL276765
+138.97.156.0/22 ; SBL286076
+138.122.192.0/22 ; SBL276761
+138.125.0.0/16 ; SBL312494
+138.185.116.0/22 ; SBL492823
+138.186.208.0/22 ; SBL286081
+138.216.0.0/16 ; SBL268207
+138.219.172.0/22 ; SBL286074
+138.249.0.0/16 ; SBL267346
+139.44.0.0/16 ; SBL458175
+139.81.0.0/16 ; SBL444402
+139.188.0.0/16 ; SBL221373
+140.167.0.0/16 ; SBL212527
+141.98.68.0/23 ; SBL494024
+141.98.70.0/23 ; SBL494025
+141.136.22.0/24 ; SBL115039
+141.178.0.0/16 ; SBL268203
+141.253.0.0/16 ; SBL235382
+142.102.0.0/16 ; SBL307428
+143.0.236.0/22 ; SBL286070
+143.49.0.0/16 ; SBL7182
+143.135.0.0/16 ; SBL84946
+143.136.0.0/16 ; SBL458176
+143.253.0.0/16 ; SBL458177
+145.231.0.0/16 ; SBL268204
+146.3.0.0/16 ; SBL220725
+146.51.0.0/16 ; SBL458201
+146.183.0.0/16 ; SBL287250
+146.202.0.0/16 ; SBL419633
+146.252.0.0/16 ; SBL418513
+147.7.0.0/16 ; SBL268216
+147.16.0.0/14 ; SBL302620
+147.78.224.0/22 ; SBL463008
+147.119.0.0/16 ; SBL267344
+148.148.0.0/16 ; SBL312498
+148.154.0.0/16 ; SBL208416
+148.178.0.0/16 ; SBL79700
+148.185.0.0/16 ; SBL272522
+148.248.0.0/16 ; SBL84763
+149.118.0.0/16 ; SBL181786
+149.143.64.0/18 ; SBL181787
+149.207.0.0/16 ; SBL458131
+150.10.0.0/16 ; SBL222568
+150.22.128.0/17 ; SBL235649
+150.25.0.0/16 ; SBL268451
+150.40.0.0/16 ; SBL247797
+150.121.0.0/16 ; SBL258296
+150.129.212.0/22 ; SBL277063
+150.129.228.0/22 ; SBL277064
+150.141.0.0/16 ; SBL79702
+150.242.100.0/22 ; SBL277065
+150.242.120.0/22 ; SBL277066
+150.242.144.0/22 ; SBL277067
+151.212.0.0/16 ; SBL229160
+152.89.228.0/23 ; SBL494026
+152.89.230.0/23 ; SBL494027
+152.109.0.0/16 ; SBL307830
+152.147.0.0/16 ; SBL8847
+153.14.0.0/16 ; SBL220726
+153.52.0.0/14 ; SBL302505
+153.93.0.0/16 ; SBL268208
+154.65.96.0/20 ; SBL476288
+155.11.0.0/16 ; SBL311378
+155.40.0.0/16 ; SBL266803
+155.66.0.0/16 ; SBL267343
+155.71.0.0/16 ; SBL410855
+155.73.0.0/16 ; SBL257918
+155.94.64.0/19 ; SBL425799
+155.94.96.0/20 ; SBL425800
+155.108.0.0/16 ; SBL257917
+155.159.0.0/16 ; SBL457565
+155.235.0.0/16 ; SBL458170
+155.249.0.0/16 ; SBL257915
+156.96.0.0/16 ; SBL461359
+157.115.0.0/16 ; SBL268212
+157.162.0.0/16 ; SBL220085
+157.186.0.0/16 ; SBL186753
+157.195.0.0/16 ; SBL208418
+158.54.0.0/16 ; SBL209870
+158.90.0.0/17 ; SBL224702
+158.249.0.0/16 ; SBL307429
+159.80.0.0/16 ; SBL307427
+159.85.0.0/16 ; SBL210102
+159.151.0.0/16 ; SBL267532
+159.174.0.0/16 ; SBL240976
+159.219.0.0/16 ; SBL254875
+159.229.0.0/16 ; SBL214155
+160.14.0.0/16 ; SBL249299
+160.21.0.0/16 ; SBL267366
+160.115.0.0/16 ; SBL446860
+160.116.0.0/16 ; SBL458209
+160.117.0.0/16 ; SBL316955
+160.121.0.0/16 ; SBL458199
+160.122.0.0/16 ; SBL457567
+160.180.0.0/16 ; SBL272081
+160.184.0.0/16 ; SBL458212
+160.188.0.0/16 ; SBL331922
+160.200.0.0/16 ; SBL227957
+160.235.0.0/16 ; SBL235294
+160.240.0.0/16 ; SBL253946
+160.255.0.0/16 ; SBL247066
+161.0.0.0/19 ; SBL233406
+161.0.68.0/22 ; SBL291136
+161.1.0.0/16 ; SBL390711
+162.208.124.0/22 ; SBL264554
+162.212.188.0/22 ; SBL252073
+162.216.0.0/22 ; SBL390270
+162.216.152.0/21 ; SBL390271
+162.222.128.0/21 ; SBL379822
+163.47.19.0/24 ; SBL209997
+163.50.0.0/16 ; SBL247800
+163.53.247.0/24 ; SBL274861
+163.59.0.0/16 ; SBL233285
+163.127.224.0/19 ; SBL441343
+163.128.224.0/19 ; SBL441345
+163.198.0.0/16 ; SBL458207
+163.216.0.0/19 ; SBL442395
+163.250.0.0/16 ; SBL287443
+163.254.0.0/16 ; SBL242814
+164.6.0.0/16 ; SBL268270
+164.79.0.0/16 ; SBL287439
+164.88.0.0/16 ; SBL458132
+164.137.0.0/16 ; SBL268215
+164.155.0.0/16 ; SBL457563
+165.3.0.0/16 ; SBL457564
+165.25.0.0/16 ; SBL458197
+165.52.0.0/14 ; SBL458173
+165.102.0.0/16 ; SBL229889
+165.205.0.0/16 ; SBL221429
+165.209.0.0/16 ; SBL204517
+166.93.0.0/16 ; SBL470307
+166.117.0.0/16 ; SBL287440
+167.74.0.0/18 ; SBL178647
+167.97.0.0/16 ; SBL12947
+167.103.0.0/16 ; SBL247801
+167.158.0.0/16 ; SBL325621
+167.160.96.0/19 ; SBL217799
+167.162.0.0/16 ; SBL221376
+167.175.0.0/16 ; SBL222563
+167.224.0.0/19 ; SBL106073
+167.249.200.0/22 ; SBL286077
+168.0.212.0/22 ; SBL286078
+168.64.0.0/16 ; SBL287441
+168.80.0.0/15 ; SBL458208
+168.90.96.0/22 ; SBL286828
+168.129.0.0/16 ; SBL195898
+168.151.0.0/22 ; SBL240033
+168.151.4.0/23 ; SBL430375
+168.151.6.0/24 ; SBL430376
+168.151.32.0/21 ; SBL477397
+168.151.43.0/24 ; SBL477402
+168.151.44.0/22 ; SBL477399
+168.151.48.0/22 ; SBL477401
+168.151.52.0/23 ; SBL477400
+168.151.54.0/24 ; SBL477398
+168.151.56.0/21 ; SBL477405
+168.151.64.0/22 ; SBL477404
+168.151.68.0/23 ; SBL477403
+168.151.72.0/21 ; SBL477406
+168.151.80.0/20 ; SBL477408
+168.151.96.0/19 ; SBL477409
+168.151.128.0/20 ; SBL477407
+168.151.145.0/24 ; SBL477412
+168.151.146.0/23 ; SBL477413
+168.151.148.0/22 ; SBL477410
+168.151.152.0/22 ; SBL477411
+168.151.157.0/24 ; SBL477416
+168.151.158.0/23 ; SBL477415
+168.151.160.0/20 ; SBL477417
+168.151.176.0/21 ; SBL477418
+168.151.184.0/22 ; SBL477414
+168.151.192.0/20 ; SBL477388
+168.151.208.0/21 ; SBL477389
+168.151.216.0/22 ; SBL477390
+168.151.220.0/23 ; SBL477391
+168.151.232.0/21 ; SBL477392
+168.151.240.0/21 ; SBL477395
+168.151.248.0/22 ; SBL477393
+168.151.254.0/24 ; SBL477394
+168.181.52.0/22 ; SBL291135
+168.195.76.0/22 ; SBL379851
+168.196.236.0/22 ; SBL405273
+168.196.240.0/22 ; SBL424251
+168.198.0.0/16 ; SBL458174
+168.205.72.0/22 ; SBL424252
+168.206.0.0/16 ; SBL458172
+168.211.0.0/16 ; SBL458200
+168.227.128.0/22 ; SBL424250
+168.227.140.0/22 ; SBL396809
+169.239.152.0/22 ; SBL463216
+170.67.0.0/16 ; SBL8148
+170.83.232.0/22 ; SBL396810
+170.113.0.0/16 ; SBL102573
+170.114.0.0/16 ; SBL182245
+170.120.0.0/16 ; SBL90515
+170.179.0.0/16 ; SBL221379
+170.244.40.0/22 ; SBL336187
+170.244.240.0/22 ; SBL424249
+170.245.40.0/22 ; SBL424253
+170.247.220.0/22 ; SBL379853
+171.25.0.0/17 ; SBL241017
+171.25.212.0/22 ; SBL390709
+171.26.0.0/16 ; SBL268364
+172.98.0.0/18 ; SBL447377
+174.136.192.0/18 ; SBL447378
+175.103.64.0/18 ; SBL221380
+176.56.192.0/19 ; SBL442803
+176.96.88.0/21 ; SBL493741
+176.102.120.0/21 ; SBL493742
+176.103.240.0/21 ; SBL493744
+176.116.232.0/22 ; SBL493745
+176.126.192.0/23 ; SBL493684
+176.126.194.0/24 ; SBL493685
+176.223.116.0/23 ; SBL493686
+176.223.118.0/24 ; SBL493687
+176.223.160.0/23 ; SBL493688
+177.234.136.0/21 ; SBL291134
+178.212.184.0/21 ; SBL493746
+178.213.176.0/22 ; SBL447631
+179.63.0.0/17 ; SBL234494
+180.178.192.0/18 ; SBL240529
+180.236.0.0/14 ; SBL214502
+181.177.64.0/18 ; SBL214239
+184.175.192.0/22 ; SBL425801
+185.0.96.0/19 ; SBL439870
+185.21.8.0/22 ; SBL476630
+185.30.168.0/22 ; SBL448551
+185.39.8.0/22 ; SBL476733
+185.55.4.0/22 ; SBL493747
+185.55.140.0/22 ; SBL493749
+185.60.201.0/24 ; SBL493888
+185.60.202.0/23 ; SBL493887
+185.63.35.0/24 ; SBL492824
+185.64.23.0/24 ; SBL492825
+185.77.248.0/24 ; SBL476631
+185.80.112.0/22 ; SBL493689
+185.102.48.0/22 ; SBL493889
+185.105.56.0/22 ; SBL310725
+185.105.188.0/22 ; SBL493890
+185.110.0.0/22 ; SBL461185
+185.116.172.0/23 ; SBL310726
+185.116.175.0/24 ; SBL310727
+185.120.8.0/22 ; SBL493891
+185.120.16.0/22 ; SBL493892
+185.122.128.0/22 ; SBL310728
+185.123.144.0/20 ; SBL461181
+185.123.248.0/21 ; SBL461182
+185.124.0.0/22 ; SBL461183
+185.124.56.0/21 ; SBL310721
+185.126.68.0/22 ; SBL493893
+185.126.116.0/22 ; SBL493894
+185.126.136.0/22 ; SBL461186
+185.126.148.0/22 ; SBL461187
+185.126.160.0/22 ; SBL461188
+185.126.224.0/22 ; SBL461189
+185.126.236.0/22 ; SBL461190
+185.126.248.0/22 ; SBL461191
+185.127.44.0/22 ; SBL461184
+185.127.56.0/22 ; SBL310729
+185.127.92.0/22 ; SBL461192
+185.129.8.0/22 ; SBL310730
+185.129.208.0/22 ; SBL448437
+185.130.36.0/22 ; SBL310731
+185.130.40.0/22 ; SBL310732
+185.132.8.0/22 ; SBL461193
+185.135.140.0/22 ; SBL405265
+185.144.180.0/22 ; SBL463001
+185.147.140.0/22 ; SBL303516
+185.156.88.0/21 ; SBL333429
+185.156.92.0/22 ; SBL333433
+185.161.148.0/22 ; SBL463010
+185.165.24.0/22 ; SBL391308
+185.175.140.0/22 ; SBL366503
+185.180.192.0/22 ; SBL463011
+185.184.192.0/22 ; SBL340166
+185.185.48.0/22 ; SBL390720
+185.187.236.0/22 ; SBL366504
+185.194.100.0/22 ; SBL448553
+185.203.64.0/22 ; SBL461459
+185.215.132.0/22 ; SBL448554
+185.227.200.0/22 ; SBL382543
+185.230.44.0/22 ; SBL494342
+185.234.64.0/22 ; SBL494343
+185.236.20.0/24 ; SBL492826
+185.237.226.0/23 ; SBL494344
+185.238.176.0/22 ; SBL463012
+185.239.44.0/22 ; SBL493122
+185.242.0.0/22 ; SBL493121
+185.248.132.0/22 ; SBL448290
+186.65.112.0/20 ; SBL264087
+186.179.0.0/18 ; SBL264520
+188.172.160.0/19 ; SBL308891
+188.208.48.0/22 ; SBL461202
+188.208.52.0/22 ; SBL493690
+188.208.109.0/24 ; SBL461210
+188.208.220.0/22 ; SBL493692
+188.209.120.0/21 ; SBL493693
+188.212.254.0/24 ; SBL493694
+188.213.23.0/24 ; SBL493895
+188.213.206.0/23 ; SBL493695
+188.213.214.0/23 ; SBL493696
+188.213.248.0/22 ; SBL461203
+188.213.252.0/22 ; SBL461204
+188.214.94.0/24 ; SBL461205
+188.214.95.0/24 ; SBL493697
+188.214.140.0/24 ; SBL493896
+188.214.155.0/24 ; SBL493897
+188.214.193.0/24 ; SBL493898
+188.241.211.0/24 ; SBL493698
+188.247.230.0/24 ; SBL122292
+190.123.208.0/20 ; SBL276762
+190.185.108.0/22 ; SBL424254
+192.5.103.0/24 ; SBL212979
+192.12.131.0/24 ; SBL226062
+192.22.0.0/16 ; SBL287442
+192.26.25.0/24 ; SBL84941
+192.31.212.0/23 ; SBL84945
+192.40.29.0/24 ; SBL210095
+192.43.160.0/24 ; SBL69618
+192.43.175.0/24 ; SBL84942
+192.43.176.0/21 ; SBL84943
+192.43.184.0/24 ; SBL84944
+192.46.192.0/18 ; SBL303949
+192.54.110.0/24 ; SBL221778
+192.67.16.0/24 ; SBL6648
+192.96.146.0/24 ; SBL461490
+192.101.44.0/24 ; SBL210168
+192.101.181.0/24 ; SBL210187
+192.101.200.0/21 ; SBL97211
+192.101.240.0/21 ; SBL97209
+192.101.248.0/23 ; SBL97208
+192.133.3.0/24 ; SBL221771
+192.152.194.0/24 ; SBL221768
+192.154.11.0/24 ; SBL226063
+192.160.44.0/24 ; SBL9493
+192.161.80.0/20 ; SBL280279
+192.190.49.0/24 ; SBL210175
+192.190.97.0/24 ; SBL223556
+192.195.150.0/24 ; SBL223555
+192.197.87.0/24 ; SBL103493
+192.203.252.0/24 ; SBL223554
+192.206.114.0/24 ; SBL226064
+192.219.120.0/21 ; SBL103494
+192.219.128.0/18 ; SBL103497
+192.219.192.0/20 ; SBL103495
+192.219.208.0/21 ; SBL103496
+192.226.16.0/20 ; SBL245072
+192.229.32.0/19 ; SBL106075
+192.231.66.0/24 ; SBL221765
+192.234.189.0/24 ; SBL221779
+192.245.101.0/24 ; SBL210097
+192.251.231.0/24 ; SBL419281
+193.25.48.0/20 ; SBL211796
+193.30.254.0/23 ; SBL493699
+193.32.66.0/23 ; SBL493700
+193.35.48.0/22 ; SBL475449
+193.46.172.0/22 ; SBL406134
+193.139.0.0/16 ; SBL268277
+193.151.160.0/22 ; SBL494028
+193.201.232.0/22 ; SBL475952
+193.243.0.0/17 ; SBL241018
+193.254.48.0/20 ; SBL493701
+194.5.94.0/23 ; SBL495040
+194.41.60.0/23 ; SBL493702
+195.182.57.0/24 ; SBL88206
+195.210.96.0/19 ; SBL369604
+196.1.109.0/24 ; SBL209998
+196.10.64.0/19 ; SBL458171
+196.15.64.0/18 ; SBL458198
+196.16.0.0/14 ; SBL364590
+196.42.128.0/17 ; SBL247063
+196.61.192.0/20 ; SBL473193
+196.62.0.0/16 ; SBL458232
+196.192.192.0/18 ; SBL458230
+196.193.0.0/16 ; SBL458196
+196.194.0.0/15 ; SBL458210
+196.207.64.0/18 ; SBL458231
+196.246.0.0/16 ; SBL461489
+197.154.0.0/16 ; SBL256082
+197.231.208.0/22 ; SBL476635
+198.13.0.0/20 ; SBL97016
+198.20.16.0/20 ; SBL107773
+198.45.32.0/20 ; SBL110170
+198.45.64.0/19 ; SBL177843
+198.54.232.0/24 ; SBL458233
+198.56.64.0/18 ; SBL178648
+198.57.64.0/20 ; SBL101250
+198.62.70.0/24 ; SBL210101
+198.62.76.0/24 ; SBL210161
+198.96.224.0/20 ; SBL110171
+198.99.117.0/24 ; SBL221773
+198.102.222.0/24 ; SBL221777
+198.148.212.0/24 ; SBL221776
+198.151.16.0/20 ; SBL244694
+198.151.64.0/18 ; SBL156894
+198.151.152.0/22 ; SBL23969
+198.160.205.0/24 ; SBL221774
+198.169.201.0/24 ; SBL212980
+198.177.175.0/24 ; SBL210085
+198.177.176.0/22 ; SBL210086
+198.177.180.0/24 ; SBL210087
+198.177.214.0/24 ; SBL212981
+198.178.64.0/19 ; SBL178649
+198.179.22.0/24 ; SBL217199
+198.181.64.0/19 ; SBL106080
+198.181.96.0/20 ; SBL281608
+198.183.32.0/19 ; SBL96708
+198.184.193.0/24 ; SBL212982
+198.184.208.0/24 ; SBL223553
+198.186.25.0/24 ; SBL23976
+198.187.64.0/18 ; SBL179271
+198.187.192.0/24 ; SBL223552
+198.190.173.0/24 ; SBL212764
+198.199.212.0/24 ; SBL212983
+198.200.0.0/21 ; SBL462737
+198.200.8.0/23 ; SBL462736
+198.202.237.0/24 ; SBL217198
+198.204.0.0/21 ; SBL8179
+198.206.140.0/24 ; SBL301221
+198.212.132.0/24 ; SBL223551
+199.5.152.0/23 ; SBL96745
+199.5.229.0/24 ; SBL221780
+199.26.137.0/24 ; SBL212765
+199.26.207.0/24 ; SBL221772
+199.26.251.0/24 ; SBL221782
+199.33.222.0/24 ; SBL221781
+199.34.128.0/18 ; SBL96704
+199.46.32.0/19 ; SBL96703
+199.48.160.0/21 ; SBL390272
+199.60.102.0/24 ; SBL9159
+199.71.192.0/20 ; SBL147763
+199.84.55.0/24 ; SBL210094
+199.84.56.0/22 ; SBL210092
+199.84.60.0/24 ; SBL210093
+199.84.64.0/19 ; SBL96702
+199.89.16.0/20 ; SBL156916
+199.89.198.0/24 ; SBL212766
+199.120.163.0/24 ; SBL6658
+199.165.32.0/19 ; SBL97023
+199.166.200.0/22 ; SBL6026
+199.184.82.0/24 ; SBL210159
+199.185.192.0/20 ; SBL156981
+199.196.192.0/19 ; SBL106606
+199.198.160.0/20 ; SBL96701
+199.198.176.0/21 ; SBL109341
+199.198.184.0/23 ; SBL109342
+199.198.188.0/22 ; SBL109343
+199.200.64.0/19 ; SBL107014
+199.212.96.0/20 ; SBL156982
+199.223.0.0/20 ; SBL180441
+199.230.64.0/19 ; SBL97024
+199.230.96.0/21 ; SBL97026
+199.233.85.0/24 ; SBL212984
+199.233.96.0/24 ; SBL210099
+199.241.64.0/19 ; SBL301222
+199.244.56.0/21 ; SBL265745
+199.245.138.0/24 ; SBL9923
+199.246.137.0/24 ; SBL113125
+199.246.213.0/24 ; SBL113126
+199.246.215.0/24 ; SBL103499
+199.249.64.0/19 ; SBL179270
+199.253.32.0/20 ; SBL245070
+199.253.48.0/21 ; SBL245071
+199.253.224.0/20 ; SBL180442
+199.254.32.0/20 ; SBL156983
+200.0.60.0/23 ; SBL291133
+200.22.0.0/16 ; SBL84896
+200.71.124.0/22 ; SBL237882
+200.189.44.0/22 ; SBL291132
+200.234.128.0/18 ; SBL439740
+201.148.168.0/22 ; SBL247631
+201.169.0.0/16 ; SBL244233
+202.0.192.0/18 ; SBL209865
+202.20.32.0/19 ; SBL209868
+202.21.64.0/19 ; SBL209869
+202.27.96.0/23 ; SBL270428
+202.27.98.0/24 ; SBL270960
+202.27.99.0/24 ; SBL270961
+202.27.100.0/22 ; SBL271129
+202.27.120.0/22 ; SBL271127
+202.27.161.0/24 ; SBL269891
+202.27.162.0/23 ; SBL269892
+202.27.164.0/22 ; SBL269893
+202.27.168.0/24 ; SBL269894
+202.39.112.0/20 ; SBL237236
+202.40.32.0/19 ; SBL222855
+202.40.64.0/18 ; SBL221383
+202.68.0.0/18 ; SBL197720
+202.86.0.0/22 ; SBL262270
+202.148.32.0/20 ; SBL264045
+202.148.176.0/20 ; SBL264043
+202.183.0.0/19 ; SBL221385
+202.189.80.0/20 ; SBL270956
+203.2.200.0/22 ; SBL247802
+203.9.0.0/19 ; SBL221390
+203.31.88.0/23 ; SBL8083
+203.34.70.0/23 ; SBL9682
+203.86.252.0/22 ; SBL233286
+203.169.0.0/22 ; SBL249298
+203.191.64.0/18 ; SBL258585
+203.195.0.0/18 ; SBL410856
+204.14.80.0/22 ; SBL492818
+204.19.38.0/23 ; SBL210079
+204.44.32.0/20 ; SBL104258
+204.44.224.0/20 ; SBL110044
+204.52.96.0/19 ; SBL325533
+204.52.255.0/24 ; SBL13483
+204.57.16.0/20 ; SBL116417
+204.75.147.0/24 ; SBL223550
+204.75.228.0/24 ; SBL210096
+204.80.198.0/24 ; SBL217200
+204.86.16.0/20 ; SBL181088
+204.87.199.0/24 ; SBL210160
+204.89.224.0/24 ; SBL11667
+204.106.128.0/18 ; SBL105808
+204.106.192.0/19 ; SBL106078
+204.107.208.0/24 ; SBL96699
+204.126.244.0/23 ; SBL96747
+204.128.151.0/24 ; SBL212985
+204.128.180.0/24 ; SBL210100
+204.130.16.0/20 ; SBL301223
+204.130.167.0/24 ; SBL113127
+204.147.64.0/21 ; SBL287254
+204.194.64.0/21 ; SBL249621
+204.225.16.0/20 ; SBL156998
+204.225.159.0/24 ; SBL113128
+204.225.210.0/24 ; SBL113129
+204.232.0.0/18 ; SBL103685
+204.238.137.0/24 ; SBL223547
+204.238.170.0/24 ; SBL217201
+204.238.183.0/24 ; SBL221024
+205.137.0.0/20 ; SBL116418
+205.142.104.0/22 ; SBL98307
+205.144.0.0/20 ; SBL96698
+205.144.176.0/20 ; SBL116419
+205.148.128.0/18 ; SBL277040
+205.148.192.0/18 ; SBL303950
+205.151.128.0/19 ; SBL180437
+205.159.45.0/24 ; SBL209488
+205.159.174.0/24 ; SBL221762
+205.159.180.0/24 ; SBL113130
+205.166.77.0/24 ; SBL219931
+205.166.84.0/24 ; SBL210098
+205.166.130.0/24 ; SBL221342
+205.166.168.0/24 ; SBL223549
+205.166.211.0/24 ; SBL221761
+205.172.244.0/22 ; SBL96743
+205.175.160.0/19 ; SBL104260
+205.189.71.0/24 ; SBL105802
+205.189.72.0/23 ; SBL105804
+205.203.0.0/19 ; SBL104616
+205.203.224.0/19 ; SBL104251
+205.207.134.0/24 ; SBL210088
+205.210.107.0/24 ; SBL210089
+205.210.139.0/24 ; SBL212767
+205.210.171.0/24 ; SBL243632
+205.210.172.0/22 ; SBL243633
+205.214.96.0/19 ; SBL104252
+205.214.128.0/19 ; SBL104253
+205.233.224.0/20 ; SBL156985
+205.236.185.0/24 ; SBL210091
+205.236.189.0/24 ; SBL9442
+205.237.88.0/21 ; SBL286239
+206.41.160.0/19 ; SBL209495
+206.51.29.0/24 ; SBL210090
+206.124.104.0/21 ; SBL325532
+206.130.188.0/24 ; SBL212986
+206.143.128.0/17 ; SBL226353
+206.195.224.0/19 ; SBL180439
+206.197.28.0/24 ; SBL14253
+206.197.29.0/24 ; SBL14251
+206.197.77.0/24 ; SBL221760
+206.197.165.0/24 ; SBL234413
+206.209.80.0/20 ; SBL156986
+206.223.17.0/24 ; SBL338924
+206.224.160.0/19 ; SBL96697
+206.226.0.0/19 ; SBL177387
+206.226.32.0/19 ; SBL177459
+206.227.64.0/18 ; SBL96696
+207.22.192.0/18 ; SBL107317
+207.45.224.0/20 ; SBL89255
+207.90.0.0/18 ; SBL209121
+207.110.64.0/18 ; SBL177484
+207.110.96.0/19 ; SBL177485
+207.110.128.0/18 ; SBL177686
+207.183.192.0/19 ; SBL104254
+208.84.132.0/22 ; SBL390273
+208.93.4.0/22 ; SBL209467
+209.66.128.0/19 ; SBL180438
+209.95.192.0/19 ; SBL107139
+209.99.128.0/18 ; SBL211023
+209.145.0.0/19 ; SBL109583
+209.161.96.0/20 ; SBL463217
+209.182.64.0/19 ; SBL104261
+209.242.192.0/19 ; SBL416162
+212.162.152.0/22 ; SBL494589
+213.173.36.0/22 ; SBL462991
+213.247.0.0/19 ; SBL458234
+216.83.208.0/20 ; SBL390111
+216.179.128.0/17 ; SBL103083
+220.154.0.0/16 ; SBL234221
+221.132.192.0/18 ; SBL233662
+223.0.0.0/15 ; SBL230805
+223.169.0.0/16 ; SBL208009
+223.173.0.0/16 ; SBL204954
+223.254.0.0/16 ; SBL212803
diff --git a/dropv6.txt b/dropv6.txt
new file mode 100644
index 00000000..ee46420d
--- /dev/null
+++ b/dropv6.txt
@@ -0,0 +1,39 @@
+; Spamhaus IPv6 DROP List 2020/09/14 - (c) 2020 The Spamhaus Project
+; https://www.spamhaus.org/drop/dropv6.txt
+; Last-Modified: Mon, 07 Sep 2020 04:03:47 GMT
+; Expires: Mon, 14 Sep 2020 12:46:32 GMT
+2a09:ac80::/29 ; SBL494347
+2a0d:e7c7:ffff::/48 ; SBL494346
+2a0b:4ec0::/29 ; SBL494345
+2a0a:ed80::/29 ; SBL336327
+2607:d100::/32 ; SBL347495
+2401:c580::/32 ; SBL246818
+2803:5380:ffff::/48 ; SBL262056
+2a0a:a840::/29 ; SBL354872
+2602:ffa0::/36 ; SBL262027
+2a07:5780::/29 ; SBL303524
+2a06:d240::/29 ; SBL303521
+2a06:e480::/29 ; SBL301771
+2607:f2d0::/32 ; SBL287940
+2405:e880::/32 ; SBL327648
+2a0a:c00::/29 ; SBL311394
+2a06:4740::/29 ; SBL296867
+2a06:57c0::/30 ; SBL290686
+2a0a:36c0::/29 ; SBL341852
+2a0b:ae80::/29 ; SBL339822
+2a0b:3e80::/29 ; SBL340167
+2a0a:6240::/29 ; SBL353065
+2a07:9b80::/29 ; SBL342980
+2a07:7700::/29 ; SBL342975
+2a0b:f500::/29 ; SBL366505
+2a0c:c600::/32 ; SBL382543
+2a0b:d900::/29 ; SBL390720
+2a00:4c80::/29 ; SBL303520
+2a07:b300::/29 ; SBL335961
+2a0c:dd80::/29 ; SBL405265
+2803:8700::/32 ; SBL389795
+2402:6680::/32 ; SBL310886
+2a07:4180::/29 ; SBL463002
+2a00:55a0::/32 ; SBL476289
+2405:b480::/32 ; SBL341597
+2405:b180::/32 ; SBL312915
diff --git a/edrop.txt b/edrop.txt
new file mode 100644
index 00000000..2f365a22
--- /dev/null
+++ b/edrop.txt
@@ -0,0 +1,82 @@
+; Spamhaus EDROP List 2020/09/13 - (c) 2020 The Spamhaus Project
+; https://www.spamhaus.org/drop/edrop.txt
+; Last-Modified: Fri, 11 Sep 2020 08:37:20 GMT
+; Expires: Mon, 14 Sep 2020 14:00:36 GMT
+5.188.11.0/24 ; SBL402809
+27.112.32.0/19 ; SBL237955
+31.184.237.0/24 ; SBL419884
+37.9.42.0/24 ; SBL394633
+38.39.160.0/20 ; SBL460585
+42.140.0.0/17 ; SBL253830
+43.57.0.0/16 ; SBL271294
+43.181.0.0/16 ; SBL271295
+45.9.148.0/22 ; SBL494572
+45.190.220.0/24 ; SBL487277
+46.148.112.0/24 ; SBL394634
+46.148.120.0/24 ; SBL394635
+46.148.127.0/24 ; SBL394636
+58.2.0.0/17 ; SBL249532
+59.254.0.0/15 ; SBL230802
+62.112.16.0/21 ; SBL237227
+79.110.22.0/24 ; SBL394646
+91.193.75.0/24 ; SBL442782
+91.200.81.0/24 ; SBL394648
+91.200.82.0/24 ; SBL394649
+91.200.83.0/24 ; SBL394650
+91.200.164.0/24 ; SBL394651
+91.216.3.0/24 ; SBL394652
+91.243.90.0/24 ; SBL394653
+91.243.91.0/24 ; SBL394654
+91.243.93.0/24 ; SBL394655
+113.201.51.0/24 ; SBL378148
+116.79.0.0/16 ; SBL234552
+119.227.224.0/19 ; SBL237235
+120.46.0.0/15 ; SBL262362
+120.64.0.0/16 ; SBL253581
+120.67.0.0/16 ; SBL247795
+120.128.128.0/17 ; SBL266080
+120.128.192.0/18 ; SBL253828
+120.129.0.0/17 ; SBL251953
+120.129.128.0/17 ; SBL251954
+120.130.0.0/16 ; SBL253827
+120.130.128.0/18 ; SBL253829
+125.119.32.0/22 ; SBL464478
+153.85.0.0/16 ; SBL258301
+176.119.4.0/24 ; SBL423676
+176.119.7.0/24 ; SBL423677
+178.159.97.0/24 ; SBL394681
+178.159.100.0/24 ; SBL419882
+178.159.107.0/24 ; SBL419883
+185.14.192.0/24 ; SBL394686
+185.14.193.0/24 ; SBL394687
+185.14.195.0/24 ; SBL394688
+185.71.0.0/22 ; SBL394689
+185.140.53.0/24 ; SBL481094
+185.143.220.0/24 ; SBL420773
+185.143.222.0/24 ; SBL420775
+185.143.223.0/24 ; SBL420772
+185.165.153.0/24 ; SBL464370
+185.176.27.0/24 ; SBL494013
+185.195.188.0/22 ; SBL391309
+185.244.29.0/24 ; SBL482965
+185.244.30.0/24 ; SBL464770
+185.244.31.0/24 ; SBL446735
+193.32.163.0/24 ; SBL438244
+194.5.97.0/24 ; SBL442791
+194.5.98.0/24 ; SBL434331
+194.5.99.0/24 ; SBL464247
+196.45.120.0/21 ; SBL458211
+196.196.8.0/22 ; SBL207820
+197.242.100.0/22 ; SBL174938
+197.242.104.0/21 ; SBL174939
+197.242.112.0/23 ; SBL174940
+203.156.197.0/24 ; SBL315954
+204.2.189.0/24 ; SBL441964
+208.12.64.0/19 ; SBL201196
+210.57.128.0/18 ; SBL233459
+210.57.192.0/20 ; SBL237213
+212.95.144.0/22 ; SBL198435
+213.130.88.0/22 ; SBL391310
+213.176.20.0/22 ; SBL462672
+217.8.116.0/22 ; SBL482777
+217.8.117.0/24 ; SBL485640
diff --git a/screenshot-openvpn-tmb.jpg b/screenshot-openvpn-tmb.jpg
new file mode 100644
index 00000000..9a4f1ee8
Binary files /dev/null and b/screenshot-openvpn-tmb.jpg differ
diff --git a/screenshot-openvpn.png b/screenshot-openvpn.png
new file mode 100644
index 00000000..704643e9
Binary files /dev/null and b/screenshot-openvpn.png differ
diff --git a/screenshot_ahost-msdn-com-win10.jpg b/screenshot_ahost-msdn-com-win10.jpg
new file mode 100644
index 00000000..f188894a
Binary files /dev/null and b/screenshot_ahost-msdn-com-win10.jpg differ
diff --git a/screenshot_ahost-msdn-com-win10.png b/screenshot_ahost-msdn-com-win10.png
new file mode 100644
index 00000000..81470d06
Binary files /dev/null and b/screenshot_ahost-msdn-com-win10.png differ
diff --git a/screenshot_ahost-msdn-com.png b/screenshot_ahost-msdn-com.png
new file mode 100644
index 00000000..a3af8fa8
Binary files /dev/null and b/screenshot_ahost-msdn-com.png differ
diff --git a/screenshot_firewall_test_DNSBL.png b/screenshot_firewall_test_DNSBL.png
new file mode 100644
index 00000000..76273ffe
Binary files /dev/null and b/screenshot_firewall_test_DNSBL.png differ
diff --git a/wsock_trace b/wsock_trace
new file mode 100644
index 00000000..94c93d30
--- /dev/null
+++ b/wsock_trace
@@ -0,0 +1,249 @@
+#
+# WSock_trace config file.
+#
+# When wsock_trace.dll starts, it will try to open and read the
+# 'Wsock_trace' file from these places in this order:
+# - The file pointed to by %WSOCK_TRACE%.
+# - The current directory.
+# - The '%HOME' directory.
+# - Then finally the '%APPDATA' directory.
+#
+# The keywords here are not case sensitive.
+# All values (also not case-sensitive) can contain an environment
+# variable (at most one).
+# E.g. 'trace_level = %WSOCK_TRACE_LEVEL%'.
+#
+[core]
+ trace_level = 1 # The level of trace to give; higher value gives more details
+ trace_indent = 2 # The number of spaces to indent e.g. ' * test.c(45)'.
+ trace_caller = 1 ; ditto comment
+ trace_report = 1 # print a final trace report at program exit.
+ # trace_max_len = 100 # wrap lines at column 100 when printing to file or when stdout is redirected.
+ # # When printing to the console, we wrap and indent text according to screen width.
+
+ trace_binmode = 1 # Write output-file in binary mode.
+
+ # trace_file = %TEMP%\wstrace.txt # file to trace to. If left unused, print to 'stdout'.
+ # Use "stderr" for stderr.
+ # Use "$ODS" to print using 'OutputDebugString()' and
+ # use dbgview to see the traces (no colours).
+
+ trace_time = relative # Print timestamps at each trace-line. One of these:
+ # "absolute" for current-time.
+ # "relative" for msec since program started.
+ # "delta" for msec since previous trace-line.
+ # "none" for no timestamps
+
+ dump_modules = 0 # Dump information on all process modules.
+ pdb_report = 1 # Report PDB-symbols information found in all modules.
+ use_sema = 0
+
+ #
+ # For tracing of overlapped transfers in some WSA* functions:
+ # If 'trace_overlap >= 1' and 'trace_level >= trace_overlap'
+ # the overlapped operation will be traced.
+ #
+ trace_overlap = 2
+
+ #
+ # Hook and trace Winsock extensions functions.
+ # The call 'WSAIoctl (s, SIO_GET_EXTENSION_FUNCTION_POINTER, ...)' is the interface
+ # to these extension functions. If 'hook_extensions = 1', a hook-function for each
+ # Winsock extension is set. Thus allowing a trace of these.
+ # Ref: wsock_hooks.c for details.
+ #
+ hook_extensions = 0
+
+ hosts_file = %WINDIR%\system32\drivers\etc\hosts # The standard location of the 'hosts' file.
+ # Change to suite.
+ #
+ # For testing too fast programs:
+ # delay all receive, transmit, select() and WSAPoll() calls the
+ # specified number of milli-seconds.
+ #
+ # Note: The delay happens even if 'trace_level = 0'.
+ #
+ recv_delay = 0 # For recv(), recvfrom(), WSARecv(), WSARecvEx(), WSARecvFrom() and WSARecvDisconnect()
+ send_delay = 0 # For send(), sendto(), WSASend() and WSASendTo()
+ select_delay = 0 # For select()
+ poll_delay = 0 # For WSAPoll()
+
+ pcap_enable = 0
+ pcap_dump = %TEMP%\wstrace.pcap
+
+ callee_level = 1 # How many stack-frames to unwind and show callers
+ cpp_demangle = 1
+ short_errors = 1
+ use_full_path = 1 # Report with full file-names in traces.
+ use_toolhlp32 = 1
+ use_ole32 = 0 # Decode and print GUIDs using internal functions
+ start_new_line = 0 # Always start tracing on column 1.
+ show_caller = 0 # Internal: show file/line where TRACE() was called.
+
+ compact = 0 # Compact or detailed dump (not yet).
+ dump_select = 1 # Dump the 'fd_set's in select(). Do it before and after select() modifies them.
+ dump_hostent = 1 # Dump the 'hostent' structure returned in gethostbyname() and gethostbyaddr().
+ dump_protoent = 1 # Dump the 'protoent' structure returned in getprotobynumber() and getprotobyname().
+ dump_servent = 1 # Dump the 'servent' structure returned in getservbyport() and getservbyname().
+ dump_nameinfo = 1 # Dump the data returned from getnameinfo().
+
+ dump_wsaprotocol_info = 1 # Dump the WSAPROTOCOL_INFO[A|W] structure in e.g. WSASocketA() and WSADuplicateSocketA().
+ dump_wsanetwork_events = 1 # Dump the WSAEVENT array from WSAEnumNetworkEvents().
+
+ dump_data = 1 # Dump data in recv(), recvfrom(), send() and sendto().
+ max_data = 5000 # but not more than 'max_data'.
+ max_displacement = 100 # maximum distance for a public symbol to accept in SymGetLineFromAddr64()
+ max_fd_sets = 500 # Max number of 'fd_set' (i.e. sockets) to print in and out of 'select()'
+
+ msvc_only = 0 # Trace only MSVC programs using the wsock_trace.dll
+ mingw_only = 0 # Trace only MinGW programs using the wsock_trace_mw.dll
+ cygwin_only = 0 # Trace only Cygwin programs using the wsock_trace_cyg.dll
+
+ color_time = bright red # Color of time-stamp. E.g. '* 125.654 msec:'
+ color_file = bright white # Color of file/line. E.g.: ' sendf.c(319)'
+ color_func = bright cyan # Color of 1st traced line. E.g.: '(Curl_recv_plain+37):'
+ color_trace = bright yellow # Color of traced function. E.g.: 'recv (1492, 0x00B74604, 16384, 0) --> 11533 bytes.'
+ color_data = bright green # Color of extra traced stuff.
+
+ #
+ # Don't trace these functions:
+ #
+ exclude = htons
+ exclude = htonl
+ exclude = ntohs
+ exclude = ntohl
+ # exclude = WSASetLastError
+ # exclude = WSAGetLastError
+
+ exclude = inet_addr
+ exclude = FD_ISSET
+ # exclude = __WSAFDIsSet
+
+ #
+ # Or don't trace these functions in these programs (not effective yet):
+ #
+ # exclude = libcurl*.dll!select
+ # exclude = curl.exe!inet_addr
+ # exclude = wget!WSAStartup
+ # exclude = nmap!getaddrinfo
+
+ #
+ # Use WinHTTP.dll to download the below files.
+ # If 0, use WinInet.dll instead.
+ #
+ use_winhttp = 0
+
+#
+# Experimental:
+# Lua-scripts for init and exit.
+#
+[lua]
+ enable = 1
+ trace_level = 1 # The level for LUA_TRACE().
+
+ #
+ # The colors used in LUA_TRACE() and LUA_WARNING():
+ #
+ color_head = bright magenta # color of the start. E.g. "wsock_trace_lua.c(238):"
+ color_body = bright white # color of the body. E.g. "func_sig: 'WSACleanup()'"
+
+ lua_init = %APPDATA%\wsock_trace_init.lua
+ lua_exit = %APPDATA%\wsock_trace_exit.lua
+
+#
+# GeoIP settings.
+#
+[geoip]
+ enable = 1
+ use_generated = 0 # use IPV4/IP6 records from pre-generated records only
+ max_days = 10 # max allowed days old before forcing an update
+
+ geoip4_file = %APPDATA%\geoip
+ geoip6_file = %APPDATA%\geoip6
+
+ geoip4_url = https://gitweb.torproject.org/tor.git/plain/src/config/geoip
+ geoip6_url = https://gitweb.torproject.org/tor.git/plain/src/config/geoip6
+
+ #
+ # The address of (a local) proxy-host to fetch the above URLs from.
+ # If not set, retrieve directly.
+ #
+ proxy =
+
+ #
+ # IP2Location settings.
+ #
+ # To enable retrieving locations for both IPv4 and IPv6 addresses, download
+ # and use a file named like IP2LOCATION-LITE-DBx.IPV6.BIN.
+ # This files contains both IPv4 and IPv6 records.
+ #
+ # Ref. https://github.com/chrislim2888/IP2Location-C-Library
+ # http://lite.ip2location.com
+ #
+ ip2location_bin_file = %APPDATA%\IP2LOCATION-LITE-DB11.IPV6.BIN
+
+#
+# IDNA settings. Internationalizing Domain Names in Applications.
+#
+[idna]
+ enable = 1
+ winidn = 0
+ codepage = 0
+
+#
+# DNSBL (Domain Name System Blacklists) settings
+#
+[DNSBL]
+ enable = 0
+ test = 0
+ max_days = 10 # max allowed age before forcing an update
+ drop_file = %APPDATA%\drop.txt
+ edrop_file = %APPDATA%\edrop.txt
+ dropv6_file = %APPDATA%\dropv6.txt
+
+ drop_url = http://www.spamhaus.org/drop/drop.txt
+ edrop_url = http://www.spamhaus.org/drop/edrop.txt
+ dropv6_url = http://www.spamhaus.org/drop/dropv6.txt
+
+#
+# Settings for Windows' "Internet Connection Firewall" (ICF)
+# event handling.
+#
+[firewall]
+ enable = 0 # Enable tracing of firewall events
+ show_ipv4 = 1 # Show IPv4 events?
+ show_ipv6 = 0 # Show IPv6 events?
+ show_all = 0 # Show events for other programs besides "our" program?
+ api_level = 3 # Which API level to use in 'fw_monitor_subscribe()'.
+
+ #
+ # For firewall_test.exe only.
+ # Show statistics on the Console title bar.
+ #
+ console_title = 1
+
+ #
+ # Don't report event for these programs:
+ #
+ exclude = svchost.exe, System
+
+ #
+ # Don't report event for these source / destination addresses:
+ #
+ exclude = 239.255.255.250 # SSDP protocol from svchost.exe
+ exclude = 224.0.0.251 # IGMP protocol from System
+ exclude = 224.0.0.252 # IGMP protocol from System
+
+ #
+ # Enable a beeping sound for a firewall event.
+ # This requires '[firewall:enable = 1]'.
+ #
+ # Format is frequency, period; "Hertz, milli-seconds".
+ # Frequeny is bounded range 0 - 10000.
+ # Period is bounded in range 0 - 1000.
+ #
+ sound.enable = 1
+ sound.beep.event_drop = 1000, 40
+ sound.beep.event_allow = 800, 20
+ sound.beep.event_DNSBL = 1200, 50
+