0.9.10
   - Overall changes:
     * Moved the whole project from sourceforge to https://libvnc.github.io/.
     * Cleaned out the autotools build system which now uses autoreconf.
     * Updated noVNC HTML5 client to latest version.
     * Split out x11vnc sources into separate repository at
       https://github.com/LibVNC/x11vnc
     * Split out vncterm sources into separate repository at
       https://github.com/LibVNC/vncterm
     * Split out VisualNaCro sources into separate repository at
       https://github.com/LibVNC/VisualNaCro
     * Merged Debian patches.

   - LibVNCServer/LibVNCClient:
     * Fixed some security-related buffer overflow cases.
     * Added compatibility headers to make LibVNCServer/LibVNCClient build on native
       Windows 8.
     * Update LZO to version 2.07, fixing CVE-2014-4607.

   - LibVNCServer:
     * Merged patches from KDE/krfb.
     * Can now do IPv6 without IPv4.
     * Fixed a use-after-free issue in scale.c.

0.9.9
   - Overall changes:
     * Added noVNC HTML5 VNC viewer (http://kanaka.github.com/noVNC/) connect possibility
       to our http server. Pure JavaScript, no Java plugin required anymore! (But a
       recent browser...)
     * Added a GTK+ VNC viewer example.

   - LibVNCServer/LibVNCClient:
     * Added support to build for Google Android.
     * Complete IPv6 support in both LibVNCServer and LibVNCClient.

   - LibVNCServer:
     * Split two event-loop related functions out of the rfbProcessEvents() mechanism.
       This is required to be able to do proper event loop integration with Qt. Idea was
       taken from Vino's libvncserver fork.
     * Added TightPNG (http://wiki.qemu.org/VNC_Tight_PNG) encoding support. Like the
       original Tight encoding, this still uses JPEG, but ZLIB encoded rects are encoded
       with PNG here.
     * Added suport for serving VNC sessions through WebSockets
       (http://en.wikipedia.org/wiki/WebSocket), a web technology providing for multiplexing
       bi-directional, full-duplex communications channels over a single TCP connection.
     * Support connections from the Mac OS X built-in VNC client to LibVNCServer
       instances running with no password.
     * Replaced the Tight encoder with a TurboVNC one which is tremendously faster in most
       cases, especially with high-color video or 3D workloads.
       (http://www.virtualgl.org/pmwiki/uploads/About/tighttoturbo.pdf)

   - LibVNCClient:
     * Added support to only listen for reverse connections on a specific IP address.
     * Support for using OpenSSL instead of GnuTLS. This could come in handy on embedded
       devices where only this TLS implementation is available.
     * Added support to connect to UltraVNC Single Click servers.

0.9.8.2
   - Fixed a regression that crept in with the Apple Remote Desktop support.

0.9.8.1
   - Fixed an ABI compatibility issue.

0.9.8
   - Overall changes:
     * Automagically generated API documentation using doxygen.
     * Added support for pkg-config.
     * Fixed Mingw32 cross compilation.
     * Fixed CMake build system.

   - LibVNCServer/LibVNCClient:
     * All files used by _both_ LibVNCServer and LibVNCClient were put into
       a 'common' directory, reducing code duplication.
     * Implemented xvp VNC extension.
     * Updated minilzo library used for Ultra encoding to ver 2.04.
       According to the minilzo README, this brings a significant
       speedup on 64-bit architechtures.

   - LibVNCServer:
     * Thread safety for ZRLE, Zlib, Tight, RRE, CoRRE and Ultra encodings.
       This makes all VNC encodings safe to use with a multithreaded server.
     * A DisplayFinishedHook for LibVNCServer. If set, this hook gets called
       just before rfbSendFrameBufferUpdate() returns.
     * Fix for tight security type for RFB 3.8 in TightVNC file transfer
       (Debian Bug #517422).

   - LibVNCClient:
     * Unix sockets support.
     * Anonymous TLS security type support.
     * VeNCrypt security type support.
     * MSLogon security type support.
     * ARD (Apple Remote Desktop) security type support.
     * UltraVNC Repeater support.
     * A new FinishedFrameBufferUpdate callback that is invoked after each
       complete framebuffer update.
     * A new non-forking listen (reverse VNC) function that works under
       Windows.
     * IPv6 support. LibVNCClient is now able to connect to IPv6 VNC servers.
     * IP QoS support. This enables setting the DSCP/Traffic Class field of
       IP/IPv6 packets sent by a client. For example starting a client with
       -qosdscp 184 marks all outgoing traffic for expedited forwarding.
       Implementation for Win32 is still a TODO, though.
     * Fixed hostname resolution problems under Windows.

   - SDLvncviewer
     * Is now resizable and can do key repeat, mouse wheel scrolling
       and clipboard copy and paste.

   - LinuxVNC:
     * Fix for no input possible because of ctrl key being stuck.
       Issue was reported as Debian bug #555988.


0.9.7
   Mark sent me patches to no longer need C++ for ZRLE encoding!
   added --disable-cxx Option for configure
   x11vnc changes from Karl Runge:
      - Changed all those whimpy printf(...)'s into manly fprintf(stdxxx,...)'s.

      - Added -q switch (quiet) to suppress printing all the debug-looking output.

      - Added -bg switch to fork into background after everything is set up.
        (checks for LIBVNCSERVER_HAVE_FORK and LIBVNCSERVER_HAVE_SETSID)

      - Print this string out to stdout:  'PORT=XXXX' (usually XXXX = 5900).
        Combining with -bg, easy to write a ssh/rsh wrapper with something like:
        port=`ssh $host "x11vnc -bg .."` then run vncviewer based on $port output.
        (tunneling the vnc traffic thru ssh a bit more messy, but doable)

      - Quite a bit of code to be more careful when doing 8bpp indexed color, e.g.
        not assuming NCOLORS is 256, handling 8bit TrueColor and Direct Color, etc
        (I did all this probably in April, not quite clear in my mind now, but
        I did test it out a fair amount on my old Sparcstation 20 wrt a user's
        questions).
   introduce rfbErr for Errors (Erik)
   make rfbLog overridable (suggested by Erik)
   don't reutrn on EINTR in WriteExact()/ReadExact() (suggested by Erik)
   use AX_PREFIX_CONFIG_H to prefix constants in config.h to avoid
	name clashes (also suggested by Erik)
   transformed Bool, KeySym, Pixel to rfbBool, rfbKeySym, rfbPixel
	(as suggested by Erik)
   purged exit() calls (suggested by Erik)
   fixed bug with maxRectsPerUpdate and Tight Encoding (these are incompatible)
   checked sync with TightVNC 1.2.8:
	viewonly/full passwords; if given a list, only the first is a full one
	vncRandomBytes is a little more secure now
	new weights for tight encoding
   checked sync with RealVNC 3.3.7
	introduced maxRectsPerUpdate
   added first alpha version of LibVNCClient
   added simple and simple15 example (really simple examples)
   finally got around to fix configure in CVS
   long standing http bug (.jar was sent twice) fixed by a friend of Karl named Mike
   http options in cargs
   when closing a client and no longer listening for new ones, don't crash
   fixed a bug with ClientConnectionGone
   endianness is checked at configure time
   fixed a bug that prevented the first client from being closed
   fixed that annoying "libvncserver-config --link" bug
   make rfbReverseByte public (for rdp2vnc)
   fixed compilation on OS X, IRIX, Solaris
   install target for headers is now ${prefix}/include/rfb ("#include <rfb/rfb.h>")
   renamed "sraRegion.h" to "rfbregion.h"
   CARD{8,16,32} are more standard uint{8,16,32}_t now
   fixed LinuxVNC colour handling
   fixed a bug with pthreads where the connection was not closed
   moved vncterm to main package (LinuxVNC included)
   portability fixes (IRIX, OSX, Solaris)
   more portable way to determine endianness and types of a given size
	through autoconf based methods
0.5
   rpm packaging through autoconf
   autoconf'ed the whole package (including optional support for zlib,
	pthreads and libjpeg as well as zrle/c++)
   moved appropriate files to contrib/ and examples/ respectively
   fixed long standing cargs bug (Justin "Zippy" Dearing)
   Even better x11vnc from Karl J. Runge! (supports different kbd layouts of
	client/server)
   Better x11vnc from Karl J. Runge!
   fixed severe bug (Const Kaplinsky)
   got patch from Const Kaplisnky with CursorPosUpdate encoding and some Docs
   sync'ed with newest RealVNC (ZRLE encoding)
   a HTTP request for tunnelling was added (to fool strict web proxies)
   sync'ed with TightVNC 1.2.5
0.4
   support for NewFB from Const Kaplinsky
   memory leaks squashed (localtime pseudo leak is still there :-)
   small improvements for OSXvnc (still not working correctly)
   synced with TightVNC 1.2.3
   solaris compile cleanups
   many x11vnc improvements
   added backchannel, an encoding which needs special clients to pass
	arbitrary data to the client
   changes from Tim Jansen regarding multi threading and client blocking
	as well as C++ compliancy
   x11vnc can be controlled by starting again with special options if compiling
	with LOCAL_CONTROL defined
0.3
   added x11vnc, a x0rfbserver clone
   regard deferUpdateTime in processEvents, if usec<0
   initialize deferUpdateTime (memory "leak"!)
   changed command line handling (arguments are parsed and then removed)
   added very simple example: zippy
   added rfbDrawLine, rfbDrawPixel
0.2
   inserted a deferUpdate mechanism (X11 independent).
   removed deletion of requestedRegion
   added rfbLoadConsoleFont
   fixed font colour handling.
   added rfbSelectBox
   added rfbDrawCharWithClip to allow for clipping and a background colour.
   fixed font colours
   added rfbFillRect
   added IO function to check password.
   rfbNewClient now sets the socket in the fd_set (for the select() call)
   when compiling the library with HAVE_PTHREADS and an application
	which includes "rfb.h" without, the structures got mixed up.
	So, the pthreads section is now always at the end, and also
	you get a linker error for rfbInitServer when using two different
	pthread setups.
   fixed two deadlocks: when setting a cursor and when using CopyRect
   fixed CopyRect when copying modified regions (they lost the modified
	 property)
   WIN32 target compiles and works for example :-)
   fixed CopyRect (was using the wrong order of rectangles...)
   	 should also work with pthreads, because copyrects are
	 always sent immediately (so that two consecutive copy rects
	 cannot conflict).
   changed rfbUndrawCursor(rfbClientPtr) to (rfbScreenInfoPtr), because
   	   this makes more sense!
   flag backgroundLoop in rfbScreenInfo (if having pthreads)
   CopyRect & CopyRegion were implemented.
	if you use a rfbDoCopyR* function, it copies the data in the
	framebuffer. If you prefer to do that yourself, use rfbScheduleCopyR*
	instead; this doesn't modify the frameBuffer.
   added flag to optionally not send XCursor updates, but only RichCursor,
	or if that is not possible, fall back to server side cursor.
	This is useful if your cursor has many nice colours.
   fixed java viewer on server side:
	SendCursorUpdate would send data even before the client pixel format
	was set, but the java applet doesn't like the server's format.
   fixed two pthread issues:
	rfbSendFramebuffer was sent by a ProcessClientMessage function
	(unprotected by updateMutex).
	cursor coordinates were set without protection by cursorMutex
   source is now equivalent to TridiaVNC 1.2.1
   pthreads now work (use iterators!)
   cursors are supported (rfbSetCursor automatically undraws cursor)
   support for 3 bytes/pixel (slow!)
   server side colourmap support
   fixed rfbCloseClient not to close the connection (pthreads!)
	this is done lazily (and with proper signalling).
   cleaned up mac.c (from original OSXvnc); now compiles (untested!)
   compiles cleanly on Linux, IRIX, BSD, Apple (Darwin)
   fixed prototypes
0.1
   rewrote API to use pseudo-methods instead of required functions.
   lots of clean up.
   Example can show symbols now.
   All encodings
   HTTP
